Java-ZZH1-78面试题
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
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):
當(dāng)線程對象對創(chuàng)建后,即進入了新建狀態(tài),如:Thread t = new MyThread();
當(dāng)調(diào)用線程對象的start()方法(t.start();),線程即進入就緒狀態(tài)。處于就緒狀態(tài)的線程,只是說明此線程已經(jīng)做好了準(zhǔn)備,隨時等待CPU調(diào)度執(zhí)行,并不是說執(zhí)行了t.start()此線程立即就會執(zhí)行;
當(dāng)CPU開始調(diào)度處于就緒狀態(tài)的線程時,此時線程才得以真正執(zhí)行,即進入到運行狀態(tài)。注:就緒狀態(tài)是進入到運行狀態(tài)的唯一入口,也就是說,線程要想進入運行狀態(tài)執(zhí)行,首先必須處于就緒狀態(tài)中;
處于運行狀態(tài)中的線程由于某種原因,暫時放棄對CPU的使用權(quán),停止執(zhí)行,此時進入阻塞狀態(tài),直到其進入到就緒狀態(tài),才有機會再次被CPU調(diào)用以進入到運行狀態(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)。
線程執(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.表單一般包含哪些元素?
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配置,所以不需要我們手動配置。
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的API
Session
session是一個域?qū)ο?br /> 總結(jié):兩者的區(qū)別
Cookie和session都屬于會話技術(shù),都可以保存會話中產(chǎn)生的數(shù)據(jù),但由于cookie和session的工作原理和特點不同,因此兩者的應(yīng)用場景也不一樣。
? Cookie的特點:
? Session的特點
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”%>
| 用戶姓名: | |
| 博客地址: | |
| 備注信息: | |
| 興趣愛好: | 足球 籃球 羽毛球 乒乓球 |
博客地址:<%= 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”%>
(2)讀取cookie值頁面 deal.jsp。
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
讀取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對象即可正確地顯示出中文信息。
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()方法向客戶端瀏覽器輸出文字。
說明:使用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”%>
- getClass()方法的返回值:<%=page.getClass()%>
- hashCode()方法的返回值:<%=page.hashCode()%>
- toString()方法的返回值:<%=page.toString()%>
- 與Object對象比較的返回值:<%=page.equals(object)%>
- 與this對象比較的返回值:<%=page.equals(this)%>
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ù)點:
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)織入到指定方法。
切入點(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QLineEdit setFocus失效
- 下一篇: Java核心基础知识汇总