日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java-ZZH1-78面试题

發(fā)布時間:2023/12/8 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-ZZH1-78面试题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ZZH 1-78

hollerJAVA總結(jié)
目錄
總結(jié) 1
1.JDK 1
1、 JAVA開發(fā)工具(jdk\bin) 1
2、 基礎(chǔ)開發(fā)庫(jdk\jre\lib\rt.jar) 1
3、 基礎(chǔ)開發(fā)庫的源碼(jdk\src.zip) 1
2.基本類型(八種) 1
整數(shù)型 1
浮點型 2
3.運算符 2
算術(shù)運算符 + - * / 2
比較運算符 2
邏輯運算符 2
三元運算符 3
三項運算 3
賦值運算符 3
賦值運算 3
復(fù)合的賦值運算 3
4.循環(huán)結(jié)構(gòu) 3
for(開始條件;循環(huán)條件;更改條件){ 4
嵌套for循環(huán) 4
5:break和continue 4
break: 中斷當(dāng)前循環(huán),簡單粗暴 4
continue:跳出本次循環(huán),進入下一輪 5
while 5
do-while 6
6:數(shù)組 6
動態(tài)初始化:int[] a = new int[5]; 6
靜態(tài)初始化1:int[] a ={1,2,3,4,5,6,7,8}; 6
數(shù)組的長度 6
數(shù)組的遍歷 7
數(shù)組工具類Arrays 7
Arrays.sort(數(shù)組) 7
Arrays.copyOf(數(shù)組,新的長度) 7
7.方法 8
方法的重載 8
8.字符串 8
9.equals與==的區(qū)別 8
10.面向?qū)ο?9
三大特征 9
11.方法重寫與重載 9
重寫(Override) 9
重載(Overload) 10
12.抽象類 接口 10
抽象類: 10
接口 10
接口的實現(xiàn) 11
抽象類 接口的區(qū)別 11
13.訪問控制權(quán)限4種 11
public? 公開的 12
protected? 受保護的 12
private? ?私有的 12
default?? 默認(rèn) 12
14.多線程 12
線程(thread) 12

  • 新建狀態(tài)(New): 13
  • 就緒狀態(tài)(Runnable): 13
  • 運行狀態(tài)(Running): 13
  • 阻塞狀態(tài)(Blocked): 13
  • 根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種: 14
  • 死亡狀態(tài)(Dead): 14
    15.集合 14
    集合:集合是java中提供的一種容器,可以用來存儲多個數(shù)據(jù)。 15
    Collection:單列集合類的根接口,用于存儲一系列符合某種規(guī)則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。 15
    List的特點是元素有序、元素可重復(fù)。Set的特點是元素?zé)o序,而且不可重復(fù)。List接口的主要實現(xiàn)類有java.util.ArrayList和java.util.LinkedList, 15
    Set接口的主要實現(xiàn)類有java.util.HashSet和java.util.TreeSet。 15
    Collection 常用功能 15
    Iterator接口 15
    泛型:可以在類或方法中預(yù)支地使用未知的類型。一般在創(chuàng)建對象時,將未知的類型確定具體的類型。當(dāng)沒有指定泛型時,默認(rèn)類型為Object類型。 16
    16.IO流 16
    字節(jié)流 17
    字節(jié)文件操作流 17
    字節(jié)緩沖流(高效流) 17
    字符流 17
    字符轉(zhuǎn)換流 18
    字符緩沖流(高效流) 18
    17.什么是數(shù)據(jù)庫? 18
    18.mysql數(shù)據(jù)類型有哪些? 19
    1、數(shù)值類型 19
    2、 浮點型 float double 19
    3.日期和時間類型 19
    4 字符串類型 20
    19.mysql的約束有哪些? 20
    1、非空約束(not null) 20
    2、唯一性約束(unique) 20
    3、主鍵約束(primary key) 20
    4、外鍵約束(foreign key) 21
    5、默認(rèn)值約束 (Default) 21
    6、自增約束(AUTO_INCREMENT) 21
    20.什么是事務(wù)?事物的特點?事物的作用? 22
    21.什么是JDBC? 22
    22.JDBC連接數(shù)據(jù)庫的過程? 22
    6.釋放資源 23
    23.如何防止sql注入攻擊? 23
    如何防止SQL注入攻擊? 23
    24.什么是連接池?使用連接池的好處? 23
    連接池: 23
    好處: 24
    25.什么是HTML? 24
    26.html的結(jié)構(gòu)是什么樣的? 24
    (1)<!DOCTYPEHTML> 24
    (2) 24
    (3) 25
    (4) 25
    (5)<metacharset=“utf-8”/> 25
    27.什么是HTML的標(biāo)簽和屬性? 25
    28.什么是超鏈接?有哪些屬性? 25
    29.表單一般包含哪些元素? 26
    30.什么是css? 26
    31.在HTML中引入css的方式有幾種?優(yōu)先級 26
    方式1:通過style屬性引入css(不推薦) 26
    方式2:通過style標(biāo)簽引入css 26
    方式3:通過link鏈接引入外部的css文件 27
    32.css的選擇器有哪些? 27
    33.css元素類型有哪些?塊、行內(nèi)元素 28
    元素類型分類: 28
    塊狀元素特點: 28
    內(nèi)聯(lián)元素特點: 28
    34.什么是JS?有什么特點?優(yōu)勢是什么? 28
    全稱叫做JavaScript,簡稱叫做JS 28
    特點: 29
    優(yōu)勢: 29
    35.在HTML中如何引入js? 29
    1、在script標(biāo)簽內(nèi)部可以書寫JS代碼:36.js如何獲取表單內(nèi)容? 30
    2、通過script標(biāo)簽引入外部的JS文件 30
    37.什么是JQ?有什么優(yōu)勢? 30
    jQuery是一門輕量的、免費開源的JS函數(shù)庫(就是JS的簡單框架) 30
    優(yōu)勢: 30
    38.如何引入JQ? 31
    39.JQuery的常用選擇器有哪些? 31
    1、基本選擇器: 31
    2、層級選擇器 32
    3、基本過濾選擇器 32
    4、可見性過濾選擇器 33
    40、什么是服務(wù)器?什么 是web服務(wù)器? 33
    服務(wù)器: 33
    web服務(wù)器: 34
    41、tomcat默認(rèn)端口是什么?如何修改? 34
    Tomcat端口號: 34
    修改端口: 34
    42、什么是Http協(xié)議?Http協(xié)議在工作時遵循什么原則? 41
    Http協(xié)議: 41
    遵循原則: 41
    43、請求方式GET和POST 的區(qū)別? 41
    44、什么是Servlet?Servlet的作用是什么? 42
    Servlet: 42
    作用: 43
    45、如何開發(fā)一個Servlet程序? 44
    開發(fā)Servlet程序的步驟 44
    使用Eclipse創(chuàng)建Servlet 46
    1、選中項目中的src目錄,鼠標(biāo)右鍵 —> New —> Servlet 46
    2、在彈出的窗口中,根據(jù)提示填寫內(nèi)容 47
    3、點擊finish即可完成Servlet創(chuàng)建過程, 創(chuàng)建好的Servlet如下: 47
    46、Servlet生命周期是什么? 51
    47、Servlet數(shù)據(jù)傳遞的范圍有幾種?分別是什么? 51
    48、什么是Cookie和Session? 52
    Cookie 53
    Session 53
    總結(jié):兩者的區(qū)別 53
    49、轉(zhuǎn)發(fā)和重定向的區(qū)別? 55
    轉(zhuǎn)發(fā): 55
    重定向: 55
    50、什么是jsp? 56
    51、jsp有多少內(nèi)置對象,分別說明? 57
    1、request對象 58
    2、response對象 69
    3、session對象 72
    4、application對象 74
    5、out對象 76
    6、獲取會話范圍的pageContext對象 79
    7、讀取web.xml配置信息的config對象 80
    8、應(yīng)答或請求的page對象 80
    9、獲取異常信息的exception對象 81
    52、Jsp的域?qū)ο笥心男?#xff1f; 83
    Maven: 翻譯為"專家"、“內(nèi)行”,是Apache下的一個純Java開發(fā)的一個開源項目。 84
    54、什么是mybatis?使用mybatis有什么優(yōu)勢? 86
    55、mybatis中#{}與${}的區(qū)別? 87
    #{}: 88
    相當(dāng)于JDBC中的問號(?)占位符,是為SQL語句中的參數(shù)值進行占位,大部分情況下都是使用#{}占位符;并且當(dāng)#{}占位符是為字符串或者日期類型的值進行占位時,在參數(shù)值傳過來替換占位符的同時,會進行轉(zhuǎn)義處理(在字符串或日期類型的值的兩邊加上單引號) 88
    ${}: 88
    56、什么是動態(tài)SQL?什么情況下使用動態(tài)SQL? 88
    57、動態(tài)SQL常用標(biāo)簽有哪些? 88
    Mybatis動態(tài)sql(有哪些)標(biāo)簽: 88
    58、什么是Spring?它的優(yōu)勢是什么? 90
    59、Spring的核心內(nèi)容是什么? 91
    60.IOC、AOP各是什么 93
    61.什么是MVC?工作原理? 94
    MVC就是一種設(shè)計模式,它就是強制性使應(yīng)用程序的輸入,處理和輸出分開。將一個應(yīng)用程序分為三個部分:Model,View,Controller。 94
    springmvc的工作原理是: 94
    62.springboot? 95
    63.1.什么是AOP(Aspect Orient Programming)?解決了什么問題?應(yīng)用原理?應(yīng)用場景 95
    ? 95
    2.解決的問題 95
    3.應(yīng)用原理 95
    4.應(yīng)用場景 96
  • 總結(jié)
    1.JDK
    是 Java 語言的軟件開發(fā)工具包,主要用于移動設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序。JDK是整個java開發(fā)的核心。
    它包含了:
    1、 JAVA開發(fā)工具(jdk\bin)
    2、 基礎(chǔ)開發(fā)庫(jdk\jre\lib\rt.jar)
    3、 基礎(chǔ)開發(fā)庫的源碼(jdk\src.zip)
    2.基本類型(八種)
    整數(shù)型
    byte 1 -27到27-1 或者 -128到127
    short 2 -215到215-1
    int 4 -231到231-1
    long 8 -263到263-1
    浮點型
    float 4 單精度,對小數(shù)部分的精度要求不高
    double 8 雙精度,精確的小數(shù)部分并操作值很大時
    字符
    char 2 0到65535
    布爾
    boolean 1 真true 假false
    3.運算符
    算術(shù)運算符 + - * /
    基本運算 % 取余數(shù),求模,算整除
    ++ – 自增 自減
    比較運算符
    == 相等比較
    != 不等比較
    邏輯運算符
    && & 邏輯與(短路與),兩邊同為真結(jié)果才為真
    || | 邏輯或(短路或),兩邊只要有一個真結(jié)果就是真

    • 字符串連接
      ! 非,非真是假,非假是真
      三元運算符
      ?:
      三項運算
      1?2:3
      1是真取2,1是假取3
      賦值運算符
      =
      賦值運算
      += -=
      *= /=
      復(fù)合的賦值運算
      a+=2;//a=a+2
      4.循環(huán)結(jié)構(gòu)
      循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個功能而設(shè)置的一種程序結(jié)構(gòu)。
      它由循環(huán)體中的條件,判斷繼續(xù)執(zhí)行某個功能還是退出循環(huán)。
      根據(jù)判斷條件,循環(huán)結(jié)構(gòu)又可細分為先判斷后執(zhí)行的循環(huán)結(jié)構(gòu)和先執(zhí)行后判斷的循環(huán)結(jié)構(gòu)
      for(開始條件;循環(huán)條件;更改條件){
      循環(huán)體代碼…
      }
      嵌套for循環(huán)
      根據(jù)外層的條件,判斷里層能否執(zhí)行,如果能執(zhí)行,就把里層代碼都循環(huán)完畢后,再繼續(xù)執(zhí)行外層,繼續(xù)判斷
      for(…){
      for(…){
      }
      }
      5:break和continue
      用來終止循環(huán),可以用兩種方式
      break: 中斷當(dāng)前循環(huán),簡單粗暴
      for(){
      代碼1
      if(條件){
      代碼3…
      break;//如果成立,直接跳出這個for循環(huán)
      }
      代碼2…
      }
      continue:跳出本次循環(huán),進入下一輪
      for(){
      代碼1
      if(條件){
      代碼3…
      continue;//如果成立,跳出本次for循環(huán),進入下一輪
      }
      代碼2…
      }
      while
      先判斷,再執(zhí)行
      while(執(zhí)行條件){
      代碼…
      }
      do-while
      先執(zhí)行,再判斷
      do{
      代碼…
      }while(執(zhí)行條件);
      6:數(shù)組
      概念:數(shù)組Array是用于儲存多個相同類型數(shù)據(jù)的集合。
      想要獲取數(shù)組中的元素值,可以通過元素的下標(biāo)來獲取,下標(biāo)是從0開始的。
      動態(tài)初始化:int[] a = new int[5];
      靜態(tài)初始化1:int[] a ={1,2,3,4,5,6,7,8};
      靜態(tài)初始化2:int[] a =new int[]{1,2,3,4,5};
      數(shù)組的長度
      ? length屬性獲取數(shù)組長度
      ? 數(shù)組一旦創(chuàng)建,長度不可變
      ? 允許0長度的數(shù)組
      數(shù)組的遍歷
      從頭到尾,依次訪問數(shù)組的位置。
      形式
      for(int i=0;i<a.length;i++){
      syso(a[i]);
      }
      數(shù)組工具類Arrays
      Arrays.toString(數(shù)組)
      把數(shù)組里的數(shù)據(jù),用逗號連接成一個字符串。
      格式:[10, 14, 20, 46, 51]
      Arrays.sort(數(shù)組)
      對數(shù)組排序,對于基本類型的數(shù)組使用優(yōu)化后的快速排序算法,效率高。
      對引用類型數(shù)組,使用優(yōu)化后的合并排序算法。
      Arrays.copyOf(數(shù)組,新的長度)
      把數(shù)組復(fù)制成一個指定長度的新數(shù)組。
      新數(shù)組長度大于原數(shù)組,相當(dāng)于復(fù)制,并增加位置。–數(shù)組的擴容
      新數(shù)組長度小于原數(shù)組,相當(dāng)于截取前一部分?jǐn)?shù)據(jù)。–數(shù)組的縮容
      7.方法
      被命名的代碼塊,方法可以含參數(shù)可以不含參數(shù)
      可以提高代碼的復(fù)用性
      修飾符 返回值 方法名(【參數(shù)】){
      方法體;
      }
      方法的重載
      概念:方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數(shù)列表(也就是說參數(shù)的個數(shù)和類型不同)。
      程序調(diào)用方法時,可以通過傳遞給它們的不同個數(shù)和類型的參數(shù)來決定具體使用哪個方法。
      8.字符串
      String 字符串常量
      StringBuffer 字符串變量(線程安全的)
      StringBuilder 字符串變量(非線程安全的)
      9.equals與的區(qū)別
      當(dāng)比較基本類型時,用
      當(dāng)比較的元素為引用類型時,==比較的是內(nèi)存地址
      == 比較的是變量(棧)內(nèi)存中存放的對象的(堆)內(nèi)存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作
      equals比較引用類型,比較的是值,而不是地址
      10.面向?qū)ο?br /> 所謂的面向?qū)ο笫且环N編程思想,通過這種思想可以把生活中的復(fù)雜事情變得簡單化,從原來的執(zhí)行者變成了指揮者,面向?qū)ο笫腔诿嫦蜻^程而言的。
      我們經(jīng)常說的面向?qū)ο蟮木幊虒崿F(xiàn)(OOP,Object Oriented Programming)
      三大特征
      1、 封裝性,把相關(guān)的數(shù)據(jù)封裝成一個“類”組件
      2、 繼承性,是子類自動共享父類屬性和方法,這是類之間的一種關(guān)系
      3、 多態(tài),增強軟件的靈活性和重用性
      11.方法重寫與重載
      重寫(Override)
      重寫是子類對父類的允許訪問的方法的實現(xiàn)過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
      重寫的好處在于子類可以根據(jù)需要,定義特定于自己的行為。 也就是說子類能夠根據(jù)需要實現(xiàn)父類的方法。
      重載(Overload)
      重載(overloading) 是在一個類里面,方法名字相同,而參數(shù)不同。返回類型可以相同也可以不同。
      每個重載的方法(或者構(gòu)造函數(shù))都必須有一個獨一無二的參數(shù)類型列表。
      最常用的地方就是構(gòu)造器的重載。
      方法重載是一個類的多態(tài)性表現(xiàn),而方法重寫是子類與父類的一種多態(tài)性表現(xiàn)。
      12.抽象類 接口
      抽象類:
      包含抽象方法的類稱為抽象類,但并不意味著抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。
      抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現(xiàn)該方法),缺省情況下默認(rèn)為public。
      抽象類不能用來創(chuàng)建對象;
      如果一個類繼承于一個抽象類,則子類必須實現(xiàn)父類的抽象方法。如果子類沒有實現(xiàn)父類的抽象方法,則必須將子類也定義為為abstract類。
      接口
      接口聲明
      關(guān)鍵字:interface ? ? ??public interface ?接口名 {}
      接口體
      常量(沒有變量) ?( public static final ) int MAX = 100; ? ? 可以省略public static final
      抽象方法 (public abstract) void add(); 可以省略public abstract
      常量和抽象方法都只有一種訪問修飾符:public
      接口默認(rèn)提供 ?public,static,final,abstract 關(guān)鍵字
      接口的實現(xiàn)
      關(guān)鍵字:implements
      接口中定義的常量,在繼承了接口的類中可以直接使用。?
      抽象類 接口的區(qū)別
      1.抽象類可以提供成員方法的實現(xiàn)細節(jié),而接口中只能存在public abstract 方法;
      2.抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
      3.接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;
      4.一個類只能繼承一個抽象類,而一個類卻可以實現(xiàn)多個接口。
      13.訪問控制權(quán)限4種
      1.訪問控制權(quán)限有:
      public? 公開的
      protected? 受保護的
      private? ?私有的
      default?? 默認(rèn)
      2.private:表示私有的,只能在本類中訪問。
      ? public:表示公開的,在任何位置都可以訪問。
      ? default:表示只能在本類,以及同包下訪問。
      ? protected:表示只能在本類、同包、子類中訪問。
      范圍從大到小排序:public>protected>default>private
      3.訪問控制權(quán)限修飾符還可以修飾:屬性、方法、類(public和default,其他不行)、接口(public和default能用,其他不行 )
      14.多線程
      線程(thread)
      是操作系統(tǒng)能夠進行運算調(diào)度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一個進程可以開啟多個線程。
      多線程擴展了多進程的概念,使得同一個進程可以同時并發(fā)處理多個任務(wù)。
      簡而言之,一個程序運行后至少一個進程,一個進程里包含多個線程。
      如果一個進程只有一個線程,這種程序被稱為單線程。
      如果一個進程中有多條執(zhí)行路徑被稱為多線程程序。
      一個操作系統(tǒng)中可以有多個進程,一個進程中可以有多個線程,每個進程有自己獨立的內(nèi)存,每個線程共享一個進程中的內(nèi)存,每個線程又有自己獨立的內(nèi)存
      線程生命周期,總共有五種狀態(tài):
  • 新建狀態(tài)(New):
    當(dāng)線程對象對創(chuàng)建后,即進入了新建狀態(tài),如:Thread t = new MyThread();
  • 就緒狀態(tài)(Runnable):
    當(dāng)調(diào)用線程對象的start()方法(t.start();),線程即進入就緒狀態(tài)。處于就緒狀態(tài)的線程,只是說明此線程已經(jīng)做好了準(zhǔn)備,隨時等待CPU調(diào)度執(zhí)行,并不是說執(zhí)行了t.start()此線程立即就會執(zhí)行;
  • 運行狀態(tài)(Running):
    當(dāng)CPU開始調(diào)度處于就緒狀態(tài)的線程時,此時線程才得以真正執(zhí)行,即進入到運行狀態(tài)。注:就緒狀態(tài)是進入到運行狀態(tài)的唯一入口,也就是說,線程要想進入運行狀態(tài)執(zhí)行,首先必須處于就緒狀態(tài)中;
  • 阻塞狀態(tài)(Blocked):
    處于運行狀態(tài)中的線程由于某種原因,暫時放棄對CPU的使用權(quán),停止執(zhí)行,此時進入阻塞狀態(tài),直到其進入到就緒狀態(tài),才有機會再次被CPU調(diào)用以進入到運行狀態(tài);
  • 根據(jù)阻塞產(chǎn)生的原因不同,阻塞狀態(tài)又可以分為三種:
    a) 等待阻塞:運行狀態(tài)中的線程執(zhí)行wait()方法,使本線程進入到等待阻塞狀態(tài);
    b) 同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態(tài);
    c) 其他阻塞:
    通過調(diào)用線程的sleep()或join()或發(fā)出了I/O請求時,線程會進入到阻塞狀態(tài)。當(dāng)sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。
  • 死亡狀態(tài)(Dead):
    線程執(zhí)行完了或者因異常退出了run()方法,該線程結(jié)束生命周期。
    多線程實現(xiàn)方式主要有三種:繼承Thread類、實現(xiàn)Runnable接口、使用ExecutorService、Callable、Future實現(xiàn)有返回結(jié)果的多線程。其中前兩種方式線程執(zhí)行完后都沒有返回值,只有最后一種是帶返回值的
    把有可能出現(xiàn)問題的代碼包起來,一次只讓一個線程執(zhí)行。通過sychronized關(guān)鍵字實現(xiàn)同步。
    當(dāng)多個對象操作共享數(shù)據(jù)時,可以使用同步鎖解決線程安全問題。 synchronized
    15.集合
    集合:集合是java中提供的一種容器,可以用來存儲多個數(shù)據(jù)。
    Collection:單列集合類的根接口,用于存儲一系列符合某種規(guī)則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。
    List的特點是元素有序、元素可重復(fù)。Set的特點是元素?zé)o序,而且不可重復(fù)。List接口的主要實現(xiàn)類有java.util.ArrayList和java.util.LinkedList,
    Set接口的主要實現(xiàn)類有java.util.HashSet和java.util.TreeSet。
    Collection 常用功能
      Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合。方法如下:
    public boolean add(E e): 把給定的對象添加到當(dāng)前集合中 。
    public void clear() :清空集合中所有的元素。
    public boolean remove(E e): 把給定的對象在當(dāng)前集合中刪除。
    public boolean contains(E e): 判斷當(dāng)前集合中是否包含給定的對象。
    public boolean isEmpty(): 判斷當(dāng)前集合是否為空。
    public int size(): 返回集合中元素的個數(shù)。
    public Object[] toArray(): 把集合中的元素,存儲到數(shù)組中
    Iterator接口
      JDK專門提供了一個接口java.util.Iterator,遍歷集合中的所有元素。
      Iterator接口也是Java集合中的一員,但它與Collection、Map接口有所不同,
      Collection接口與Map接口主要用于存儲元素,而Iterator主要用于迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱為迭代器。
      想要遍歷Collection集合,那么就要獲取該集合迭代器完成迭代操作,獲取迭代器的方法:
    public Iterator iterator(): 獲取集合對應(yīng)的迭代器,用來遍歷集合中的元素的。
      Iterator接口的常用方法如下:
    public E next():返回迭代的下一個元素。
    public boolean hasNext():如果仍有元素可以迭代,則返回 true。
    集合中是可以存放任意對象的,只要把對象存儲集合后,那么這時他們都會被提升成Object類型。當(dāng)我們在取出每一個對象,并且進行相應(yīng)的操作,這時必須采用類型轉(zhuǎn)換。
      泛型:可以在類或方法中預(yù)支地使用未知的類型。一般在創(chuàng)建對象時,將未知的類型確定具體的類型。當(dāng)沒有指定泛型時,默認(rèn)類型為Object類型。
    16.IO流
    Java對數(shù)據(jù)的操作是通過流的方式,IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸,上傳文件和下載文件,Java用于操作流的對象都在IO包中。
    字節(jié)流
    InputStream
    InputStream:字節(jié)輸入流基類,抽象類是表示字節(jié)輸入流的所有類的超類
    OutputStream
    OutputStream:字節(jié)輸出流基類,抽象類是表示輸出字節(jié)流的所有類的超類。
    字節(jié)文件操作流
    FileInputStream
    FileInputStream:字節(jié)文件輸入流,從文件系統(tǒng)中的某個文件中獲得輸入字節(jié),用于讀取諸如圖像數(shù)據(jù)之類的原始字節(jié)流
    FileOutputStream
    FileOutputStream:字節(jié)文件輸出流是用于將數(shù)據(jù)寫入到File,從程序中寫入到其他位置。
    字節(jié)緩沖流(高效流)
    BufferedInputStream
    BufferedInputStream:字節(jié)緩沖輸入流,提高了讀取效率。
    BufferedOutputStream
    BufferedOutputStream:字節(jié)緩沖輸出流,提高了寫出效率。
    字符流
    Reader
    Reader:讀取字符流的抽象類.
    Writer
    Writer:寫入字符流的抽象類
    字符轉(zhuǎn)換流
    InputStreamReader
    InputStreamReader:字節(jié)流轉(zhuǎn)字符流,它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認(rèn)的字符集。
    OutputStreamWriter
    OutputStreamWriter:字節(jié)流轉(zhuǎn)字符流。
    字符緩沖流(高效流)
    BufferedReader
    BufferedReader:字符緩沖流,從字符輸入流中讀取文本,緩沖各個字符,從而實現(xiàn)字符、數(shù)組和行的高效讀取。
    BufferedWriter
    BufferedWriter:字符緩沖流,將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數(shù)組和字符串的高效寫入。
    17.什么是數(shù)據(jù)庫?
    數(shù)據(jù)庫是數(shù)據(jù)管理的有效技術(shù),是由一批數(shù)據(jù)構(gòu)成的有序集合,這些數(shù)據(jù)被存放在結(jié)構(gòu)化的數(shù)據(jù)表里。數(shù)據(jù)表之間相互關(guān)聯(lián),反映客觀事物間的本質(zhì)聯(lián)系。數(shù)據(jù)庫能有效地幫助一個組織或企業(yè)科學(xué)地管理各類信息資源。
    數(shù)據(jù)是數(shù)據(jù)庫中存儲的基本對象,是按一定順序排列組合的物理符號。數(shù)據(jù)有多種表現(xiàn)形式,可以是數(shù)字、文字、圖像,甚至是音頻或視頻,它們都可以經(jīng)過數(shù)字化后存入計算機。
    數(shù)據(jù)庫是數(shù)據(jù)的集合,具有統(tǒng)一的結(jié)構(gòu)形式并存放于統(tǒng)一的存儲介質(zhì)內(nèi),是多種應(yīng)用數(shù)據(jù)的集成,并可被各個應(yīng)用程序所共享
    18.mysql數(shù)據(jù)類型有哪些?
    MySQL支持多種類型,大致可以分為四類:數(shù)值型、浮點型、日期/時間和字符串(字符)類型。
    1、數(shù)值類型
      MySQL支持所有標(biāo)準(zhǔn)SQL數(shù)值數(shù)據(jù)類型。
      這些數(shù)值類型包括嚴(yán)格數(shù)值數(shù)據(jù)類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數(shù)值數(shù)據(jù)類型(FLOAT、REAL和DOUBLE PRECISION)。
      關(guān)鍵字INT是INTEGER的同義詞,關(guān)鍵字DEC是DECIMAL的同義詞。
    2、 浮點型 float double
    3.日期和時間類型
      表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
      每個時間類型有一個有效值范圍和一個"零"值,當(dāng)指定不合法的MySQL不能表示的值時使用"零"值。
    4 字符串類型
      字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
    19.mysql的約束有哪些?
    1、非空約束(not null)
    非空約束用于確保當(dāng)前列的值不為空值,非空約束只能出現(xiàn)在表對象的列上。Null類型特征:所有的類型的值都可以是null,包括int、float 等數(shù)據(jù)類型
    2、唯一性約束(unique)
    唯一約束是指定table的列或列組合不能重復(fù),保證數(shù)據(jù)的唯一性。唯一約束不允許出現(xiàn)重復(fù)的值,但是可以為多個null。同一個表可以有多個唯一約束,多個列組合的約束。在創(chuàng)建唯一約束時,如果不給唯一約束名稱,就默認(rèn)和列名相同。唯一約束不僅可以在一個表內(nèi)創(chuàng)建,而且可以同時多表創(chuàng)建組合唯一約束。
    3、主鍵約束(primary key)
    PK主鍵約束相當(dāng)于 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復(fù),也不允許出現(xiàn)空值。每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創(chuàng)建,也可以在表級別創(chuàng)建。當(dāng)創(chuàng)建主鍵的約束時,系統(tǒng)默認(rèn)會在所在的列和列組合上建立對應(yīng)的唯一索引。
    4、外鍵約束(foreign key)
    FK外鍵約束是用來加強兩個表(主表和從表)的一列或多列數(shù)據(jù)之間的連接的,可以保證一個或兩個表之間的參照完整性,外鍵是構(gòu)建于一個表的兩個字段或是兩個表的兩個字段之間的參照關(guān)系。創(chuàng)建外鍵約束的順序是先定義主表的主鍵,然后定義從表的外鍵。也就是說只有主表的主鍵才能被從表用來作為外鍵使用,被約束的從表中的列可以不是主鍵,主表限制了從表更新和插入的操作。
    5、默認(rèn)值約束 (Default)
    若在表中定義了默認(rèn)值約束,用戶在插入新的數(shù)據(jù)行時,如果該行沒有指定數(shù)據(jù),那么系統(tǒng)將默認(rèn)值賦給該列,如果我們不設(shè)置默認(rèn)值,系統(tǒng)默認(rèn)為NULL。
    6、自增約束(AUTO_INCREMENT)
    自增約束(AUTO_INCREMENT)可以約束任何一個字段,該字段不一定是PRIMARYKEY字段,也就是說自增的字段并不等于主鍵字段。 但是PRIMARY_KEY約束的主鍵字段,一定是自增字段,即PRIMARY_KEY 要與AUTO_INCREMENT一起作用于同一個字段。當(dāng)插入第一條記錄時,自增字段沒有給定一個具體值,可以寫成DEFAULT/NULL,那么以后插入字段的時候,該自增字段就是從1開始,沒插入一條記錄,該自增字段的值增加1。當(dāng)插入第一條記錄時,給自增字段一個具體值,那么以后插入的記錄在此自增字段上的值,就在第一條記錄該自增字段的值的基礎(chǔ)上每次增加1。
    20.什么是事務(wù)?事物的特點?事物的作用?
    事務(wù)是應(yīng)用程序中一系列嚴(yán)密du的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務(wù)具有原子性,一個事務(wù)中的一系列的操作要么全部成功,要么一個都不做。
    事務(wù)具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性(Isolation )和持續(xù)性( Durability )。
    事務(wù)是為了保證對同一數(shù)據(jù)表操作的一致性。即多條語句放在事務(wù)中執(zhí)行的時候,要么一起成功,要么全不成功。
    21.什么是JDBC?
    JDBC(Java DataBase Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序,同時,JDBC也是個商標(biāo)名。
    22.JDBC連接數(shù)據(jù)庫的過程?
    1.注冊數(shù)據(jù)庫驅(qū)動
    2.獲取數(shù)據(jù)庫連接
    3.獲取傳輸器
    4.發(fā)送sql語句到服務(wù)器運行,并返回運行結(jié)果
    5.處理結(jié)果
    6.釋放資源
    23.如何防止sql注入攻擊?
    SQL注入攻擊產(chǎn)生的原因: 由于后臺執(zhí)行的SQL語句是拼接而來的:其中的參數(shù)是用戶提交過來的,如果用戶在提交參數(shù)時,在參數(shù)中摻雜了一些SQL關(guān)鍵字(比如or)或者特殊符號(#、-- 、’ 等),就可能會導(dǎo)致SQL語句語義的變化,從而執(zhí)行一些意外的操作(用戶名或密碼不正確也能登錄成功)
    如何防止SQL注入攻擊?
    (1)使用正則表達式對用戶提交的參數(shù)進行校驗。如果參數(shù)中有(# – ’ or等)這些符號就直接結(jié)束程序,通知用戶輸入的參數(shù)不合法
    (2)使用PreparedStatement對象來替代Statement對象。
    24.什么是連接池?使用連接池的好處?
    連接池:
    就是將連接存放在容器中,供整個程序共享,可以實現(xiàn)連接的復(fù)用,減少連接創(chuàng)建和關(guān)閉的次數(shù),從而提高程序執(zhí)行的效率!在傳統(tǒng)方式中,每次用戶需要連接訪問數(shù)據(jù)庫時,都是創(chuàng)建一個連接對象,基于這個連接對象訪問數(shù)據(jù)庫,用完連接后,會將連接關(guān)閉(conn.close)由于每次創(chuàng)建連接和關(guān)閉連接非常的耗時間而且耗資源,因此會導(dǎo)致程序執(zhí)行的效率低下。
    好處:
    可以在程序一啟動時,就創(chuàng)建一批連接放在一個連接池中(容器),當(dāng)用戶需要連接時,就從連接池中獲取一個連接對象,用完連接后,不要關(guān)閉,而是將連接再還回連接池中,這樣一來,用來用去都是池中的這一批連接,實現(xiàn)了連接的復(fù)用,減少了連接創(chuàng)建和關(guān)閉的次數(shù),從而提高了程序執(zhí)行的效率!
    25.什么是HTML?
    HTML(Hyper Text Markup Language): 超文本標(biāo)記語言;是最基礎(chǔ)的開發(fā)網(wǎng)頁的語言。由W3C組織提供(CSS/xml)
    26.html的結(jié)構(gòu)是什么樣的?
    (1)<!DOCTYPEHTML>
    文檔聲明, 用來聲明HTML文檔所遵循的HTML規(guī)范和版本
    上面是html5.0的聲明, 也是目前最常用的版本
    (2)
    頭部分, 用來存放HTML文檔的基本屬性信息, 比如網(wǎng)頁的標(biāo)題, 文檔使用的編碼等, 這部分信息會被瀏覽器優(yōu)先加載.
    (3)
    體部分, 用來存放網(wǎng)頁可視化數(shù)據(jù). 即真正的網(wǎng)頁數(shù)據(jù)
    (4)
    聲明網(wǎng)頁的標(biāo)題
    (5)<metacharset=“utf-8”/>
    用來通知瀏覽器使用哪一個編碼來打開HTML文檔, 這個編碼一定要和文件保存時的編碼保持一致, 才不會出現(xiàn)中文亂碼問題.
    27.什么是HTML的標(biāo)簽和屬性?
    標(biāo)簽:也叫做標(biāo)記、元素等,標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽
    在標(biāo)簽上可以聲明屬性,標(biāo)簽上可以聲明多個屬性,多個屬性之間用空格分隔
    標(biāo)簽上的屬性的值可以使用單引號或者雙引號引起來
    如何在網(wǎng)頁中做一個換行:可以使用
    標(biāo)簽做換行
    如何在網(wǎng)頁中做一個空格:可以使用?或?做空格
    28.什么是超鏈接?有哪些屬性?
    <a target="_blank"href=“http://www.tmooc.cn”>
    <img alt="tmooc"src=“imgs/tmooc.png” />

    其中 href 屬性用于指定點擊超鏈接后將要跳轉(zhuǎn)到的URL地址
    target屬性用于指定以何種方式打開超鏈接
    _self:默認(rèn)值, 表示在當(dāng)前窗口中打開超鏈接
    _blank:表示在新的窗口中打開超鏈接
    29.表單一般包含哪些元素?
  • 表單項標(biāo)簽: 30.什么是css? CSS: 層疊樣式表,用于修飾、渲染網(wǎng)頁的一門技術(shù) 使用css樣式修飾網(wǎng)頁,可以實現(xiàn)將設(shè)置樣式的css代碼和展示數(shù)據(jù)的html代碼進行分離,增強了網(wǎng)頁的展示能力! 31.在HTML中引入css的方式有幾種?優(yōu)先級 方式1:通過style屬性引入css(不推薦) <?xml version="1.0" encoding="UTF-8"?> <!--For clustering, please take a look at documentation at:/docs/cluster-howto.html (simple how to)/docs/config/cluster.html (reference documentation) --><!--<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>--><!-- Use the LockOutRealm to prevent attempts to guess user passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase". Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm. --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!-- Access log processes all example.Documentation at: /docs/config/valve.htmlNote: The pattern used is equivalent to using pattern="common" --><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host> </Engine> 我們只需要修改這里面的8080端口號為指定的端口號就行,其他的都不需要改: 例如: 改完后一定要重啟服務(wù)器。 42、什么是Http協(xié)議?Http協(xié)議在工作時遵循什么原則? Http協(xié)議: ? HTTP協(xié)議是用于規(guī)定瀏覽器和服務(wù)器之間的通信方式/規(guī)則 ? 主要規(guī)定了瀏覽器給服務(wù)器發(fā)送的請求信息的格式 ? 以及規(guī)定了服務(wù)器給瀏覽器發(fā)送響應(yīng)信息的格式 遵循原則: (1)一次請求,只對應(yīng)一次響應(yīng) (2)請求只能由瀏覽器發(fā)起,服務(wù)器只能被動的等待請求,根據(jù)請求作出回應(yīng)。 43、請求方式GET和POST 的區(qū)別? 主要區(qū)別體現(xiàn)在請求參數(shù)傳輸過程的不相同 1. GET提交: ? 將數(shù)據(jù)通過問號拼接在地址欄URL地址的后面,相對非常不安全。 ? 將數(shù)據(jù)拼接在地址欄URL地址的后面,數(shù)據(jù)量是有限制的,通常不能超過1KB或者4KB。 2. POST提交:(form) ? POST提交是通過請求實體將數(shù)據(jù)提交給服務(wù)器,不會顯示在地址欄上,因此相對更加安全。 ? POST提交通過請求實體提交數(shù)據(jù),數(shù)據(jù)量理論上是沒有限制的。 3. 總結(jié): ? 如果只是單純做一個跳轉(zhuǎn),請求中沒有數(shù)據(jù),盡量使用GET提交。 ? 如果在請求中有數(shù)據(jù),但數(shù)據(jù)量不大,并且數(shù)據(jù)沒有隱私性,也盡量使用GET提交。 ? 如果在請求中有數(shù)據(jù),數(shù)據(jù)量比較大或者數(shù)據(jù)較為隱私,此時推薦使用POST提交。 ? 只有當(dāng)使用表單(form),并且在表單上明確的通過method指定提交方式為POST時,請求方式才是POST提交,其他方式都是GET提交(AJAX除外) 44、什么是Servlet?Servlet的作用是什么? Servlet: Servlet是由SUN公司提供的一門動態(tài)Web資源開發(fā)技術(shù), 靜態(tài)Web資源:不同的人,在不同的條件下訪問后看到的是相同的效果,這樣的資源叫做靜態(tài)Web資源(html、css、js等) 動態(tài)Web資源:在不同的訪問條件下看到的是不同的效果,這樣的資源叫做動態(tài)Web資源 (Servlet、jsp、.NET、PHP等) Servlet本質(zhì)上是一段Java程序,和之前的Java程序不同的是,Servlet程序無法獨立運行,需要將Servlet程序放在服務(wù)器中(比如tomcat服務(wù)器),由服務(wù)器調(diào)用才可以執(zhí)行。 Servlet: 服務(wù)器端的Java程序. 作用: 其作用是對服務(wù)器接收過來的請求進行處理(作用為處理請求)

    45、如何開發(fā)一個Servlet程序?
    開發(fā)Servlet程序的步驟
    第一步: 寫一個類,實現(xiàn)一個Servlet接口或者繼承Servlet接口的子類(GenericServlet/HttpServlet),并實現(xiàn)其中的方法
    Servlet接口
    |-- GenericServlet類(抽象類)
    |-- HttpServlet類
    第二步: 在web應(yīng)用的web.xml文件中配置Servlet程序?qū)ν庠L問的路徑。
    Eclipse在創(chuàng)建一個Servlet時,會在web.xml文件中生成Servlet配置,所以不需要我們手動配置。

  • 創(chuàng)建一個Web工程:
  • 2、接著會彈出如下窗口:

    注意:
    (1) 3.0版本不會創(chuàng)建web.xml文件,并且創(chuàng)建Servlet時也不會在web.xml文件中生成Servlet相關(guān)的配置信息, 記得改為2.5。
    (2) Target runtime選項中如果沒有可選的服務(wù)器,可點擊右側(cè)的"NewRuntime…"進行配置。
    3、Eclipse中創(chuàng)建的Web工程的目錄結(jié)構(gòu):
    (1) day09: 工程名稱/項目名稱
    (2) src: 源碼目錄, 創(chuàng)建的java源文件、配置文件(properties、xml文件等)都可以放在src源碼目錄下
    (3) build/classes: 編譯文件的輸出目錄, src源碼目錄中的文件編譯后會輸出到classes目錄下。
    其中的classes目錄在發(fā)布時會放在WEB-INF目錄下,隨著項目一起發(fā)布到服務(wù)器中
    (4) WebContent: 就是Web應(yīng)用的目錄,其中可以存放 html、css、js、jsp、圖片以及編譯后的class文件、jar包、web.xml文件等. 將來發(fā)布項目到服務(wù)器,其實就是將WebContent中的所有內(nèi)容一起發(fā)布到服務(wù)器中。
    (5) WebContent/WEB-INF/lib: 用于存放當(dāng)前項目所依賴的jar包。比如要訪問mysql數(shù)據(jù)庫,需要導(dǎo)入mysql驅(qū)動包,直接將jar包拷貝到lib目錄下即可!(也不用再去做 build path --> add to build path)
    使用Eclipse創(chuàng)建Servlet
    1、選中項目中的src目錄,鼠標(biāo)右鍵 —> New —> Servlet
    2、在彈出的窗口中,根據(jù)提示填寫內(nèi)容

    3、點擊finish即可完成Servlet創(chuàng)建過程, 創(chuàng)建好的Servlet如下:

    通過Eclipse創(chuàng)建Servlet,默認(rèn)繼承HttpServlet。由于HttpServlet也是Servlet接口的子類,讓HelloServlet繼承HttpServlet,相當(dāng)于間接實現(xiàn)了Servlet接口。
    繼承HttpServlet類,默認(rèn)會覆蓋doGet方法和doPost方法,兩個方法的作用為:

    • doGet方法:當(dāng)瀏覽器發(fā)送請求的方式為GET提交時, 將會調(diào)用doGet方法來處理請求
    • doPost方法:當(dāng)瀏覽器發(fā)送請求的方式為POST提交時,將會調(diào)用doPost方法來處理請求
      提示:如果當(dāng)GET提交和POST提交處理代碼相同時,可以將代碼寫在其中一個方法里(例如寫在doGet中),并在另外一個方法(例如doPost)中調(diào)這個方法。這樣一來,不管是GET提交還是POST提交,最終doGet方法都會執(zhí)行,都會對請求進行處理!!
      Servlet在web.xml中的配置

      HelloServlet
      com.tedu.HelloServlet


      HelloServlet
      /HelloServlet

      關(guān)于上面的配置信息:
      a) Eclipse每創(chuàng)建一個Servlet,就會在web.xml文件中添加兩個標(biāo)簽:和標(biāo)簽(可以將這兩個標(biāo)簽看成一個組的標(biāo)簽)
      b) 和標(biāo)簽內(nèi)都會有一個標(biāo)簽,標(biāo)簽的內(nèi)容可以更改,但要求更改后的這兩個標(biāo)簽的內(nèi)容也必須一致。
      c) 標(biāo)簽用于配置Servlet類的全限定類名(即包名+類名)
      需要注意:如果在創(chuàng)建Servlet后修改了Servlet類的名稱,這個地方也要一起更改,否則將會出現(xiàn)"ClassNotFoundException" 即類找不到異常
      d) 標(biāo)簽用于配置瀏覽器以什么路徑訪問當(dāng)前Servlet(即Servlet對外訪問的路徑),默認(rèn)的路徑是:/類名
      例如:上面為HelloServlet配置的為/HelloServlet,因此我們在瀏覽器中的訪問路徑則為:
      http://主機名/web項目訪問路徑/HelloServlet
      運行Servlet程序、訪問測試

    若是第一次運行,需要先創(chuàng)建tomcat服務(wù)器,即在Servers窗口中點擊鏈接可創(chuàng)建一個tomcat服務(wù)器,且只需創(chuàng)建一次即可!
    (1)發(fā)布項目到服務(wù)器:在服務(wù)器上右鍵 --> 點擊 “add and remove” 將當(dāng)前web項目發(fā)布到服務(wù)器中,并點擊完成。
    (2)啟動tomcat服務(wù)器:在服務(wù)器上右鍵 Start 即可啟動服務(wù)器
    (3)通過瀏覽器訪問Servlet:打開本地瀏覽器,通過路徑訪問,即可訪問Servlet程序
    http://localhost:端口/項目名稱/HelloServlet
    運行結(jié)果如下:

    46、Servlet生命周期是什么?
    生命周期:
    在服務(wù)器調(diào)用Servlet程序的service方法之前,會創(chuàng)建代表請求的request對象,在請求處理完,響應(yīng)結(jié)束時,會銷毀request對象。
    47、Servlet數(shù)據(jù)傳遞的范圍有幾種?分別是什么?
    一、servlet的三種轉(zhuǎn)發(fā)方式
    1、req.getRequestDispatcher(url).forward(req,resp);
    將req和resp轉(zhuǎn)發(fā)給url表示的對象 由于是轉(zhuǎn)發(fā)地址欄中的地址不變
    2、req.getRequestDispatcher(url).include(req,resp);
    將req和resp轉(zhuǎn)發(fā)給url表示的對象,同時發(fā)送PrintWriter在此處寫入的信息(但是這里注意寫入信息要在這一句之前寫入,否則resp已經(jīng)被轉(zhuǎn)發(fā)就不能在寫入了) 同樣由于是轉(zhuǎn)發(fā)地址欄中的地址不便
    3、resp.sendRedirect(url);
    請求客戶端重新定向與url再次發(fā)送req 由于是重新定位發(fā)送,地址欄中的地址改變
    url可以是html 可以是jsp 也可以是servlet
    二、servlet對象中數(shù)據(jù)的范圍
    這三個對象是ServletRequest Session ServletContext
    他們都一致用setAttribute(String key,Object value)
    getAttribute(String key)
    removeAttribute(String key)
    來存放和取出數(shù)據(jù)。 不同之處在與他們的作用范圍不同
    1、ServletRequest
    作用范圍最小的一個,消耗資源少,用的相對比較多。
    通過不同servlet間轉(zhuǎn)發(fā)傳遞ServRequest來傳遞數(shù)據(jù)。
    2、Session
    通過ServletRequest的getSession方法得到。
    從session第一次創(chuàng)建直到Session因超時或客戶端關(guān)閉之前,數(shù)據(jù)會一直存在。
    Session 常用做存入某個用戶相關(guān)的數(shù)據(jù)對象。
    3、ServletContext
    通過Servlet的getServletConext方法得到。
    作用范圍最大的一個。只要服務(wù)器中建立了它,他就一直存在。直到服務(wù)器關(guān)閉。
    48、什么是Cookie和Session?
    Cookie

  • Cookie是將會話中產(chǎn)生的數(shù)據(jù)保存在客戶端,是客戶端技術(shù)。
  • Cookie是基于兩個頭進行工作的:分別是Set-Cookie響應(yīng)頭和Cookie請求頭
  • 通過Set-Cookie響應(yīng)頭將cookie從服務(wù)器端發(fā)送給瀏覽器,讓瀏覽器保存到內(nèi)部;而瀏覽器一旦保存了cookie,以后瀏覽器每次訪問服務(wù)器時,都會通過cookie請求頭,將cookie信息再帶回服務(wù)器中。在需要時,在服務(wù)器端可以獲取請求中的cookie中的數(shù)據(jù),從而實現(xiàn)某些功能。
    cookie的API
  • Session

  • Session是將會話中產(chǎn)生的數(shù)據(jù)保存在服務(wù)器端,是服務(wù)器端技術(shù)
  • Session是一個域?qū)ο?#xff0c;session中也保存了一個map集合,往session中存數(shù)據(jù),其實就是將數(shù)據(jù)保存到session的map集合中。
  • 通過session.setAttribute()方法可以將數(shù)據(jù)保存到session中,通過session.getAttribute()方法可以將數(shù)據(jù)從session中取出來。
    session是一個域?qū)ο?br /> 總結(jié):兩者的區(qū)別
    Cookie和session都屬于會話技術(shù),都可以保存會話中產(chǎn)生的數(shù)據(jù),但由于cookie和session的工作原理和特點不同,因此兩者的應(yīng)用場景也不一樣。
    ? Cookie的特點:
  • cookie是將會話中產(chǎn)生的數(shù)據(jù)保存在瀏覽器客戶端, 是客戶端技術(shù)(JS可以訪問cookie)
  • cookie是將數(shù)據(jù)保存在客戶端瀏覽器,容易隨著用戶的操作導(dǎo)致cookie丟失或者被竊取,因此cookie中保存的數(shù)據(jù)不太穩(wěn)定,也不太安全。
  • 但cookie將數(shù)據(jù)保存在客戶端,對服務(wù)器端沒有太多影響,可以將數(shù)據(jù)保存很長時間。
  • 總結(jié):因此cookie中適合存儲需要長時間保存、但對安全性要求不高的數(shù)據(jù)。
  • 瀏覽器對cookie的大小和個數(shù)都有限制,一般推薦每一個站點給瀏覽器發(fā)送的cookie數(shù)量不超過20個,每一個cookie的大小不超過1kb。
  • Cookie的應(yīng)用:實現(xiàn)購物車、記住用戶名、30天內(nèi)自動登錄等。
    ? Session的特點
  • session是將會話中產(chǎn)生的數(shù)據(jù)保存在服務(wù)器端,是服務(wù)器端技術(shù)
  • session將數(shù)據(jù)存在服務(wù)器端的session對象中,相對更加的安全,而且更加穩(wěn)定。不容易隨著用戶的操作而導(dǎo)致session中的數(shù)據(jù)丟失或者是被竊取。
  • 但session是服務(wù)器端的對象,在并發(fā)量較高時每一個瀏覽器客戶端在服務(wù)器端都要對應(yīng)一個session對象,占用服務(wù)器的內(nèi)存空間,影響效率。
  • 總結(jié):因此session中適合存儲對安全性要求較高,但不需要長時間保存的數(shù)據(jù)。
  • Session的應(yīng)用:保存登錄狀態(tài)、保存驗證碼
    49、轉(zhuǎn)發(fā)和重定向的區(qū)別?
    轉(zhuǎn)發(fā):
    定義:
    請求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部資源的一種跳轉(zhuǎn)方式,即當(dāng)瀏覽器發(fā)送請求訪問服務(wù)器中的某一個資源(A)時,該資源將請求轉(zhuǎn)交給另外一個資源(B)進行處理并且由資源B做出響應(yīng)的過程,就叫做請求轉(zhuǎn)發(fā)。
    特點:
    1)轉(zhuǎn)發(fā)是一次請求,一次響應(yīng)
    (2)請求轉(zhuǎn)發(fā)前后,瀏覽器的地址欄地址不會發(fā)生變化。(瀏覽器–訪問–> A --轉(zhuǎn)發(fā)–> B,地址欄地址始終指向A的地址)
    (3)請求轉(zhuǎn)發(fā)前后的request對象是同一個(轉(zhuǎn)發(fā)前在A中的request和轉(zhuǎn)發(fā)到B后,B中的request對象和A中的request對象是同一個。基于這一點,可以通過request從A帶數(shù)據(jù)到B)
    (4)請求轉(zhuǎn)發(fā)前后的兩個資源必須屬于同一個Web應(yīng)用,否則將無法進行轉(zhuǎn)發(fā)。(A–轉(zhuǎn)發(fā)–>B,A和B必須屬于同一個Web應(yīng)用!)
    重定向:
    定義:
    當(dāng)瀏覽器向服務(wù)器發(fā)請求訪問某一個資源A,資源A在響應(yīng)時通知瀏覽器需要再進一步請求才能獲取到對應(yīng)的資源,瀏覽器再次發(fā)請求訪問服務(wù)器中的資源B,最終由資源B響應(yīng)瀏覽器要獲取的資源,這個過程叫做重定向。
    特點:
    (1)重定向是兩次請求、兩次響應(yīng)
    (2)重定向前后,瀏覽器的地址欄地址會發(fā)生變化。(因為兩次請求都是通過瀏覽器發(fā)起,瀏覽器知道這個跳轉(zhuǎn)的過程,因此地址欄地址會變化)
    (3)重定向前后的request對象不是同一個(因為重定向是兩次請求,服務(wù)器會根據(jù)兩次請求創(chuàng)建兩個不同的request對象,request對象不是同一個,也就不能在重定向時通過request帶數(shù)據(jù)到目的地。)
    (4)重定向前后的兩個資源可以是來自不同的web應(yīng)用,甚至可以是來自不同的服務(wù)器。(進行跳轉(zhuǎn)的兩個資源之間沒有限制)
    用處:
    (1)如果希望跳轉(zhuǎn)前后地址欄地址不會發(fā)生變化, 只能使用轉(zhuǎn)發(fā); 如果希望跳轉(zhuǎn)前后地址欄地址會發(fā)生變化, 只能使用重定向
    (2)如果希望在跳轉(zhuǎn)前后, 能夠通過request對象帶數(shù)據(jù)到目的地, 只能使用轉(zhuǎn)發(fā)
    (3)如果僅僅是做一個跳轉(zhuǎn),沒有其他要求,此時推薦使用轉(zhuǎn)發(fā)(轉(zhuǎn)發(fā)是一次請求,一次響應(yīng),可以減少訪問服務(wù)器的次數(shù),降低服務(wù)器的壓力)
    50、什么是jsp?
    ? JSP和Servlet都是由SUN公司提供的動態(tài)Web資源開發(fā)技術(shù)
    ? JSP看起來像一個HTML,但和HTML不同的是,JSP中可以書寫Java代碼,可以通過Java代碼展示動態(tài)的數(shù)據(jù)。
    ? JSP本質(zhì)上是一個Servlet程序
    在JSP第一次被訪問時,會翻譯成一個Servlet程序。訪問JSP后看到的html網(wǎng)頁,其實是翻譯后的Servlet執(zhí)行的結(jié)果。(也就是說,訪問JSP后看到的網(wǎng)頁,是JSP翻譯后的Servlet輸出到瀏覽器的。)
    51、jsp有多少內(nèi)置對象,分別說明?
    序號 內(nèi)置對象 對應(yīng) Servlet 類 作用
    1 request javax.servlet.http.HttpServletRequest 客戶端的請求信息:Http協(xié)議頭信息、Cookie、請求參數(shù)等
    2 response javax.servlet.http.HttpServletResponse 用于服務(wù)端響應(yīng)客戶端請求,返回信息
    3 pageContext javax.servlet.jsp.PageContext 頁面的上下文
    4 session javax.servlet.http.HttpSession 客戶端與服務(wù)端之間的會話
    5 application javax.servlet.ServletContext 用于獲取服務(wù)端應(yīng)用生命周期的信息
    6 out javax.servlet.jsp.JspWriter 用于服務(wù)端傳輸內(nèi)容到客戶端的輸出流
    7 config javax.servlet.ServletConfig 初始化時,Jsp 引擎向 Jsp 頁面?zhèn)鬟f的信息
    8 page java.lang.Object 指向 Jsp 頁面本身
    9 exception java.lang.Throwable 頁面發(fā)生異常,產(chǎn)生的異常對象
    JSP提供了由容器實現(xiàn)和管理的內(nèi)置對象,也可以稱之為隱含對象,由于JSP使用Java作為腳本語言,所以JSP將具有強大的對象處理能力,并且可以動態(tài)創(chuàng)建Web頁面內(nèi)容。但Java語法在使用一個對象前,需要先實例化這個對象,這其實是一件比較煩瑣的事情。JSP為了簡化開發(fā),提供了一些內(nèi)置對象,用來實現(xiàn)很多JSP應(yīng)用。在使用JSP內(nèi)置對象時,不需要先定義這些對象,直接使用即可。
    在JSP中一共預(yù)先定義了9個這樣的對象,分別為request、response、session、application、out、pageContext、config、page和exception。
    1、request對象
    request對象封裝了由客戶端生成的HTTP請求的所有細節(jié),主要包括HTTP頭信息、系統(tǒng)信息、請求方式和請求參數(shù)等。通過request對象提供的相應(yīng)方法可以處理客戶端瀏覽器提交的HTTP請求中的各項參數(shù)。
    request對象的常用方法:
  • 1.1 訪問請求參數(shù)
    我們知道request對象用于處理HTTP請求中的各項參數(shù)。在這些參數(shù)中,最常用的就是獲取訪問請求參數(shù)。當(dāng)我們通過超鏈接的形式發(fā)送請求時,可以為該請求傳遞參數(shù),這可以通過在超鏈接的后面加上問號“?”來實現(xiàn)。注意這個問號為英文半角的符號。
    如果要同時指定多個參數(shù),各參數(shù)間使用與符號“&”分隔即可。
    示例:在頁面中定義超鏈接。
    刪除
    在delete.jsp頁面中,可以通過request對象的getParameter()方法獲取傳遞的參數(shù)值。
    <%
    String id = request.getParameter(“id”); //獲取id參數(shù)的值
    %>
    示例:編程學(xué)員注冊功能。要求提交注冊信息后,顯示學(xué)員輸入的數(shù)據(jù)。
    (1)注冊頁面 reginput.jsp。
    <%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

    學(xué)員注冊 請輸入注冊信息
    用戶姓名:
    博客地址:
    備注信息:
    興趣愛好: 足球 籃球 羽毛球 乒乓球
    (2)注冊提交頁面 reginfo.jsp。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); //設(shè)置請求編碼 String name = request.getParameter("name"); //獲取用戶名 String blog = request.getParameter("blog"); //獲取博客地址 String remark = request.getParameter("remark"); //獲取備注信息 //獲取興趣愛好 String[] interests = request.getParameterValues("interests"); String interStr = ""; if(interests != null) { for(String item : interests) { interStr += item + ";"; } } %> 注冊信息 用戶姓名:<%= name %>
    博客地址:<%= blog %>
    備注信息:<%= remark %>
    興趣愛好:<%= interStr %> 執(zhí)行結(jié)果: (1)注冊頁面 reginput.jsp

    (2)注冊提交頁面 reginfo.jsp

    1.2 在作用域中管理屬性
    在進行請求轉(zhuǎn)發(fā)時,需要把一些數(shù)據(jù)傳遞到轉(zhuǎn)發(fā)后的頁面進行處理。這時,就需要使用request對象的setAttribute()方法將數(shù)據(jù)保存到request范圍內(nèi)的變量中。request對象的setAttribute()方法的語法格式如下:
    request.setAttribute(String name,Object object);
    在將數(shù)據(jù)保存到request范圍內(nèi)的變量中后,可以通過request對象的getAttribute()方法獲取該變量的值,具體的語法格式如下:
    request.getAttribute(String name)
    1.3 獲取cookie
    cookie的中文意思是小甜餅,然而在互聯(lián)網(wǎng)上的意思與這就完全不同了。它和食品完全沒有關(guān)系。在互聯(lián)網(wǎng)中,cookie是小段的文本信息,在網(wǎng)絡(luò)服務(wù)器上生成,并發(fā)送給瀏覽器的。通過使用cookie可以標(biāo)識用戶身份,記錄用戶名和密碼,跟蹤重復(fù)用戶等。瀏覽器將cookie以key/value的形式保存到客戶機的某個指定目錄中。
    通過cookie的getCookies()方法即可獲取到所有cookie對象的集合;通過cookie對象的getName()方法可以獲取到指定名稱的cookie;通過getValue()方法即可獲取到cookie對象的值。另外將一個cookie對象發(fā)送到客戶端使用了response對象的addCookie()方法。
    示例:通過cookie保存用戶信息。
    (1)寫入cookie對象頁面 index.jsp。
    <%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

    寫入cookie對象 <% //寫入cookie對象 request.setCharacterEncoding("UTF-8"); //設(shè)置請求的編碼 Cookie cookie = new Cookie("userCookie","您好,歡迎訪問pan_junbiao的博客!"); //創(chuàng)建并實例化cookie對象 cookie.setMaxAge(60*60*24*30); //設(shè)置cookie有效期為30天 response.addCookie(cookie); //保存cookie對象 %>

    (2)讀取cookie值頁面 deal.jsp。
    <%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

    讀取cookie值 <% //讀取cookie值 Cookie[] cookies = request.getCookies(); //從request中獲取cookie對象的集合 String user = ""; if(cookies != null) { //遍歷cookie對象集合 for(Cookie cookieItem : cookies) { if(cookieItem.getName().equals("userCookie")) { user = cookieItem.getValue(); //讀取cookie對象的的值 } } } %>

    讀取cookie值:

    用戶信息:<%= user %> 執(zhí)行結(jié)果:

    1.4 解決中文亂碼
    在上面的代碼中我們?yōu)閕d參數(shù)傳遞了一個字符串類型的值“001”,如果將這個參數(shù)的值更改為中文,則在show.jsp就會發(fā)生大家都不愿意看到的問題——在顯示參數(shù)值時中文內(nèi)容變成了亂碼。這是因為請求參數(shù)的文字編碼方式與頁面中的不一致所造成的,所有的request請求都是iso-8859-1的,而在此頁面采用的是UTF-8的編碼方式。要解決此問題,只要將獲取到的數(shù)據(jù)通過String的構(gòu)造方法使用指定的編碼類型重新構(gòu)造一個String對象即可正確地顯示出中文信息。

    解決中文亂碼 name參數(shù)的值為:<%=new String(request.getParameter("name").getBytes("iso-8859-1"),"UTF-8") %>
    sex參數(shù)的值為:<%=request.getParameter("sex") %> 1.5 獲取客戶端信息 通過request對象可以獲取客戶端的相關(guān)信息,如HTTP報頭信息,客戶信息提交方式、客戶端主機IP地址、端口號等。 request獲取客戶端信息的常用方法: 示例:使用request對象的相關(guān)方法獲取客戶端信息。

    <%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

    使用request對象的相關(guān)方法獲取客戶端信息 客戶提交信息的方式:<%=request.getMethod()%>
    使用的協(xié)議:<%=request.getProtocol()%>
    獲取發(fā)出請求字符串的客戶端地址:<%=request.getRequestURI()%>
    獲取發(fā)出請求字符串的客戶端地址:<%=request.getRequestURL()%>
    獲取提交數(shù)據(jù)的客戶端IP地址:<%=request.getRemoteAddr()%>
    獲取服務(wù)器端口號:<%=request.getServerPort()%>
    獲取服務(wù)器的名稱:<%=request.getServerName()%>
    獲取客戶端的主機名:<%=request.getRemoteHost()%>
    獲取客戶端所請求的腳本文件的文件路徑:<%=request.getServletPath()%>
    獲得Http協(xié)議定義的文件頭信息Host的值:<%=request.getHeader("host")%>
    獲得Http協(xié)議定義的文件頭信息User-Agent的值:<%=request.getHeader("user-agent")%>
    獲得Http協(xié)議定義的文件頭信息accept-language的值:<%=request.getHeader("accept-language")%>
    獲得請求文件的絕對路徑:<%=request.getRealPath("index.jsp")%> 執(zhí)行結(jié)果:

    1.6 顯示國際化信息
    瀏覽器可以通過accept-language的HTTP報頭向Web服務(wù)器指明它所使用的本地語言。request對象中的getLocale()和getLocales()方法允許JSP開發(fā)人員獲取這一信息,獲取的信息屬于java.util.Local類型。java.util.Local類型的對象封裝了一個國家和一種國家所使用的語言。使用這一信息,JSP開發(fā)者就可以使用語言所特有的信息作出響應(yīng)。
    示例:頁面信息國際化。
    <%
    java.util.Locale locale = request.getLocale();
    String str = “”;
    if(locale.equals(java.util.Locale.US))
    {
    str = “Hello, Welcome to pan_junbiao’s blog!”;
    }
    else if(locale.equals(java.util.Locale.CHINA))
    {
    str = “您好,歡迎訪問 pan_junbiao的博客!”;
    }
    %>

    <%= str %>

    2、response對象
    response對象用于響應(yīng)客戶請求,向客戶端輸出信息。它封裝了JSP產(chǎn)生的響應(yīng),并發(fā)送到客戶端以響應(yīng)客戶端的請求。請求的數(shù)據(jù)可以是各種數(shù)據(jù)類型,甚至是文件。response對象在JSP頁面內(nèi)有效。
    request對象的常用方法:
    sendRedirect(String path) 將網(wǎng)頁重定向到另一個頁面。
    setHeader(String name, String value) 設(shè)置HTTP響應(yīng)報頭信息。
    2.1 重定向網(wǎng)頁
    使用response對象提供的sendRedirect()方法可以將網(wǎng)頁重定向到另一個頁面。重定向操作支持將地址重定向到不同的主機上,這一點與轉(zhuǎn)發(fā)不同。在客戶端瀏覽器上將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。用戶可以從瀏覽器的地址欄中看到跳轉(zhuǎn)后的地址。進行重定向操作后,request中的屬性全部失效,并且開始一個新的request對象。sendRedirect()方法的語法格式如下:
    response.sendRedirect(String path);
    參數(shù)說明:
    path:用于指定目標(biāo)路徑,可以是相對路徑,也可以是不同主機的其他URL地址。
    示例:使用response對象提供的sendRedirect()方法重定向到登錄頁面。
    <%
    response.sendRedirect(“l(fā)ogin.jsp”); //重定向到登錄頁面
    %>
    2.2 處理HTTP文件頭
    通過response對象可以設(shè)置HTTP響應(yīng)報頭,其中,最常用的是禁用緩存、設(shè)置頁面自動刷新和定時跳轉(zhuǎn)網(wǎng)頁。下面分別進行介紹。
    設(shè)置HTTP響應(yīng)報頭方法的語法格式如下:
    response.setHeader(String name, String value);
    2.2.1 禁用緩存
    在默認(rèn)情況下,瀏覽器將會對顯示的網(wǎng)頁內(nèi)容進行緩存,這樣可以提高網(wǎng)頁的顯示速度。對于一些安全性要求比較高的網(wǎng)站,通常需要禁用緩存。
    示例:通過設(shè)置HTTP頭的方式實現(xiàn)禁用緩存。
    <%
    response.setHeader(“Cache-Control”, “no-store”);
    response.setDateHeader(“Expires”, 0);
    %>
    2.2.2 設(shè)置頁面自動刷新
    通過設(shè)置HTTP頭還可以實現(xiàn)頁面的自動刷新。
    示例:使頁面每隔10秒自動刷新一次。
    <%
    response.setHeader(“refresh”, “10”);
    %>
    2.2.3 定時跳轉(zhuǎn)網(wǎng)頁
    通過設(shè)置HTTP頭還可以實現(xiàn)定時跳轉(zhuǎn)頁面功能。
    示例:使頁面5秒后自動跳轉(zhuǎn)到指定的網(wǎng)頁。
    <%
    response.setHeader(“refresh”, “5;URL=login.jsp”);
    %>
    2.3 設(shè)置輸出緩沖
    通常情況下,服務(wù)器要輸出到客戶端的內(nèi)容不會直接寫到客戶端,而是先寫到一個輸出緩沖區(qū),在計算機術(shù)語中,緩沖區(qū)被定義為暫時放置輸入或輸出資料的內(nèi)存。實際上,緩沖區(qū)也可以這樣理解:在一個糧庫中,由于裝缷車隊的速度要快于傳送帶的傳輸速度,為了不造成裝缷車隊的浪費,糧庫設(shè)計了一個站臺,裝缷車隊可以先將運送的糧食缷到這個平臺上,然后讓傳送機慢慢傳送。糧庫的這個站臺就起到了緩沖的作用。
    response對象提供的對緩沖區(qū)進行配置的方法:
    flushBuffer() 強制將緩沖區(qū)的內(nèi)容輸出到客戶端。
    getBufferSize() 獲取響應(yīng)所使用的緩沖區(qū)的實際大小,如果沒有使用緩沖區(qū),則返回0。
    setBufferSize(int size) 設(shè)置緩沖區(qū)大小。
    reset() 清除緩沖區(qū)的內(nèi)容,同時清除狀態(tài)碼和報頭。
    isCommitted() 檢查服務(wù)器端是否已經(jīng)把數(shù)據(jù)寫入到可客戶端。
    示例:設(shè)置緩沖區(qū)的大小為32KB。
    <%
    response.setBufferSize(32);
    %>
    說明:如果將緩沖區(qū)的大小設(shè)置為0KB,則表示不緩沖。

    3、session對象
    session在網(wǎng)絡(luò)中被稱為會話。由于HTTP協(xié)議是一種無狀態(tài)協(xié)議,也就是當(dāng)一個客戶向服務(wù)器發(fā)出請求,服務(wù)器接收請求,并返回響應(yīng)后,該連接就結(jié)束了,而服務(wù)器并不保存相關(guān)的信息。為了彌補這一缺點,HTTP協(xié)議提供了session。通過session可以在應(yīng)用程序的Web頁面間進行跳轉(zhuǎn)時,保存用戶的狀態(tài),使整個用戶會話一直存在下去,直到關(guān)閉瀏覽器。但是,如果在一個會話中,客戶端長時間不向服務(wù)器發(fā)出請求,session對象就會自動消失。這個時間取決于服務(wù)器,例如,Tomcat服務(wù)器默認(rèn)為30分鐘。不過這個時間可以通過編寫程序進行修改。
    session對象的常用方法:
    示例:保存與獲取session對象信息。

    <%
    session.setAttribute(“UserName”, “pan_junbiao的博客”); //保存session對象
    String userName = session.getAttribute(“UserName”).toString(); //獲取session對象
    %>
    配置web.xml文件:
    如果使用的是Tomcat,可以向下面這樣配置web.xml文件:

    15

    超時以分鐘為單位,Tomcat中的默認(rèn)的超時時間是30分鐘。
    Servlet中的getMaxInactiveInterval( ) 方法以秒為單位返回超時時間。如果在web.xml中配置的是15分鐘,則getMaxInactiveInterval( ) 方法將會返回900。

    4、application對象
    application對象用于保存所有應(yīng)用中的共有數(shù)據(jù)。它在服務(wù)器啟動時自動創(chuàng)建,在服務(wù)器停止時銷毀。當(dāng)application對象沒有被銷毀時,所有用戶都可以共享該application對象。與session對象相比,application對象的生命周期更長,類似于系統(tǒng)的“全局變量”。
    application對象的常用方法:
    String getInitParameter(String name) 獲取已命名的應(yīng)用程序初始化參數(shù)值。
    Enumeration getInitParameterNames() 獲取所有已定義的應(yīng)用程序初始化參數(shù)名的枚舉。
    Enumeration getAttributeNames() 獲取所有application對象使用的屬性名。
    Object getAttribute(String name) 從application對象中獲取指定對象名。
    void setAttribute(String key,Object obj) 使用指定名稱和指定對象在application對象中進行關(guān)聯(lián)。
    void removeAttribute(String name) 從application對象中去掉指定名稱的屬性。
    4.1 訪問應(yīng)用程序初始化參數(shù)
    application對象提供了對應(yīng)用程序初始化參數(shù)進行訪問的方法。應(yīng)用程序初始化參數(shù)在web.xml文件中進行設(shè)置,web.xml文件位于Web應(yīng)用所在目錄下的WEB-INF子目錄中。在web.xml文件中通過標(biāo)記配置應(yīng)用程序初始化參數(shù)。
    示例:在web.xml文件中配置連接MySQL數(shù)據(jù)庫所需的url參數(shù)。

    url
    jdbc:mysql://127.0.0.1:3306/db_database


    application對象提供了兩種訪問應(yīng)用程序初始化參數(shù)的方法。
    4.1.1 getInitParameter(String name)方法
    String getInitParameter(String name)方法用于獲取已命名的應(yīng)用程序初始化參數(shù)值。
    示例:獲取上面web.xml文件中配置的url參數(shù)的值。
    <%
    String url = application.getInitParameter(“url”);
    %>
    4.1.2 getInitParameterNames()方法
    Enumeration getInitParameterNames()方法獲取所有已定義的應(yīng)用程序初始化參數(shù)名的枚舉。
    示例:使用getInitParameterNames()方法獲取web.xml文件中定義的全部應(yīng)用程序初始化參數(shù),并通過循環(huán)輸出。
    <%@ page import=“java.util.*” %>
    <%
    Enumeration enume = application.getInitParameterNames(); //獲取全部初始化參數(shù)
    while(enume.hasMoreElements())
    {
    String name = enume.nextElement(); //獲取參數(shù)名
    String value = application.getInitParameter(name); //獲取參數(shù)值
    out.println(name + “:”); //輸出參數(shù)名
    out.println(value); //輸出參數(shù)值
    }
    %>
    4.2 管理應(yīng)用程序環(huán)境屬性
    與session對象相同,也可以在application對象中設(shè)置屬性。與session對象不同的是,session只是在當(dāng)前客戶的會話范圍內(nèi)有效,當(dāng)超過保存時間,session對象就被收回;而application對象在整個應(yīng)用區(qū)域中都有效。
    <%
    application.setAttribute(“UserName”, “pan_junbiao的博客”); //保存application對象
    String userName = application.getAttribute(“UserName”).toString(); //獲取application對象
    %>

    5、out對象
    out對象用于在Web瀏覽器內(nèi)輸出信息,并且管理應(yīng)用服務(wù)器上的輸出緩沖區(qū)。在使用out對象輸出數(shù)據(jù)時,可以對數(shù)據(jù)緩沖區(qū)進行操作,及時清除緩沖區(qū)中的殘余數(shù)據(jù),為其他的輸出讓出緩沖空間。待數(shù)據(jù)輸出完畢后,要及時關(guān)閉輸出流。
    5.1 向客戶端輸出數(shù)據(jù)
    out對象一個最基本的應(yīng)用就是向客戶端瀏覽器輸出信息。out對象可以輸出各種數(shù)據(jù)類型的數(shù)據(jù),在輸出非字符串類型的數(shù)據(jù)時,會自動轉(zhuǎn)換為字符串進行輸出。out對象提供了print()和println()兩種向頁面中輸出信息的方法。
    5.1.1 print()方法
    示例:通過兩種方式向客戶端瀏覽器輸出文字。
    <%
    out.print(“您好,pan_junbiao的博客”);
    %>

    <%= “您好,pan_junbiao的博客” %>
    5.1.2 println()方法
    println()方法也可以用于向客戶端瀏覽器輸出信息,該方法輸出內(nèi)容后,還輸出一個換行符。
    示例:使用println()方法向客戶端瀏覽器輸出文字。

    <%out.println("使用println()方法向客戶端瀏覽器輸出文字:");out.println("您好!");out.println("歡迎訪問 pan_junbiao的博客");out.println("博客地址:https://blog.csdn.net/pan_junbiao"); %>

    說明:使用println()方法輸出內(nèi)容要有換行的效果,需要同時使用HTML的

    標(biāo)記括起來,否則無法顯示換行效果。
    執(zhí)行效果:

    5.2 管理響應(yīng)緩沖
    out對象的另一個比較重要的功能就是對緩沖區(qū)進行管理。通過調(diào)用out對象的clear()方法可以清除緩沖區(qū)的內(nèi)容。這類似于重置響應(yīng)流,以便重新開始操作。如果響應(yīng)已經(jīng)提交,則會有產(chǎn)生IOException異常的負作用。out對象還提供了另一種清除緩沖區(qū)內(nèi)容的方法,那就是clearBuffer()方法,通過該方法可以清除緩沖區(qū)的“當(dāng)前”內(nèi)容,而且即使內(nèi)容已經(jīng)提交給客戶端,也能夠訪問該方法。除了這兩個方法外,out對象還提供了其他用于管理緩沖區(qū)的方法。
    out對象用于管理緩沖區(qū)的方法如下:
    clear() 清除緩沖區(qū)中的內(nèi)容。
    clearBuffer() 清除當(dāng)前緩沖區(qū)中的內(nèi)容。
    flush() 刷新流。
    isAutoFlush() 檢測當(dāng)前緩沖區(qū)已滿時是自動清空,還是拋出異常。
    getBufferSize() 獲取緩沖區(qū)的大小。

    6、獲取會話范圍的pageContext對象
    獲取頁面上下文的pageContext對象是一個比較特殊的對象,通過它可以獲取JSP頁面的request、response、session、out、exception等對象。pageContext對象的創(chuàng)建和初始化都是由容器來完成的,JSP頁面中可以直接使用pageContext對象。
    pageContext對象的常用方法:
    forward(String relativeUrlPath) 把頁面轉(zhuǎn)發(fā)給另一個頁面。
    getAttribute(String name) 獲取參數(shù)值。
    getAttributeNamesInScope(int scope) 獲取某范圍的參數(shù)名稱的集合。
    getException() 獲取exception對象。
    getRequest() 獲取request對象。
    getResponse() 獲取response對象。
    getSession() 獲取session對象。
    getOut() 獲取out對象。
    setAttribute(String name,Object value) 為指定范圍內(nèi)的屬性設(shè)置屬性值。
    removeAttribute(String name) 刪除指定范圍內(nèi)的指定對象。
    說明:pageContext對象在實際JSP開發(fā)過程中很少使用,因為request和response等對象均為內(nèi)置對象,如果通過pageContext對象來調(diào)用這些對象比較麻煩。

    7、讀取web.xml配置信息的config對象
    config對象主要用于取得服務(wù)器的配置信息。當(dāng)一個Servlet初始化時,容器把某些信息通過config對象傳遞給這個Servlet。開發(fā)者可以在web.xml文件中為應(yīng)用程序環(huán)境中的Servlet程序和JSP頁面提供初始化參數(shù)。
    config對象的常用方法如下:
    getServletContext() 獲取Servlet上下文。
    getServletName() 獲取Servlet服務(wù)器名。
    getInitParameter(String name) 獲取服務(wù)器所有初始化參數(shù)名稱。
    getInitParameterNames() 獲取服務(wù)器中name參數(shù)的初始值。

    8、應(yīng)答或請求的page對象
    page對象代表JSP本身,只有在JSP頁面內(nèi)才是合法的。page對象本質(zhì)上是包含當(dāng)前Servlet接口引用的變量,可以看作是this關(guān)鍵字的別名。
    page對象的常用方法如下:
    getClass() 返回當(dāng)前Object的類。
    hashCode() 返回該Object的哈希代碼。
    toString() 把該Object類轉(zhuǎn)換成字符串。
    equals(Object obj) 比較該對象和指定的對象是否相等。
    示例:創(chuàng)建index.jsp文件,在該文件中調(diào)用page對象的各方法,并顯示返回結(jié)果。
    <%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

    page對象各方法的應(yīng)用 <%! Object object; //聲明一個Object型的變量 %>
    • getClass()方法的返回值:<%=page.getClass()%>
    • hashCode()方法的返回值:<%=page.hashCode()%>
    • toString()方法的返回值:<%=page.toString()%>
    • 與Object對象比較的返回值:<%=page.equals(object)%>
    • 與this對象比較的返回值:<%=page.equals(this)%>
    執(zhí)行結(jié)果: 9、獲取異常信息的exception對象 exception對象用來處理JSP文件執(zhí)行時發(fā)生的所有錯誤和異常,只有在page指令中設(shè)置 isErrorPage屬性值為true的頁面中才可以被使用,在一般的JSP頁面中使用該對象將無法編譯JSP文件。exception對象幾乎定義了所有異常情況,在Java程序中,可以使用try...catch關(guān)鍵字來處理異常情況,如果在JSP頁面中出現(xiàn)沒有捕獲到的異常,就會生成exception對象,并把exception對象傳送到在page指令中定義的錯誤頁面中,然后在錯誤頁面中處理相應(yīng)的exception對象。 exception對象的常用方法如下: getMessage() 返回exception對象的異常信息字符串。 getLocalizedMessage() 返回本地化的異常錯誤。 toString() 返回關(guān)于異常錯誤的簡單信息描述。 fillInStackTrace() 重寫異常錯誤的棧行軌跡。 示例:使用exception對象獲取異常信息。 (1)創(chuàng)建index.jsp文件,在該文件中,首先在page指令中定義errorPage屬性值為error.jsp,即指定顯示異常信息的頁面。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="error.jsp" %> 使用exception對象獲取異常信息 <% request.setAttribute("price", "12.5元"); //保存單價到request范圍內(nèi)的變量price中 float price = Float.parseFloat(request.getAttribute("price").toString()); //獲取單價,并轉(zhuǎn)換為float類型 %> (2)編寫error.jsp文件,將該頁面的page指令的 isErrorPage屬性值設(shè)置為true,并且輸出異常信息。 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true" %> 錯誤提示頁面 錯誤提示為:<%= exception.getMessage() %> 執(zhí)行結(jié)果:

    52、Jsp的域?qū)ο笥心男?#xff1f;
    四大域?qū)ο?#xff1a;
    (1)pageContext page 域-指當(dāng)前頁面,在當(dāng)前 jsp 頁面有效,跳到其它頁面失效
    (2)request request 域-指一次請求范圍內(nèi)有效,從 http 請求到服務(wù)器處理結(jié)束,返回響應(yīng)的整個過程。在這個過程中使用 forward(請求轉(zhuǎn)發(fā))方式跳轉(zhuǎn)多個 jsp,在這些頁面里你都可以使用這個變量
    (3)session session 域-指當(dāng)前會話有效范圍,瀏覽器從打開到關(guān)閉過程中,轉(zhuǎn)發(fā)、重定向均可以使用
    (4)application context 域-指只能在同一個 web 中使用,服務(wù)器未關(guān)閉或者重啟,數(shù)據(jù)就有效
    53、什么是Maven?為什么要用Maven?
    Maven: 翻譯為"專家"、“內(nèi)行”,是Apache下的一個純Java開發(fā)的一個開源項目。
    Maven是一個項目管理工具,使用Maven可以來管理企業(yè)級的Java項目開發(fā)及依賴JAr包的管理。
    使用Maven開發(fā),可以簡化項目配置,統(tǒng)一項目結(jié)構(gòu)。總之,Maven可以讓開發(fā)者的工作變得更簡單。
    傳統(tǒng)的項目(工程)中管理項目所依賴的jar包完全靠人工進行管理,而人工管理jar包可能會產(chǎn)生諸多問題。
    1、不使用Maven,采用傳統(tǒng)方式管理jar包的弊端:
    (1)在一些大型項目中會使用一些框架,比如SSM或者SSH框架,而框架中所包含的jar包非常多(甚至還依賴其他第三方的jar包),如果這些jar包我們手動去網(wǎng)上尋找,有些jar包不容易找到,比較麻煩。
    (2)傳統(tǒng)方式會將jar包添加到工程中,比如Java工程中將jar包放在工程根目錄或者放在自建的lib目錄下;JavaWeb工程會將jar包放在:/WEB-INF/lib目錄下,這樣會導(dǎo)致項目文件的體積暴增(例如,有些項目代碼本身體積可能僅僅幾兆,而加入jar包后,工程的體積可能會達到幾十兆甚至百兆)。
    (3)在傳統(tǒng)的Java項目中是將所有的jar包統(tǒng)一拷貝的同一目錄中,可能會存在jar包文件名稱沖突的問題!
    (4)在進行項目整合時,可能會出現(xiàn)jar包版本沖突的問題。
    (5)在傳統(tǒng)java項目中通過編譯(手動編譯或者在eclipse保存自動編譯)、測試(手動在main函數(shù)中測試、junit單元測試)、打包部署(手動打war包/手動發(fā)布)、運行(手動啟動tomcat運行),最終訪問程序。
    2、使用Maven來管理jar包的優(yōu)勢:
    (1)Maven團隊維護了一個非常全的Maven倉庫(中央倉庫),其中幾乎包含了所有的jar包,使用Maven創(chuàng)建的工程可以自動到Maven倉庫中下載jar包,方便且不易出錯。
    另外,在Maven構(gòu)建的項目中,如果要使用到一些框架,我們只需要引入框架的核心jar包,框架所依賴的其他第三方j(luò)ar包,Maven也會一并去下載。
    (2)在Maven構(gòu)建的項目中,不會將項目所依賴的jar包拷貝到每一個項目中,而是將jar包統(tǒng)一放在倉庫中管理,在項目中只需要引入jar包的位置(坐標(biāo))即可。這樣實現(xiàn)了jar包的復(fù)用。
    (3)Maven采用坐標(biāo)來管理倉庫中的jar包,其中的目錄結(jié)構(gòu)為【公司名稱+項目/產(chǎn)品名稱+版本號】,可以根據(jù)坐標(biāo)定位到具體的jar包。即使使用不同公司中同名的jar包,坐標(biāo)不同(目錄結(jié)構(gòu)不同),文件名也不會沖突。
    (4)Maven構(gòu)建的項目中,通過pom文件對項目中所依賴的jar包及版本進行統(tǒng)一管理,可避免版本沖突。
    (5)在Maven項目中,通過一個命令或者一鍵就可以實現(xiàn)項目的編譯(mvn complie)、測試(mvn test)、打包部署(mvn deploy)、運行(mvn install)等。
    還有發(fā)布到tomcat服務(wù)器中運行: mvn tomcat7:run。如果想實現(xiàn)上面的所有過程,只需要記住一個命令:mvn install
    總之,使用Maven遵循規(guī)范開發(fā)有利于提高大型團隊的開發(fā)效率,降低項目的維護成本,大公司都會優(yōu)先使用Maven來構(gòu)建項目.
    54、什么是mybatis?使用mybatis有什么優(yōu)勢?
    MyBatis 本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
    MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進行封裝,使開發(fā)者只需要關(guān)注SQL本身,而不需要花費精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過程代碼。
    Mybatis通過xml或注解的方式將要執(zhí)行的各種statement(statement、preparedStatemnt)配置起來,并通過java對象和statement中的sql進行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射成java對象并返回。
    總之,Mybatis對JDBC訪問數(shù)據(jù)庫的過程進行了封裝,簡化了JDBC代碼,解決JDBC將結(jié)果集封裝為Java對象的麻煩。
    1、使用傳統(tǒng)方式JDBC訪問數(shù)據(jù)庫:
    (1)使用JDBC訪問數(shù)據(jù)庫有大量重復(fù)代碼(比如注冊驅(qū)動、獲取連接、獲取傳輸器、釋放資源等);
    (2)JDBC自身沒有連接池,會頻繁的創(chuàng)建連接和關(guān)閉連接,效率低;
    (3)SQL是寫死在程序中,一旦修改SQL,需要對類重新編譯;
    (4)對查詢SQL執(zhí)行后返回的ResultSet對象,需要手動處理,有時會特別麻煩;

    2、使用mybatis框架訪問數(shù)據(jù)庫:
    (1)Mybatis對JDBC對了封裝,可以簡化JDBC代碼;
    (2)Mybatis自身支持連接池(也可以配置其他的連接池),因此可以提高程序的效率;
    (3)Mybatis是將SQL配置在mapper文件中,修改SQL只是修改配置文件,類不需要重新編譯。
    (4)對查詢SQL執(zhí)行后返回的ResultSet對象,Mybatis會幫我們處理,轉(zhuǎn)換成Java對象。

    總之,JDBC中所有的問題(代碼繁瑣、有太多重復(fù)代碼、需要操作太多對象、釋放資源、對結(jié)果的處理太麻煩等),在Mybatis框架中幾乎都得到了解決!!
    55、mybatis中#{}與${}的區(qū)別?
    #{}:
    相當(dāng)于JDBC中的問號(?)占位符,是為SQL語句中的參數(shù)值進行占位,大部分情況下都是使用#{}占位符;并且當(dāng)#{}占位符是為字符串或者日期類型的值進行占位時,在參數(shù)值傳過來替換占位符的同時,會進行轉(zhuǎn)義處理(在字符串或日期類型的值的兩邊加上單引號)
    ${}:
    是為SQL片段(字符串)進行占位,將傳過來的SQL片段直接拼接在 ${} 占位符所在的位置,不會進行任何的轉(zhuǎn)義處理。(由于是直接將參數(shù)拼接在SQL語句中,因此可能會引發(fā)SQL注入攻擊問題)
    需要注意的是:使用 ${} 占位符為SQL語句中的片段占位時,即使只有一個占位符,在傳遞
    對應(yīng)的值時,即使只有一個參數(shù),也需要將值存入map集合中!!也需要將參數(shù)先封裝再傳遞!
    56、什么是動態(tài)SQL?什么情況下使用動態(tài)SQL?
    動態(tài)SQL:code that is executed dynamically。就是(在進行sql操作的時候)動態(tài)的根據(jù)屬性值(所匹配的條件)來拼接數(shù)據(jù)庫執(zhí)行的sql語句,也就是多次查詢或變更操作,根據(jù)傳入的屬性值不同,動態(tài)拼接出不同的可執(zhí)行sql。包含判斷為空、循環(huán)等;
    查詢條件往往是這樣一種非常常見的邏輯:如果客戶填了查詢信息,則查詢該條件;如果客戶沒填,則返回所有數(shù)據(jù)。
    可組合成非常靈活的SQL語句,從而提高編程效率。
    57、動態(tài)SQL常用標(biāo)簽有哪些?
    Mybatis動態(tài)sql(有哪些)標(biāo)簽:
    1、:
    if是為了判斷傳入的值是否符合某種規(guī)則,比如是否不為空;
    2、:
    where標(biāo)簽可以用來做動態(tài)拼接查詢條件,當(dāng)和if標(biāo)簽配合的時候,不用顯示的聲明類似where 1=1這種無用的條件;
    3、:
    這是一組組合標(biāo)簽,他們的作用類似于 Java 中的 switch、case、default。只有一個條件生效,也就是只執(zhí)行滿足的條件 when,沒有滿足的條件就執(zhí)行 otherwise,表示默認(rèn)條件;
    4、:
    foreach標(biāo)簽可以把傳入的集合對象進行遍歷,然后把每一項的內(nèi)容作為參數(shù)傳到sql語句中,里面涉及到 item(具體的每一個對象), index(序號), open(開始符), close(結(jié)束符), separator(分隔符);
    5、:
    include可以把大量重復(fù)的代碼整理起來,當(dāng)使用的時候直接include即可,減少重復(fù)代碼的編寫;
    6、:
    適用于更新中,當(dāng)匹配某個條件后,才會對該字段進行更新操作
    7、:
    是一個格式化標(biāo)簽,主要有4個參數(shù):
    prefix(前綴);
    prefixOverrides(去掉第一個標(biāo)記);
    suffix(后綴);
    suffixOverrides(去掉最后一個標(biāo)記);
    58、什么是Spring?它的優(yōu)勢是什么?
    spring是分層的JavaSE及JavaEE應(yīng)用于全棧的輕量級開源框架,以IoC(Inverse Of Control:控制反轉(zhuǎn)/反轉(zhuǎn)控制)和AOP(Aspact Oriented Programming:面向切面編程)為核心,提供了表現(xiàn)層SpringMVC和持久層SpringJDBC以及業(yè)務(wù)層事務(wù)管理等眾多模塊的企業(yè)級應(yīng)用技術(shù),還能整合開源世界中眾多著名的第三方框架和類庫,逐漸成為使用最多的JavaEE企業(yè)應(yīng)用開源框架。
    優(yōu)勢:
    1).方便解耦,簡化開發(fā)
    通過 Spring提供的 IoC容器,可以將對象間的依賴關(guān)系交由Spring進行控制,避免硬編碼所造成的過度程序耦合。用戶也不必再為較為底層的需求編寫代碼,可以更專注于上層的應(yīng)用。
    2).AOP 編程的支持
    通過 Spring的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統(tǒng)OOP(Object Oriented Programming:面向?qū)ο缶幊?#xff09; 實現(xiàn)的功能可以通過 AOP 輕松應(yīng)付。
    3).聲明式事務(wù)的支持
    可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來,通過聲明式方式靈活的進行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。
    4).方便程序的測試
    可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。
    5).方便集成各種優(yōu)秀框架
    Spring可以降低各種框架的使用難度,提供了對各種優(yōu)秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
    6).降低 JavaEE API 的使用難度。
    Spring對 JavaEE API(如 JDBC、JavaMail、遠程調(diào)用等)進行了薄薄的封裝層,使這些API 的使用難度大為降低。
    7).Spring框架源碼是經(jīng)典學(xué)習(xí)范例
    Spring的源代碼設(shè)計精妙、結(jié)構(gòu)清晰、匠心獨用,處處體現(xiàn)著大師對Java設(shè)計模式靈活運用以及對 Java技術(shù)的高深造詣。它的源代碼無疑是Java技術(shù)的最佳實踐的范例。
    59、Spring的核心內(nèi)容是什么?
    Spring是一個無侵入式的輕量級開源框架
    Spring兩大特性 :
    1.IOC:控制反轉(zhuǎn)
    IOC作用:解除類與類之間的關(guān)系耦合
    解除耦合的方式用了四個技術(shù)點:

  • 配置
  • 容器
  • 反射
  • 注入(DI):利用set方法或者構(gòu)造器給屬性賦值
    2.AOP:面相切面編程
    作用:為了解除業(yè)務(wù)邏輯耦合,例如耦合或者數(shù)據(jù)業(yè)務(wù)邏輯日志業(yè)務(wù)
    AOP實現(xiàn)原理是基于代理的
    Spring進行內(nèi)部實現(xiàn)的時候 ,會檢測是否存在接口,存在時選擇jdk動態(tài)代理,不存在選擇CGLIB代理
    Spring類似一個管家,后期幾乎所有內(nèi)容都交給Spring管理,View層Spring不管理,與java相關(guān)的全部管理.(Spring容器)
    Spring的核心思想是解除程序中的耦合(解除了業(yè)務(wù)邏輯耦合,解除了類與類之間的關(guān)系耦合)
    輕量級與重量級的區(qū)分:
    1.性能開銷
    2.框架本身的大小問題
    3.使用的難易程度
    Spring中所有的行為都是基于Spring能夠管理所有的類
    Spring也有持久層框架,但是因為性能不強,所以沒有人用,用來給hibernate和mybitas支持
    Spring對web框架也是有支持的
    Spring還是一個mvc結(jié)構(gòu)的框架
    Core解除的是類級別的耦合
    AOP解除的是方法級別的耦合
    IOC控制反轉(zhuǎn) Inversion Of Control
    高層模塊不應(yīng)該依賴底層模塊(如Action依賴Dao層)
    實現(xiàn)必須依賴抽象,而不是是抽象依賴實現(xiàn)
    依賴注入:Dependency Injection
    DI是IOC的核心實現(xiàn)原理
    通俗的說就是利用set方法或者構(gòu)造器給屬性賦值
    59.Spring的核心內(nèi)容是什么?
    IOC、DI、AOP
    60.IOC、AOP各是什么
    spring的核心內(nèi)容就是控制反轉(zhuǎn)IOC、依賴注入DI和面向切面編程AOP
    IOC:傳統(tǒng)的JAVA開發(fā)模式中,當(dāng)需要一個對象時,我們使用new,直接或者間接調(diào)用構(gòu)造方法創(chuàng)建一個對象,而在Spring開發(fā)模式中,Spring容器使用工廠模式為我們創(chuàng)建了所需要的對象,不需要我們自己去創(chuàng)建了,直接調(diào)用Spring提供的對象就可以了,這就是控制反轉(zhuǎn)。
    DI:Spring使用JavaBean對象的set方法或者帶參數(shù)的構(gòu)造方法為我們在創(chuàng)建所需要對象時將其屬性自動設(shè)置為我們所需要的值的過程,這就是依賴注入。
    AOP:AOP即面向切面編程,是OOP編程的有效補充。使用AOP技術(shù),可以將一些系統(tǒng)性相關(guān)的編程工作,獨立提取出來,獨立實現(xiàn),然后通過切面切入進系統(tǒng)。從而避免了在業(yè)務(wù)邏輯的代碼中混入很多的系統(tǒng)相關(guān)的邏輯——比如權(quán)限管理,事物管理,日志記錄等
    61.什么是MVC?工作原理?
    MVC就是一種設(shè)計模式,它就是強制性使應(yīng)用程序的輸入,處理和輸出分開。將一個應(yīng)用程序分為三個部分:Model,View,Controller。
    springmvc的工作原理是:
    前端控制器(DispatcherServlet):主要負責(zé)捕獲來自客戶端的請求和調(diào)度各個組件。
    處理器映射器(HandlerMapping):根據(jù)url查找后端控制器Handler。
    處理器適配器(HandlerAdapter):執(zhí)行后端控制器(Handler),拿到后端控制器返回的結(jié)果ModelAndView后將結(jié)果返回給前端控制器DispatcherServlet。
    后端控制器(處理器)(Handler):主要負責(zé)處理前端請求,完成業(yè)務(wù)邏輯,生成ModelAndView對象返回給HandlerAdapter。
    視圖解析器(ViewResolver):主要負責(zé)將從DispatcherServlet中拿到的ModelAndView對象進行解析,生成View對象返回給DispatcherServlet。
    62.springboot?
    是一個腳手架一種全新的編程規(guī)范,他的產(chǎn)生簡化了框架的使 用,所謂簡化是指簡化了Spring眾多框架中所需的大量且繁瑣的配置 文件,主要作用是簡化配置文件。
    63.1.什么是AOP(Aspect Orient Programming)?解決了什么問題?應(yīng)用原理?應(yīng)用場景
    ?
    是一種設(shè)計思想,是軟件設(shè)計領(lǐng)域中的面向切面編程,它是面向?qū)ο缶幊?OOP)的一種補充和完善。它以通過預(yù)編譯方式和運行期動態(tài)代理方式,實現(xiàn)在不修改源代碼的情況下給程序動態(tài)統(tǒng)一添加額外功能的一種技術(shù)。
    2.解決的問題
    實際項目中我們通常將面向?qū)ο罄斫鉃橐粋€靜態(tài)過程(例如一個系統(tǒng)有多少個模塊,一個模塊有哪些對象,對象有哪些屬性),面向切面的運行期代理方式,理解為一個動態(tài)過程,可以在對象運行時動態(tài)織入一些擴展功能或控制對象執(zhí)行。
    3.應(yīng)用原理
    1)假如目標(biāo)對象(被代理對象)實現(xiàn)接口,則底層可以采用JDK動態(tài)代理機制為目標(biāo)對象創(chuàng)建代理對象(目標(biāo)類和代理類會實現(xiàn)共同接口)。
    2)假如目標(biāo)對象(被代理對象)沒有實現(xiàn)接口,則底層可以采用CGLIB代理機制為目標(biāo)對象創(chuàng)建代理對象(默認(rèn)創(chuàng)建的代理類會繼承目標(biāo)對象類型)。
    4.應(yīng)用場景
    實際項目中通常會將系統(tǒng)分為兩大部分,一部分是核心業(yè)務(wù),一部分是非核業(yè)務(wù)。在編程實現(xiàn)時我們首先要完成的是核心業(yè)務(wù)的實現(xiàn),非核心業(yè)務(wù)一般是通過特定方式切入到系統(tǒng)中,這種特定方式一般就是借助AOP進行實現(xiàn)。
    64.基本步驟: 切面/方面(Aspect)
    切入點(Pointcut)
    目標(biāo)對象(Target Object)
    AOP代理(AOP Proxy)
    過程:要利用切面,我們不直接在3個方法進行調(diào)用,將方法進行抽取出來分離關(guān)注點,被通知的對象Advice。
    spring會根據(jù)配制文件中配制的切入點去匹配target中方法的調(diào)用,從而知道哪些方法需要增加。
    當(dāng)客戶端調(diào)用這些方法時,直接調(diào)用的是代理對象的方法。
    AOP通過配制文件中配制的切入點與Advice,從而找到指定方法需要增強的功能。
    最終通過代理將Advice動態(tài)織入到指定方法。
  • 切面/方面(Aspect)
    切入點(Pointcut)
    目標(biāo)對象(Target Object)
    AOP代理(AOP Proxy)
    66.基于此依賴spring可以整合AspectJ框架快速完成AOP的基本實現(xiàn)。AspectJ 是一個面向切面的框架,他定義了AOP的一些語法,有一個專門的字節(jié)碼生成器來生成遵守java規(guī)范的class文件。
    @Aspect 注解用于標(biāo)識或者描述AOP中的切面類型,基于切面類型構(gòu)建的對象用于為目標(biāo)對象進行功能擴展或控制目標(biāo)對象的執(zhí)行。
    @Pointcut注解用于描述切面中的方法,并定義切面中的切入點(基于特定表達式的方式進行描述),在本案例中切入點表達式用的是bean表達式,這個表達式以bean開頭,bean括號中的內(nèi)容為一個spring管理的某個bean對象的名字。
    @Around注解用于描述切面中方法,這樣的方法會被認(rèn)為是一個環(huán)繞通知(核心業(yè)務(wù)方法執(zhí)行之前和之后要執(zhí)行的一個動作),@Aournd注解內(nèi)部value屬性的值為一個切入點表達式或者是切入點表達式的一個引用(這個引用為一個@PointCut注解描述的方法的方法名)。
    ProceedingJoinPoint類為一個連接點類型,此類型的對象用于封裝要執(zhí)行的目標(biāo)方法相關(guān)的一些信息。一般用于@Around注解描述的方法參數(shù)。
  • @Aspect 指定一個類為切面類
    @Pointcut(“execution(* cn.itcast.e_aop_anno..(…))”) 指定切入點表達式
    @Before(“pointCut_()”) 前置通知: 目標(biāo)方法之前執(zhí)行
    @After(“pointCut_()”) 后置通知:目標(biāo)方法之后執(zhí)行(始終執(zhí)行)
    @AfterReturning(“pointCut_()”) 返回后通知: 執(zhí)行方法結(jié)束前執(zhí)行(異常不執(zhí)行)
    @AfterThrowing(“pointCut_()”) 異常通知: 出現(xiàn)異常時候執(zhí)行
    @Around(“pointCut_()”) 環(huán)繞通知: 環(huán)繞目標(biāo)方法執(zhí)行
    68.啟用聲明式事務(wù)管理,在項目啟動類上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot項目)。
    將@Transactional注解添加到合適的業(yè)務(wù)類或方法上,并設(shè)置合適的屬性信息。
    69.
    1).啟動異步配置
    在基于注解方式的配置中,借助@EnableAsync注解進行異步啟動聲明,Spring Boot版的項目中,
    2).Spring中@Async注解應(yīng)用
    70.在業(yè)務(wù)方法中我們可能調(diào)用數(shù)據(jù)層方法獲取數(shù)據(jù)庫中數(shù)據(jù),假如訪問數(shù)據(jù)的頻率比較高,為了提高的查詢效率,降低數(shù)據(jù)庫的訪問壓力,可以在業(yè)務(wù)層對數(shù)據(jù)進行緩存.
    71. 1)良好的基因 因為SpringBoot是伴隨著Spring 4.0而生的,boot是引導(dǎo)的意思,也就是它的作用其實就是在于幫助開發(fā)者快速的搭建Spring框架,因此SpringBoot繼承了Spring優(yōu)秀的基因在Spring中開發(fā)更為方便快捷。
    2)簡化編碼 比如我們要創(chuàng)建一個web項目,使用 Spring 的朋友都知道,在使用 Spring 的時候,需要在 pom 文件中添加多個依賴,而 Spring Boot 則會幫助開發(fā)著快速啟動一個 web 容器,在 Spring Boot 中,我們只需要在 pom 文件中添加starter-web 依賴即可。
    3)簡化配置 Spring 雖然使Java EE輕量級框架,但由于其繁瑣的配置,一度被人認(rèn)為是“配置地獄”。各種XML、Annotation配置會讓人眼花繚亂,而且配置多的話,如果出錯了也很難找出原因。Spring Boot更多的是采用 Java Config 的方式,對 Spring 進行配置
    4)簡化部署 在使用 Spring 時,項目部署時需要我們在服務(wù)器上部署 tomcat,然后把項目打成 war 包扔到 tomcat里,在使用 Spring Boot 后,我們不需要在服務(wù)器上去部署 tomcat,因為 Spring Boot 內(nèi)嵌了 tomcat,我們只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目。
    另外,也降低對運行環(huán)境的基本要求,環(huán)境變量中有JDK即可
    5)簡化監(jiān)控 我們可以引入 spring-boot-start-actuator 依賴,直接使用 REST 方式來獲取進程的運行期性能參數(shù),從而達到監(jiān)控的目的,比較方便。但是 Spring Boot 只是個微框架,沒有提供相應(yīng)的服務(wù)發(fā)現(xiàn)與注冊的配套功能,沒有外圍監(jiān)控集成方案,沒有外圍安全管理方案,所以在微服務(wù)架構(gòu)中,還需要 Spring Cloud 來配合一起使用。
    72.Shiro是apache旗下一個開源安全框架(http://shiro.apache.org/),它將軟件系統(tǒng)的安全認(rèn)證相關(guān)的功能抽取出來,實現(xiàn)用戶身份認(rèn)證,權(quán)限授權(quán)、加密、會話管理等功能,組成了一個通用的安全認(rèn)證框架。使用shiro就可以非常快速的完成認(rèn)證、授權(quán)等功能的開發(fā),降低系統(tǒng)成本。
    73.Subject :主體對象,負責(zé)提交用戶認(rèn)證和授權(quán)信息。
    SecurityManager:安全管理器,負責(zé)認(rèn)證,授權(quán)等業(yè)務(wù)實現(xiàn)。
    Realm:領(lǐng)域?qū)ο?#xff0c;負責(zé)從數(shù)據(jù)層獲取業(yè)務(wù)數(shù)據(jù)。
    74.系統(tǒng)調(diào)用subject的login方法將用戶信息提交給SecurityManager
    SecurityManager將認(rèn)證操作委托給認(rèn)證器對象Authenticator
    Authenticator將用戶輸入的身份信息傳遞給Realm。
    Realm訪問數(shù)據(jù)庫獲取用戶信息然后對信息進行封裝并返回。
    Authenticator 對realm返回的信息進行身份認(rèn)證。
    75.系統(tǒng)調(diào)用subject相關(guān)方法將用戶信息(例如isPermitted)遞交給SecurityManager。
    SecurityManager將權(quán)限檢測操作委托給Authorizer對象。
    Authorizer將用戶信息委托給realm。
    Realm訪問數(shù)據(jù)庫獲取用戶權(quán)限信息并封裝。
    Authorizer對用戶授權(quán)信息進行判定。
    76.當(dāng)我們進行授權(quán)操作時,每次都會從數(shù)據(jù)庫查詢用戶權(quán)限信息,為了提高授權(quán)性能,可以將用戶權(quán)限信息查詢出來以后進行緩存,下次授權(quán)時從緩存取數(shù)據(jù)即可。
    77.客戶端業(yè)務(wù)實現(xiàn)
    在頁面上選中記住我,然后執(zhí)行提交操作,將用戶名,密碼,記住我對應(yīng)的值提交到控制層
    服務(wù)端業(yè)務(wù)實現(xiàn)
    在SysUserController中的doLogin方法中基于是否選中記住我,設(shè)置token的setRememberMe方法。
    78.使用shiro框架實現(xiàn)認(rèn)證操作,用戶登錄成功會將用戶信息寫入到會話對象中,其默認(rèn)時長為30分鐘,

    總結(jié)

    以上是生活随笔為你收集整理的Java-ZZH1-78面试题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。