Java-ZZH1-78面试题
ZZH 1-78
hollerJAVA總結
目錄
總結 1
1.JDK 1
1、 JAVA開發工具(jdk\bin) 1
2、 基礎開發庫(jdk\jre\lib\rt.jar) 1
3、 基礎開發庫的源碼(jdk\src.zip) 1
2.基本類型(八種) 1
整數型 1
浮點型 2
3.運算符 2
算術運算符 + - * / 2
比較運算符 2
邏輯運算符 2
三元運算符 3
三項運算 3
賦值運算符 3
賦值運算 3
復合的賦值運算 3
4.循環結構 3
for(開始條件;循環條件;更改條件){ 4
嵌套for循環 4
5:break和continue 4
break: 中斷當前循環,簡單粗暴 4
continue:跳出本次循環,進入下一輪 5
while 5
do-while 6
6:數組 6
動態初始化:int[] a = new int[5]; 6
靜態初始化1:int[] a ={1,2,3,4,5,6,7,8}; 6
數組的長度 6
數組的遍歷 7
數組工具類Arrays 7
Arrays.sort(數組) 7
Arrays.copyOf(數組,新的長度) 7
7.方法 8
方法的重載 8
8.字符串 8
9.equals與==的區別 8
10.面向對象 9
三大特征 9
11.方法重寫與重載 9
重寫(Override) 9
重載(Overload) 10
12.抽象類 接口 10
抽象類: 10
接口 10
接口的實現 11
抽象類 接口的區別 11
13.訪問控制權限4種 11
public? 公開的 12
protected? 受保護的 12
private? ?私有的 12
default?? 默認 12
14.多線程 12
線程(thread) 12
15.集合 14
集合:集合是java中提供的一種容器,可以用來存儲多個數據。 15
Collection:單列集合類的根接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。 15
List的特點是元素有序、元素可重復。Set的特點是元素無序,而且不可重復。List接口的主要實現類有java.util.ArrayList和java.util.LinkedList, 15
Set接口的主要實現類有java.util.HashSet和java.util.TreeSet。 15
Collection 常用功能 15
Iterator接口 15
泛型:可以在類或方法中預支地使用未知的類型。一般在創建對象時,將未知的類型確定具體的類型。當沒有指定泛型時,默認類型為Object類型。 16
16.IO流 16
字節流 17
字節文件操作流 17
字節緩沖流(高效流) 17
字符流 17
字符轉換流 18
字符緩沖流(高效流) 18
17.什么是數據庫? 18
18.mysql數據類型有哪些? 19
1、數值類型 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、默認值約束 (Default) 21
6、自增約束(AUTO_INCREMENT) 21
20.什么是事務?事物的特點?事物的作用? 22
21.什么是JDBC? 22
22.JDBC連接數據庫的過程? 22
6.釋放資源 23
23.如何防止sql注入攻擊? 23
如何防止SQL注入攻擊? 23
24.什么是連接池?使用連接池的好處? 23
連接池: 23
好處: 24
25.什么是HTML? 24
26.html的結構是什么樣的? 24
(1)<!DOCTYPEHTML> 24
(2) 24
(3) 25
(4) 25
(5)<metacharset=“utf-8”/> 25
27.什么是HTML的標簽和屬性? 25
28.什么是超鏈接?有哪些屬性? 25
29.表單一般包含哪些元素? 26
30.什么是css? 26
31.在HTML中引入css的方式有幾種?優先級 26
方式1:通過style屬性引入css(不推薦) 26
方式2:通過style標簽引入css 26
方式3:通過link鏈接引入外部的css文件 27
32.css的選擇器有哪些? 27
33.css元素類型有哪些?塊、行內元素 28
元素類型分類: 28
塊狀元素特點: 28
內聯元素特點: 28
34.什么是JS?有什么特點?優勢是什么? 28
全稱叫做JavaScript,簡稱叫做JS 28
特點: 29
優勢: 29
35.在HTML中如何引入js? 29
1、在script標簽內部可以書寫JS代碼:36.js如何獲取表單內容? 30
2、通過script標簽引入外部的JS文件 30
37.什么是JQ?有什么優勢? 30
jQuery是一門輕量的、免費開源的JS函數庫(就是JS的簡單框架) 30
優勢: 30
38.如何引入JQ? 31
39.JQuery的常用選擇器有哪些? 31
1、基本選擇器: 31
2、層級選擇器 32
3、基本過濾選擇器 32
4、可見性過濾選擇器 33
40、什么是服務器?什么 是web服務器? 33
服務器: 33
web服務器: 34
41、tomcat默認端口是什么?如何修改? 34
Tomcat端口號: 34
修改端口: 34
42、什么是Http協議?Http協議在工作時遵循什么原則? 41
Http協議: 41
遵循原則: 41
43、請求方式GET和POST 的區別? 41
44、什么是Servlet?Servlet的作用是什么? 42
Servlet: 42
作用: 43
45、如何開發一個Servlet程序? 44
開發Servlet程序的步驟 44
使用Eclipse創建Servlet 46
1、選中項目中的src目錄,鼠標右鍵 —> New —> Servlet 46
2、在彈出的窗口中,根據提示填寫內容 47
3、點擊finish即可完成Servlet創建過程, 創建好的Servlet如下: 47
46、Servlet生命周期是什么? 51
47、Servlet數據傳遞的范圍有幾種?分別是什么? 51
48、什么是Cookie和Session? 52
Cookie 53
Session 53
總結:兩者的區別 53
49、轉發和重定向的區別? 55
轉發: 55
重定向: 55
50、什么是jsp? 56
51、jsp有多少內置對象,分別說明? 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、應答或請求的page對象 80
9、獲取異常信息的exception對象 81
52、Jsp的域對象有哪些? 83
Maven: 翻譯為"專家"、“內行”,是Apache下的一個純Java開發的一個開源項目。 84
54、什么是mybatis?使用mybatis有什么優勢? 86
55、mybatis中#{}與${}的區別? 87
#{}: 88
相當于JDBC中的問號(?)占位符,是為SQL語句中的參數值進行占位,大部分情況下都是使用#{}占位符;并且當#{}占位符是為字符串或者日期類型的值進行占位時,在參數值傳過來替換占位符的同時,會進行轉義處理(在字符串或日期類型的值的兩邊加上單引號) 88
${}: 88
56、什么是動態SQL?什么情況下使用動態SQL? 88
57、動態SQL常用標簽有哪些? 88
Mybatis動態sql(有哪些)標簽: 88
58、什么是Spring?它的優勢是什么? 90
59、Spring的核心內容是什么? 91
60.IOC、AOP各是什么 93
61.什么是MVC?工作原理? 94
MVC就是一種設計模式,它就是強制性使應用程序的輸入,處理和輸出分開。將一個應用程序分為三個部分:Model,View,Controller。 94
springmvc的工作原理是: 94
62.springboot? 95
63.1.什么是AOP(Aspect Orient Programming)?解決了什么問題?應用原理?應用場景 95
? 95
2.解決的問題 95
3.應用原理 95
4.應用場景 96
總結
1.JDK
是 Java 語言的軟件開發工具包,主要用于移動設備、嵌入式設備上的java應用程序。JDK是整個java開發的核心。
它包含了:
1、 JAVA開發工具(jdk\bin)
2、 基礎開發庫(jdk\jre\lib\rt.jar)
3、 基礎開發庫的源碼(jdk\src.zip)
2.基本類型(八種)
整數型
byte 1 -27到27-1 或者 -128到127
short 2 -215到215-1
int 4 -231到231-1
long 8 -263到263-1
浮點型
float 4 單精度,對小數部分的精度要求不高
double 8 雙精度,精確的小數部分并操作值很大時
字符
char 2 0到65535
布爾
boolean 1 真true 假false
3.運算符
算術運算符 + - * /
基本運算 % 取余數,求模,算整除
++ – 自增 自減
比較運算符
== 相等比較
!= 不等比較
邏輯運算符
&& & 邏輯與(短路與),兩邊同為真結果才為真
|| | 邏輯或(短路或),兩邊只要有一個真結果就是真
- 字符串連接
! 非,非真是假,非假是真
三元運算符
?:
三項運算
1?2:3
1是真取2,1是假取3
賦值運算符
=
賦值運算
+= -=
*= /=
復合的賦值運算
a+=2;//a=a+2
4.循環結構
循環結構是指在程序中需要反復執行某個功能而設置的一種程序結構。
它由循環體中的條件,判斷繼續執行某個功能還是退出循環。
根據判斷條件,循環結構又可細分為先判斷后執行的循環結構和先執行后判斷的循環結構
for(開始條件;循環條件;更改條件){
循環體代碼…
}
嵌套for循環
根據外層的條件,判斷里層能否執行,如果能執行,就把里層代碼都循環完畢后,再繼續執行外層,繼續判斷
for(…){
for(…){
}
}
5:break和continue
用來終止循環,可以用兩種方式
break: 中斷當前循環,簡單粗暴
for(){
代碼1
if(條件){
代碼3…
break;//如果成立,直接跳出這個for循環
}
代碼2…
}
continue:跳出本次循環,進入下一輪
for(){
代碼1
if(條件){
代碼3…
continue;//如果成立,跳出本次for循環,進入下一輪
}
代碼2…
}
while
先判斷,再執行
while(執行條件){
代碼…
}
do-while
先執行,再判斷
do{
代碼…
}while(執行條件);
6:數組
概念:數組Array是用于儲存多個相同類型數據的集合。
想要獲取數組中的元素值,可以通過元素的下標來獲取,下標是從0開始的。
動態初始化:int[] a = new int[5];
靜態初始化1:int[] a ={1,2,3,4,5,6,7,8};
靜態初始化2:int[] a =new int[]{1,2,3,4,5};
數組的長度
? length屬性獲取數組長度
? 數組一旦創建,長度不可變
? 允許0長度的數組
數組的遍歷
從頭到尾,依次訪問數組的位置。
形式
for(int i=0;i<a.length;i++){
syso(a[i]);
}
數組工具類Arrays
Arrays.toString(數組)
把數組里的數據,用逗號連接成一個字符串。
格式:[10, 14, 20, 46, 51]
Arrays.sort(數組)
對數組排序,對于基本類型的數組使用優化后的快速排序算法,效率高。
對引用類型數組,使用優化后的合并排序算法。
Arrays.copyOf(數組,新的長度)
把數組復制成一個指定長度的新數組。
新數組長度大于原數組,相當于復制,并增加位置。–數組的擴容
新數組長度小于原數組,相當于截取前一部分數據。–數組的縮容
7.方法
被命名的代碼塊,方法可以含參數可以不含參數
可以提高代碼的復用性
修飾符 返回值 方法名(【參數】){
方法體;
}
方法的重載
概念:方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數列表(也就是說參數的個數和類型不同)。
程序調用方法時,可以通過傳遞給它們的不同個數和類型的參數來決定具體使用哪個方法。
8.字符串
String 字符串常量
StringBuffer 字符串變量(線程安全的)
StringBuilder 字符串變量(非線程安全的)
9.equals與的區別
當比較基本類型時,用
當比較的元素為引用類型時,==比較的是內存地址
== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作
equals比較引用類型,比較的是值,而不是地址
10.面向對象
所謂的面向對象是一種編程思想,通過這種思想可以把生活中的復雜事情變得簡單化,從原來的執行者變成了指揮者,面向對象是基于面向過程而言的。
我們經常說的面向對象的編程實現(OOP,Object Oriented Programming)
三大特征
1、 封裝性,把相關的數據封裝成一個“類”組件
2、 繼承性,是子類自動共享父類屬性和方法,這是類之間的一種關系
3、 多態,增強軟件的靈活性和重用性
11.方法重寫與重載
重寫(Override)
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫, 返回值和形參都不能改變。即外殼不變,核心重寫!
重寫的好處在于子類可以根據需要,定義特定于自己的行為。 也就是說子類能夠根據需要實現父類的方法。
重載(Overload)
重載(overloading) 是在一個類里面,方法名字相同,而參數不同。返回類型可以相同也可以不同。
每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
最常用的地方就是構造器的重載。
方法重載是一個類的多態性表現,而方法重寫是子類與父類的一種多態性表現。
12.抽象類 接口
抽象類:
包含抽象方法的類稱為抽象類,但并不意味著抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。
抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認為public。
抽象類不能用來創建對象;
如果一個類繼承于一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
接口
接口聲明
關鍵字:interface ? ? ??public interface ?接口名 {}
接口體
常量(沒有變量) ?( public static final ) int MAX = 100; ? ? 可以省略public static final
抽象方法 (public abstract) void add(); 可以省略public abstract
常量和抽象方法都只有一種訪問修飾符:public
接口默認提供 ?public,static,final,abstract 關鍵字
接口的實現
關鍵字:implements
接口中定義的常量,在繼承了接口的類中可以直接使用。?
抽象類 接口的區別
1.抽象類可以提供成員方法的實現細節,而接口中只能存在public abstract 方法;
2.抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3.接口中不能含有靜態代碼塊以及靜態方法,而抽象類可以有靜態代碼塊和靜態方法;
4.一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。
13.訪問控制權限4種
1.訪問控制權限有:
public? 公開的
protected? 受保護的
private? ?私有的
default?? 默認
2.private:表示私有的,只能在本類中訪問。
? public:表示公開的,在任何位置都可以訪問。
? default:表示只能在本類,以及同包下訪問。
? protected:表示只能在本類、同包、子類中訪問。
范圍從大到小排序:public>protected>default>private
3.訪問控制權限修飾符還可以修飾:屬性、方法、類(public和default,其他不行)、接口(public和default能用,其他不行 )
14.多線程
線程(thread)
是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一個進程可以開啟多個線程。
多線程擴展了多進程的概念,使得同一個進程可以同時并發處理多個任務。
簡而言之,一個程序運行后至少一個進程,一個進程里包含多個線程。
如果一個進程只有一個線程,這種程序被稱為單線程。
如果一個進程中有多條執行路徑被稱為多線程程序。
一個操作系統中可以有多個進程,一個進程中可以有多個線程,每個進程有自己獨立的內存,每個線程共享一個進程中的內存,每個線程又有自己獨立的內存
線程生命周期,總共有五種狀態:
當線程對象對創建后,即進入了新建狀態,如:Thread t = new MyThread();
當調用線程對象的start()方法(t.start();),線程即進入就緒狀態。處于就緒狀態的線程,只是說明此線程已經做好了準備,隨時等待CPU調度執行,并不是說執行了t.start()此線程立即就會執行;
當CPU開始調度處于就緒狀態的線程時,此時線程才得以真正執行,即進入到運行狀態。注:就緒狀態是進入到運行狀態的唯一入口,也就是說,線程要想進入運行狀態執行,首先必須處于就緒狀態中;
處于運行狀態中的線程由于某種原因,暫時放棄對CPU的使用權,停止執行,此時進入阻塞狀態,直到其進入到就緒狀態,才有機會再次被CPU調用以進入到運行狀態;
a) 等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態;
b) 同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態;
c) 其他阻塞:
通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
多線程實現方式主要有三種:繼承Thread類、實現Runnable接口、使用ExecutorService、Callable、Future實現有返回結果的多線程。其中前兩種方式線程執行完后都沒有返回值,只有最后一種是帶返回值的
把有可能出現問題的代碼包起來,一次只讓一個線程執行。通過sychronized關鍵字實現同步。
當多個對象操作共享數據時,可以使用同步鎖解決線程安全問題。 synchronized
15.集合
集合:集合是java中提供的一種容器,可以用來存儲多個數據。
Collection:單列集合類的根接口,用于存儲一系列符合某種規則的元素,它有兩個重要的子接口,分別是java.util.List和java.util.Set。
List的特點是元素有序、元素可重復。Set的特點是元素無序,而且不可重復。List接口的主要實現類有java.util.ArrayList和java.util.LinkedList,
Set接口的主要實現類有java.util.HashSet和java.util.TreeSet。
Collection 常用功能
Collection是所有單列集合的父接口,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可用于操作所有的單列集合。方法如下:
public boolean add(E e): 把給定的對象添加到當前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e): 把給定的對象在當前集合中刪除。
public boolean contains(E e): 判斷當前集合中是否包含給定的對象。
public boolean isEmpty(): 判斷當前集合是否為空。
public int size(): 返回集合中元素的個數。
public Object[] toArray(): 把集合中的元素,存儲到數組中
Iterator接口
JDK專門提供了一個接口java.util.Iterator,遍歷集合中的所有元素。
Iterator接口也是Java集合中的一員,但它與Collection、Map接口有所不同,
Collection接口與Map接口主要用于存儲元素,而Iterator主要用于迭代訪問(即遍歷)Collection中的元素,因此Iterator對象也被稱為迭代器。
想要遍歷Collection集合,那么就要獲取該集合迭代器完成迭代操作,獲取迭代器的方法:
public Iterator iterator(): 獲取集合對應的迭代器,用來遍歷集合中的元素的。
Iterator接口的常用方法如下:
public E next():返回迭代的下一個元素。
public boolean hasNext():如果仍有元素可以迭代,則返回 true。
集合中是可以存放任意對象的,只要把對象存儲集合后,那么這時他們都會被提升成Object類型。當我們在取出每一個對象,并且進行相應的操作,這時必須采用類型轉換。
泛型:可以在類或方法中預支地使用未知的類型。一般在創建對象時,將未知的類型確定具體的類型。當沒有指定泛型時,默認類型為Object類型。
16.IO流
Java對數據的操作是通過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用于操作流的對象都在IO包中。
字節流
InputStream
InputStream:字節輸入流基類,抽象類是表示字節輸入流的所有類的超類
OutputStream
OutputStream:字節輸出流基類,抽象類是表示輸出字節流的所有類的超類。
字節文件操作流
FileInputStream
FileInputStream:字節文件輸入流,從文件系統中的某個文件中獲得輸入字節,用于讀取諸如圖像數據之類的原始字節流
FileOutputStream
FileOutputStream:字節文件輸出流是用于將數據寫入到File,從程序中寫入到其他位置。
字節緩沖流(高效流)
BufferedInputStream
BufferedInputStream:字節緩沖輸入流,提高了讀取效率。
BufferedOutputStream
BufferedOutputStream:字節緩沖輸出流,提高了寫出效率。
字符流
Reader
Reader:讀取字符流的抽象類.
Writer
Writer:寫入字符流的抽象類
字符轉換流
InputStreamReader
InputStreamReader:字節流轉字符流,它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。
OutputStreamWriter
OutputStreamWriter:字節流轉字符流。
字符緩沖流(高效流)
BufferedReader
BufferedReader:字符緩沖流,從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
BufferedWriter
BufferedWriter:字符緩沖流,將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
17.什么是數據庫?
數據庫是數據管理的有效技術,是由一批數據構成的有序集合,這些數據被存放在結構化的數據表里。數據表之間相互關聯,反映客觀事物間的本質聯系。數據庫能有效地幫助一個組織或企業科學地管理各類信息資源。
數據是數據庫中存儲的基本對象,是按一定順序排列組合的物理符號。數據有多種表現形式,可以是數字、文字、圖像,甚至是音頻或視頻,它們都可以經過數字化后存入計算機。
數據庫是數據的集合,具有統一的結構形式并存放于統一的存儲介質內,是多種應用數據的集成,并可被各個應用程序所共享
18.mysql數據類型有哪些?
MySQL支持多種類型,大致可以分為四類:數值型、浮點型、日期/時間和字符串(字符)類型。
1、數值類型
MySQL支持所有標準SQL數值數據類型。
這些數值類型包括嚴格數值數據類型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似數值數據類型(FLOAT、REAL和DOUBLE PRECISION)。
關鍵字INT是INTEGER的同義詞,關鍵字DEC是DECIMAL的同義詞。
2、 浮點型 float double
3.日期和時間類型
表示時間值的日期和時間類型為DATETIME、DATE、TIMESTAMP、TIME和YEAR。
每個時間類型有一個有效值范圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
4 字符串類型
字符串類型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。
19.mysql的約束有哪些?
1、非空約束(not null)
非空約束用于確保當前列的值不為空值,非空約束只能出現在表對象的列上。Null類型特征:所有的類型的值都可以是null,包括int、float 等數據類型
2、唯一性約束(unique)
唯一約束是指定table的列或列組合不能重復,保證數據的唯一性。唯一約束不允許出現重復的值,但是可以為多個null。同一個表可以有多個唯一約束,多個列組合的約束。在創建唯一約束時,如果不給唯一約束名稱,就默認和列名相同。唯一約束不僅可以在一個表內創建,而且可以同時多表創建組合唯一約束。
3、主鍵約束(primary key)
PK主鍵約束相當于 唯一約束 + 非空約束 的組合,主鍵約束列不允許重復,也不允許出現空值。每個表最多只允許一個主鍵,建立主鍵約束可以在列級別創建,也可以在表級別創建。當創建主鍵的約束時,系統默認會在所在的列和列組合上建立對應的唯一索引。
4、外鍵約束(foreign key)
FK外鍵約束是用來加強兩個表(主表和從表)的一列或多列數據之間的連接的,可以保證一個或兩個表之間的參照完整性,外鍵是構建于一個表的兩個字段或是兩個表的兩個字段之間的參照關系。創建外鍵約束的順序是先定義主表的主鍵,然后定義從表的外鍵。也就是說只有主表的主鍵才能被從表用來作為外鍵使用,被約束的從表中的列可以不是主鍵,主表限制了從表更新和插入的操作。
5、默認值約束 (Default)
若在表中定義了默認值約束,用戶在插入新的數據行時,如果該行沒有指定數據,那么系統將默認值賦給該列,如果我們不設置默認值,系統默認為NULL。
6、自增約束(AUTO_INCREMENT)
自增約束(AUTO_INCREMENT)可以約束任何一個字段,該字段不一定是PRIMARYKEY字段,也就是說自增的字段并不等于主鍵字段。 但是PRIMARY_KEY約束的主鍵字段,一定是自增字段,即PRIMARY_KEY 要與AUTO_INCREMENT一起作用于同一個字段。當插入第一條記錄時,自增字段沒有給定一個具體值,可以寫成DEFAULT/NULL,那么以后插入字段的時候,該自增字段就是從1開始,沒插入一條記錄,該自增字段的值增加1。當插入第一條記錄時,給自增字段一個具體值,那么以后插入的記錄在此自增字段上的值,就在第一條記錄該自增字段的值的基礎上每次增加1。
20.什么是事務?事物的特點?事物的作用?
事務是應用程序中一系列嚴密du的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,一個事務中的一系列的操作要么全部成功,要么一個都不做。
事務具有四個特征:原子性( Atomicity )、一致性( Consistency )、隔離性(Isolation )和持續性( Durability )。
事務是為了保證對同一數據表操作的一致性。即多條語句放在事務中執行的時候,要么一起成功,要么全不成功。
21.什么是JDBC?
JDBC(Java DataBase Connectivity,java數據庫連接)是一種用于執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。
22.JDBC連接數據庫的過程?
1.注冊數據庫驅動
2.獲取數據庫連接
3.獲取傳輸器
4.發送sql語句到服務器運行,并返回運行結果
5.處理結果
6.釋放資源
23.如何防止sql注入攻擊?
SQL注入攻擊產生的原因: 由于后臺執行的SQL語句是拼接而來的:其中的參數是用戶提交過來的,如果用戶在提交參數時,在參數中摻雜了一些SQL關鍵字(比如or)或者特殊符號(#、-- 、’ 等),就可能會導致SQL語句語義的變化,從而執行一些意外的操作(用戶名或密碼不正確也能登錄成功)
如何防止SQL注入攻擊?
(1)使用正則表達式對用戶提交的參數進行校驗。如果參數中有(# – ’ or等)這些符號就直接結束程序,通知用戶輸入的參數不合法
(2)使用PreparedStatement對象來替代Statement對象。
24.什么是連接池?使用連接池的好處?
連接池:
就是將連接存放在容器中,供整個程序共享,可以實現連接的復用,減少連接創建和關閉的次數,從而提高程序執行的效率!在傳統方式中,每次用戶需要連接訪問數據庫時,都是創建一個連接對象,基于這個連接對象訪問數據庫,用完連接后,會將連接關閉(conn.close)由于每次創建連接和關閉連接非常的耗時間而且耗資源,因此會導致程序執行的效率低下。
好處:
可以在程序一啟動時,就創建一批連接放在一個連接池中(容器),當用戶需要連接時,就從連接池中獲取一個連接對象,用完連接后,不要關閉,而是將連接再還回連接池中,這樣一來,用來用去都是池中的這一批連接,實現了連接的復用,減少了連接創建和關閉的次數,從而提高了程序執行的效率!
25.什么是HTML?
HTML(Hyper Text Markup Language): 超文本標記語言;是最基礎的開發網頁的語言。由W3C組織提供(CSS/xml)
26.html的結構是什么樣的?
(1)<!DOCTYPEHTML>
文檔聲明, 用來聲明HTML文檔所遵循的HTML規范和版本
上面是html5.0的聲明, 也是目前最常用的版本
(2)
頭部分, 用來存放HTML文檔的基本屬性信息, 比如網頁的標題, 文檔使用的編碼等, 這部分信息會被瀏覽器優先加載.
(3)
體部分, 用來存放網頁可視化數據. 即真正的網頁數據
(4)
聲明網頁的標題
(5)<metacharset=“utf-8”/>
用來通知瀏覽器使用哪一個編碼來打開HTML文檔, 這個編碼一定要和文件保存時的編碼保持一致, 才不會出現中文亂碼問題.
27.什么是HTML的標簽和屬性?
標簽:也叫做標記、元素等,標簽分為開始標簽和結束標簽
在標簽上可以聲明屬性,標簽上可以聲明多個屬性,多個屬性之間用空格分隔
標簽上的屬性的值可以使用單引號或者雙引號引起來
如何在網頁中做一個換行:可以使用
標簽做換行
如何在網頁中做一個空格:可以使用?或?做空格
28.什么是超鏈接?有哪些屬性?
<a target="_blank"href=“http://www.tmooc.cn”>
<img alt="tmooc"src=“imgs/tmooc.png” />
其中 href 屬性用于指定點擊超鏈接后將要跳轉到的URL地址
target屬性用于指定以何種方式打開超鏈接
_self:默認值, 表示在當前窗口中打開超鏈接
_blank:表示在新的窗口中打開超鏈接
29.表單一般包含哪些元素?
45、如何開發一個Servlet程序?
開發Servlet程序的步驟
第一步: 寫一個類,實現一個Servlet接口或者繼承Servlet接口的子類(GenericServlet/HttpServlet),并實現其中的方法
Servlet接口
|-- GenericServlet類(抽象類)
|-- HttpServlet類
第二步: 在web應用的web.xml文件中配置Servlet程序對外訪問的路徑。
Eclipse在創建一個Servlet時,會在web.xml文件中生成Servlet配置,所以不需要我們手動配置。
2、接著會彈出如下窗口:
注意:
(1) 3.0版本不會創建web.xml文件,并且創建Servlet時也不會在web.xml文件中生成Servlet相關的配置信息, 記得改為2.5。
(2) Target runtime選項中如果沒有可選的服務器,可點擊右側的"NewRuntime…"進行配置。
3、Eclipse中創建的Web工程的目錄結構:
(1) day09: 工程名稱/項目名稱
(2) src: 源碼目錄, 創建的java源文件、配置文件(properties、xml文件等)都可以放在src源碼目錄下
(3) build/classes: 編譯文件的輸出目錄, src源碼目錄中的文件編譯后會輸出到classes目錄下。
其中的classes目錄在發布時會放在WEB-INF目錄下,隨著項目一起發布到服務器中
(4) WebContent: 就是Web應用的目錄,其中可以存放 html、css、js、jsp、圖片以及編譯后的class文件、jar包、web.xml文件等. 將來發布項目到服務器,其實就是將WebContent中的所有內容一起發布到服務器中。
(5) WebContent/WEB-INF/lib: 用于存放當前項目所依賴的jar包。比如要訪問mysql數據庫,需要導入mysql驅動包,直接將jar包拷貝到lib目錄下即可!(也不用再去做 build path --> add to build path)
使用Eclipse創建Servlet
1、選中項目中的src目錄,鼠標右鍵 —> New —> Servlet
2、在彈出的窗口中,根據提示填寫內容
3、點擊finish即可完成Servlet創建過程, 創建好的Servlet如下:
通過Eclipse創建Servlet,默認繼承HttpServlet。由于HttpServlet也是Servlet接口的子類,讓HelloServlet繼承HttpServlet,相當于間接實現了Servlet接口。
繼承HttpServlet類,默認會覆蓋doGet方法和doPost方法,兩個方法的作用為:
- doGet方法:當瀏覽器發送請求的方式為GET提交時, 將會調用doGet方法來處理請求
- doPost方法:當瀏覽器發送請求的方式為POST提交時,將會調用doPost方法來處理請求
提示:如果當GET提交和POST提交處理代碼相同時,可以將代碼寫在其中一個方法里(例如寫在doGet中),并在另外一個方法(例如doPost)中調這個方法。這樣一來,不管是GET提交還是POST提交,最終doGet方法都會執行,都會對請求進行處理!!
Servlet在web.xml中的配置
HelloServlet
com.tedu.HelloServlet
HelloServlet
/HelloServlet
關于上面的配置信息:
a) Eclipse每創建一個Servlet,就會在web.xml文件中添加兩個標簽:和標簽(可以將這兩個標簽看成一個組的標簽)
b) 和標簽內都會有一個標簽,標簽的內容可以更改,但要求更改后的這兩個標簽的內容也必須一致。
c) 標簽用于配置Servlet類的全限定類名(即包名+類名)
需要注意:如果在創建Servlet后修改了Servlet類的名稱,這個地方也要一起更改,否則將會出現"ClassNotFoundException" 即類找不到異常
d) 標簽用于配置瀏覽器以什么路徑訪問當前Servlet(即Servlet對外訪問的路徑),默認的路徑是:/類名
例如:上面為HelloServlet配置的為/HelloServlet,因此我們在瀏覽器中的訪問路徑則為:
http://主機名/web項目訪問路徑/HelloServlet
運行Servlet程序、訪問測試
若是第一次運行,需要先創建tomcat服務器,即在Servers窗口中點擊鏈接可創建一個tomcat服務器,且只需創建一次即可!
(1)發布項目到服務器:在服務器上右鍵 --> 點擊 “add and remove” 將當前web項目發布到服務器中,并點擊完成。
(2)啟動tomcat服務器:在服務器上右鍵 Start 即可啟動服務器
(3)通過瀏覽器訪問Servlet:打開本地瀏覽器,通過路徑訪問,即可訪問Servlet程序
http://localhost:端口/項目名稱/HelloServlet
運行結果如下:
46、Servlet生命周期是什么?
生命周期:
在服務器調用Servlet程序的service方法之前,會創建代表請求的request對象,在請求處理完,響應結束時,會銷毀request對象。
47、Servlet數據傳遞的范圍有幾種?分別是什么?
一、servlet的三種轉發方式
1、req.getRequestDispatcher(url).forward(req,resp);
將req和resp轉發給url表示的對象 由于是轉發地址欄中的地址不變
2、req.getRequestDispatcher(url).include(req,resp);
將req和resp轉發給url表示的對象,同時發送PrintWriter在此處寫入的信息(但是這里注意寫入信息要在這一句之前寫入,否則resp已經被轉發就不能在寫入了) 同樣由于是轉發地址欄中的地址不便
3、resp.sendRedirect(url);
請求客戶端重新定向與url再次發送req 由于是重新定位發送,地址欄中的地址改變
url可以是html 可以是jsp 也可以是servlet
二、servlet對象中數據的范圍
這三個對象是ServletRequest Session ServletContext
他們都一致用setAttribute(String key,Object value)
getAttribute(String key)
removeAttribute(String key)
來存放和取出數據。 不同之處在與他們的作用范圍不同
1、ServletRequest
作用范圍最小的一個,消耗資源少,用的相對比較多。
通過不同servlet間轉發傳遞ServRequest來傳遞數據。
2、Session
通過ServletRequest的getSession方法得到。
從session第一次創建直到Session因超時或客戶端關閉之前,數據會一直存在。
Session 常用做存入某個用戶相關的數據對象。
3、ServletContext
通過Servlet的getServletConext方法得到。
作用范圍最大的一個。只要服務器中建立了它,他就一直存在。直到服務器關閉。
48、什么是Cookie和Session?
Cookie
cookie的API
Session
session是一個域對象
總結:兩者的區別
Cookie和session都屬于會話技術,都可以保存會話中產生的數據,但由于cookie和session的工作原理和特點不同,因此兩者的應用場景也不一樣。
? Cookie的特點:
? Session的特點
49、轉發和重定向的區別?
轉發:
定義:
請求轉發是服務器內部資源的一種跳轉方式,即當瀏覽器發送請求訪問服務器中的某一個資源(A)時,該資源將請求轉交給另外一個資源(B)進行處理并且由資源B做出響應的過程,就叫做請求轉發。
特點:
1)轉發是一次請求,一次響應
(2)請求轉發前后,瀏覽器的地址欄地址不會發生變化。(瀏覽器–訪問–> A --轉發–> B,地址欄地址始終指向A的地址)
(3)請求轉發前后的request對象是同一個(轉發前在A中的request和轉發到B后,B中的request對象和A中的request對象是同一個。基于這一點,可以通過request從A帶數據到B)
(4)請求轉發前后的兩個資源必須屬于同一個Web應用,否則將無法進行轉發。(A–轉發–>B,A和B必須屬于同一個Web應用!)
重定向:
定義:
當瀏覽器向服務器發請求訪問某一個資源A,資源A在響應時通知瀏覽器需要再進一步請求才能獲取到對應的資源,瀏覽器再次發請求訪問服務器中的資源B,最終由資源B響應瀏覽器要獲取的資源,這個過程叫做重定向。
特點:
(1)重定向是兩次請求、兩次響應
(2)重定向前后,瀏覽器的地址欄地址會發生變化。(因為兩次請求都是通過瀏覽器發起,瀏覽器知道這個跳轉的過程,因此地址欄地址會變化)
(3)重定向前后的request對象不是同一個(因為重定向是兩次請求,服務器會根據兩次請求創建兩個不同的request對象,request對象不是同一個,也就不能在重定向時通過request帶數據到目的地。)
(4)重定向前后的兩個資源可以是來自不同的web應用,甚至可以是來自不同的服務器。(進行跳轉的兩個資源之間沒有限制)
用處:
(1)如果希望跳轉前后地址欄地址不會發生變化, 只能使用轉發; 如果希望跳轉前后地址欄地址會發生變化, 只能使用重定向
(2)如果希望在跳轉前后, 能夠通過request對象帶數據到目的地, 只能使用轉發
(3)如果僅僅是做一個跳轉,沒有其他要求,此時推薦使用轉發(轉發是一次請求,一次響應,可以減少訪問服務器的次數,降低服務器的壓力)
50、什么是jsp?
? JSP和Servlet都是由SUN公司提供的動態Web資源開發技術
? JSP看起來像一個HTML,但和HTML不同的是,JSP中可以書寫Java代碼,可以通過Java代碼展示動態的數據。
? JSP本質上是一個Servlet程序
在JSP第一次被訪問時,會翻譯成一個Servlet程序。訪問JSP后看到的html網頁,其實是翻譯后的Servlet執行的結果。(也就是說,訪問JSP后看到的網頁,是JSP翻譯后的Servlet輸出到瀏覽器的。)
51、jsp有多少內置對象,分別說明?
序號 內置對象 對應 Servlet 類 作用
1 request javax.servlet.http.HttpServletRequest 客戶端的請求信息:Http協議頭信息、Cookie、請求參數等
2 response javax.servlet.http.HttpServletResponse 用于服務端響應客戶端請求,返回信息
3 pageContext javax.servlet.jsp.PageContext 頁面的上下文
4 session javax.servlet.http.HttpSession 客戶端與服務端之間的會話
5 application javax.servlet.ServletContext 用于獲取服務端應用生命周期的信息
6 out javax.servlet.jsp.JspWriter 用于服務端傳輸內容到客戶端的輸出流
7 config javax.servlet.ServletConfig 初始化時,Jsp 引擎向 Jsp 頁面傳遞的信息
8 page java.lang.Object 指向 Jsp 頁面本身
9 exception java.lang.Throwable 頁面發生異常,產生的異常對象
JSP提供了由容器實現和管理的內置對象,也可以稱之為隱含對象,由于JSP使用Java作為腳本語言,所以JSP將具有強大的對象處理能力,并且可以動態創建Web頁面內容。但Java語法在使用一個對象前,需要先實例化這個對象,這其實是一件比較煩瑣的事情。JSP為了簡化開發,提供了一些內置對象,用來實現很多JSP應用。在使用JSP內置對象時,不需要先定義這些對象,直接使用即可。
在JSP中一共預先定義了9個這樣的對象,分別為request、response、session、application、out、pageContext、config、page和exception。
1、request對象
request對象封裝了由客戶端生成的HTTP請求的所有細節,主要包括HTTP頭信息、系統信息、請求方式和請求參數等。通過request對象提供的相應方法可以處理客戶端瀏覽器提交的HTTP請求中的各項參數。
request對象的常用方法:
1.1 訪問請求參數
我們知道request對象用于處理HTTP請求中的各項參數。在這些參數中,最常用的就是獲取訪問請求參數。當我們通過超鏈接的形式發送請求時,可以為該請求傳遞參數,這可以通過在超鏈接的后面加上問號“?”來實現。注意這個問號為英文半角的符號。
如果要同時指定多個參數,各參數間使用與符號“&”分隔即可。
示例:在頁面中定義超鏈接。
刪除
在delete.jsp頁面中,可以通過request對象的getParameter()方法獲取傳遞的參數值。
<%
String id = request.getParameter(“id”); //獲取id參數的值
%>
示例:編程學員注冊功能。要求提交注冊信息后,顯示學員輸入的數據。
(1)注冊頁面 reginput.jsp。
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
| 用戶姓名: | |
| 博客地址: | |
| 備注信息: | |
| 興趣愛好: | 足球 籃球 羽毛球 乒乓球 |
博客地址:<%= blog %>
備注信息:<%= remark %>
興趣愛好:<%= interStr %> 執行結果: (1)注冊頁面 reginput.jsp
(2)注冊提交頁面 reginfo.jsp
1.2 在作用域中管理屬性
在進行請求轉發時,需要把一些數據傳遞到轉發后的頁面進行處理。這時,就需要使用request對象的setAttribute()方法將數據保存到request范圍內的變量中。request對象的setAttribute()方法的語法格式如下:
request.setAttribute(String name,Object object);
在將數據保存到request范圍內的變量中后,可以通過request對象的getAttribute()方法獲取該變量的值,具體的語法格式如下:
request.getAttribute(String name)
1.3 獲取cookie
cookie的中文意思是小甜餅,然而在互聯網上的意思與這就完全不同了。它和食品完全沒有關系。在互聯網中,cookie是小段的文本信息,在網絡服務器上生成,并發送給瀏覽器的。通過使用cookie可以標識用戶身份,記錄用戶名和密碼,跟蹤重復用戶等。瀏覽器將cookie以key/value的形式保存到客戶機的某個指定目錄中。
通過cookie的getCookies()方法即可獲取到所有cookie對象的集合;通過cookie對象的getName()方法可以獲取到指定名稱的cookie;通過getValue()方法即可獲取到cookie對象的值。另外將一個cookie對象發送到客戶端使用了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 %> 執行結果:1.4 解決中文亂碼
在上面的代碼中我們為id參數傳遞了一個字符串類型的值“001”,如果將這個參數的值更改為中文,則在show.jsp就會發生大家都不愿意看到的問題——在顯示參數值時中文內容變成了亂碼。這是因為請求參數的文字編碼方式與頁面中的不一致所造成的,所有的request請求都是iso-8859-1的,而在此頁面采用的是UTF-8的編碼方式。要解決此問題,只要將獲取到的數據通過String的構造方法使用指定的編碼類型重新構造一個String對象即可正確地顯示出中文信息。
sex參數的值為:<%=request.getParameter("sex") %> 1.5 獲取客戶端信息 通過request對象可以獲取客戶端的相關信息,如HTTP報頭信息,客戶信息提交方式、客戶端主機IP地址、端口號等。 request獲取客戶端信息的常用方法: 示例:使用request對象的相關方法獲取客戶端信息。
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>
使用request對象的相關方法獲取客戶端信息 客戶提交信息的方式:<%=request.getMethod()%>使用的協議:<%=request.getProtocol()%>
獲取發出請求字符串的客戶端地址:<%=request.getRequestURI()%>
獲取發出請求字符串的客戶端地址:<%=request.getRequestURL()%>
獲取提交數據的客戶端IP地址:<%=request.getRemoteAddr()%>
獲取服務器端口號:<%=request.getServerPort()%>
獲取服務器的名稱:<%=request.getServerName()%>
獲取客戶端的主機名:<%=request.getRemoteHost()%>
獲取客戶端所請求的腳本文件的文件路徑:<%=request.getServletPath()%>
獲得Http協議定義的文件頭信息Host的值:<%=request.getHeader("host")%>
獲得Http協議定義的文件頭信息User-Agent的值:<%=request.getHeader("user-agent")%>
獲得Http協議定義的文件頭信息accept-language的值:<%=request.getHeader("accept-language")%>
獲得請求文件的絕對路徑:<%=request.getRealPath("index.jsp")%> 執行結果:
1.6 顯示國際化信息
瀏覽器可以通過accept-language的HTTP報頭向Web服務器指明它所使用的本地語言。request對象中的getLocale()和getLocales()方法允許JSP開發人員獲取這一信息,獲取的信息屬于java.util.Local類型。java.util.Local類型的對象封裝了一個國家和一種國家所使用的語言。使用這一信息,JSP開發者就可以使用語言所特有的信息作出響應。
示例:頁面信息國際化。
<%
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對象用于響應客戶請求,向客戶端輸出信息。它封裝了JSP產生的響應,并發送到客戶端以響應客戶端的請求。請求的數據可以是各種數據類型,甚至是文件。response對象在JSP頁面內有效。
request對象的常用方法:
sendRedirect(String path) 將網頁重定向到另一個頁面。
setHeader(String name, String value) 設置HTTP響應報頭信息。
2.1 重定向網頁
使用response對象提供的sendRedirect()方法可以將網頁重定向到另一個頁面。重定向操作支持將地址重定向到不同的主機上,這一點與轉發不同。在客戶端瀏覽器上將會得到跳轉的地址,并重新發送請求鏈接。用戶可以從瀏覽器的地址欄中看到跳轉后的地址。進行重定向操作后,request中的屬性全部失效,并且開始一個新的request對象。sendRedirect()方法的語法格式如下:
response.sendRedirect(String path);
參數說明:
path:用于指定目標路徑,可以是相對路徑,也可以是不同主機的其他URL地址。
示例:使用response對象提供的sendRedirect()方法重定向到登錄頁面。
<%
response.sendRedirect(“login.jsp”); //重定向到登錄頁面
%>
2.2 處理HTTP文件頭
通過response對象可以設置HTTP響應報頭,其中,最常用的是禁用緩存、設置頁面自動刷新和定時跳轉網頁。下面分別進行介紹。
設置HTTP響應報頭方法的語法格式如下:
response.setHeader(String name, String value);
2.2.1 禁用緩存
在默認情況下,瀏覽器將會對顯示的網頁內容進行緩存,這樣可以提高網頁的顯示速度。對于一些安全性要求比較高的網站,通常需要禁用緩存。
示例:通過設置HTTP頭的方式實現禁用緩存。
<%
response.setHeader(“Cache-Control”, “no-store”);
response.setDateHeader(“Expires”, 0);
%>
2.2.2 設置頁面自動刷新
通過設置HTTP頭還可以實現頁面的自動刷新。
示例:使頁面每隔10秒自動刷新一次。
<%
response.setHeader(“refresh”, “10”);
%>
2.2.3 定時跳轉網頁
通過設置HTTP頭還可以實現定時跳轉頁面功能。
示例:使頁面5秒后自動跳轉到指定的網頁。
<%
response.setHeader(“refresh”, “5;URL=login.jsp”);
%>
2.3 設置輸出緩沖
通常情況下,服務器要輸出到客戶端的內容不會直接寫到客戶端,而是先寫到一個輸出緩沖區,在計算機術語中,緩沖區被定義為暫時放置輸入或輸出資料的內存。實際上,緩沖區也可以這樣理解:在一個糧庫中,由于裝缷車隊的速度要快于傳送帶的傳輸速度,為了不造成裝缷車隊的浪費,糧庫設計了一個站臺,裝缷車隊可以先將運送的糧食缷到這個平臺上,然后讓傳送機慢慢傳送。糧庫的這個站臺就起到了緩沖的作用。
response對象提供的對緩沖區進行配置的方法:
flushBuffer() 強制將緩沖區的內容輸出到客戶端。
getBufferSize() 獲取響應所使用的緩沖區的實際大小,如果沒有使用緩沖區,則返回0。
setBufferSize(int size) 設置緩沖區大小。
reset() 清除緩沖區的內容,同時清除狀態碼和報頭。
isCommitted() 檢查服務器端是否已經把數據寫入到可客戶端。
示例:設置緩沖區的大小為32KB。
<%
response.setBufferSize(32);
%>
說明:如果將緩沖區的大小設置為0KB,則表示不緩沖。
3、session對象
session在網絡中被稱為會話。由于HTTP協議是一種無狀態協議,也就是當一個客戶向服務器發出請求,服務器接收請求,并返回響應后,該連接就結束了,而服務器并不保存相關的信息。為了彌補這一缺點,HTTP協議提供了session。通過session可以在應用程序的Web頁面間進行跳轉時,保存用戶的狀態,使整個用戶會話一直存在下去,直到關閉瀏覽器。但是,如果在一個會話中,客戶端長時間不向服務器發出請求,session對象就會自動消失。這個時間取決于服務器,例如,Tomcat服務器默認為30分鐘。不過這個時間可以通過編寫程序進行修改。
session對象的常用方法:
示例:保存與獲取session對象信息。
<%
session.setAttribute(“UserName”, “pan_junbiao的博客”); //保存session對象
String userName = session.getAttribute(“UserName”).toString(); //獲取session對象
%>
配置web.xml文件:
如果使用的是Tomcat,可以向下面這樣配置web.xml文件:
15
超時以分鐘為單位,Tomcat中的默認的超時時間是30分鐘。
Servlet中的getMaxInactiveInterval( ) 方法以秒為單位返回超時時間。如果在web.xml中配置的是15分鐘,則getMaxInactiveInterval( ) 方法將會返回900。
4、application對象
application對象用于保存所有應用中的共有數據。它在服務器啟動時自動創建,在服務器停止時銷毀。當application對象沒有被銷毀時,所有用戶都可以共享該application對象。與session對象相比,application對象的生命周期更長,類似于系統的“全局變量”。
application對象的常用方法:
String getInitParameter(String name) 獲取已命名的應用程序初始化參數值。
Enumeration getInitParameterNames() 獲取所有已定義的應用程序初始化參數名的枚舉。
Enumeration getAttributeNames() 獲取所有application對象使用的屬性名。
Object getAttribute(String name) 從application對象中獲取指定對象名。
void setAttribute(String key,Object obj) 使用指定名稱和指定對象在application對象中進行關聯。
void removeAttribute(String name) 從application對象中去掉指定名稱的屬性。
4.1 訪問應用程序初始化參數
application對象提供了對應用程序初始化參數進行訪問的方法。應用程序初始化參數在web.xml文件中進行設置,web.xml文件位于Web應用所在目錄下的WEB-INF子目錄中。在web.xml文件中通過標記配置應用程序初始化參數。
示例:在web.xml文件中配置連接MySQL數據庫所需的url參數。
url
jdbc:mysql://127.0.0.1:3306/db_database
application對象提供了兩種訪問應用程序初始化參數的方法。
4.1.1 getInitParameter(String name)方法
String getInitParameter(String name)方法用于獲取已命名的應用程序初始化參數值。
示例:獲取上面web.xml文件中配置的url參數的值。
<%
String url = application.getInitParameter(“url”);
%>
4.1.2 getInitParameterNames()方法
Enumeration getInitParameterNames()方法獲取所有已定義的應用程序初始化參數名的枚舉。
示例:使用getInitParameterNames()方法獲取web.xml文件中定義的全部應用程序初始化參數,并通過循環輸出。
<%@ page import=“java.util.*” %>
<%
Enumeration enume = application.getInitParameterNames(); //獲取全部初始化參數
while(enume.hasMoreElements())
{
String name = enume.nextElement(); //獲取參數名
String value = application.getInitParameter(name); //獲取參數值
out.println(name + “:”); //輸出參數名
out.println(value); //輸出參數值
}
%>
4.2 管理應用程序環境屬性
與session對象相同,也可以在application對象中設置屬性。與session對象不同的是,session只是在當前客戶的會話范圍內有效,當超過保存時間,session對象就被收回;而application對象在整個應用區域中都有效。
<%
application.setAttribute(“UserName”, “pan_junbiao的博客”); //保存application對象
String userName = application.getAttribute(“UserName”).toString(); //獲取application對象
%>
5、out對象
out對象用于在Web瀏覽器內輸出信息,并且管理應用服務器上的輸出緩沖區。在使用out對象輸出數據時,可以對數據緩沖區進行操作,及時清除緩沖區中的殘余數據,為其他的輸出讓出緩沖空間。待數據輸出完畢后,要及時關閉輸出流。
5.1 向客戶端輸出數據
out對象一個最基本的應用就是向客戶端瀏覽器輸出信息。out對象可以輸出各種數據類型的數據,在輸出非字符串類型的數據時,會自動轉換為字符串進行輸出。out對象提供了print()和println()兩種向頁面中輸出信息的方法。
5.1.1 print()方法
示例:通過兩種方式向客戶端瀏覽器輸出文字。
<%
out.print(“您好,pan_junbiao的博客”);
%>
<%= “您好,pan_junbiao的博客” %>
5.1.2 println()方法
println()方法也可以用于向客戶端瀏覽器輸出信息,該方法輸出內容后,還輸出一個換行符。
示例:使用println()方法向客戶端瀏覽器輸出文字。
說明:使用println()方法輸出內容要有換行的效果,需要同時使用HTML的
標記括起來,否則無法顯示換行效果。執行效果:
5.2 管理響應緩沖
out對象的另一個比較重要的功能就是對緩沖區進行管理。通過調用out對象的clear()方法可以清除緩沖區的內容。這類似于重置響應流,以便重新開始操作。如果響應已經提交,則會有產生IOException異常的負作用。out對象還提供了另一種清除緩沖區內容的方法,那就是clearBuffer()方法,通過該方法可以清除緩沖區的“當前”內容,而且即使內容已經提交給客戶端,也能夠訪問該方法。除了這兩個方法外,out對象還提供了其他用于管理緩沖區的方法。
out對象用于管理緩沖區的方法如下:
clear() 清除緩沖區中的內容。
clearBuffer() 清除當前緩沖區中的內容。
flush() 刷新流。
isAutoFlush() 檢測當前緩沖區已滿時是自動清空,還是拋出異常。
getBufferSize() 獲取緩沖區的大小。
6、獲取會話范圍的pageContext對象
獲取頁面上下文的pageContext對象是一個比較特殊的對象,通過它可以獲取JSP頁面的request、response、session、out、exception等對象。pageContext對象的創建和初始化都是由容器來完成的,JSP頁面中可以直接使用pageContext對象。
pageContext對象的常用方法:
forward(String relativeUrlPath) 把頁面轉發給另一個頁面。
getAttribute(String name) 獲取參數值。
getAttributeNamesInScope(int scope) 獲取某范圍的參數名稱的集合。
getException() 獲取exception對象。
getRequest() 獲取request對象。
getResponse() 獲取response對象。
getSession() 獲取session對象。
getOut() 獲取out對象。
setAttribute(String name,Object value) 為指定范圍內的屬性設置屬性值。
removeAttribute(String name) 刪除指定范圍內的指定對象。
說明:pageContext對象在實際JSP開發過程中很少使用,因為request和response等對象均為內置對象,如果通過pageContext對象來調用這些對象比較麻煩。
7、讀取web.xml配置信息的config對象
config對象主要用于取得服務器的配置信息。當一個Servlet初始化時,容器把某些信息通過config對象傳遞給這個Servlet。開發者可以在web.xml文件中為應用程序環境中的Servlet程序和JSP頁面提供初始化參數。
config對象的常用方法如下:
getServletContext() 獲取Servlet上下文。
getServletName() 獲取Servlet服務器名。
getInitParameter(String name) 獲取服務器所有初始化參數名稱。
getInitParameterNames() 獲取服務器中name參數的初始值。
8、應答或請求的page對象
page對象代表JSP本身,只有在JSP頁面內才是合法的。page對象本質上是包含當前Servlet接口引用的變量,可以看作是this關鍵字的別名。
page對象的常用方法如下:
getClass() 返回當前Object的類。
hashCode() 返回該Object的哈希代碼。
toString() 把該Object類轉換成字符串。
equals(Object obj) 比較該對象和指定的對象是否相等。
示例:創建index.jsp文件,在該文件中調用page對象的各方法,并顯示返回結果。
<%@ 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的域對象有哪些?
四大域對象:
(1)pageContext page 域-指當前頁面,在當前 jsp 頁面有效,跳到其它頁面失效
(2)request request 域-指一次請求范圍內有效,從 http 請求到服務器處理結束,返回響應的整個過程。在這個過程中使用 forward(請求轉發)方式跳轉多個 jsp,在這些頁面里你都可以使用這個變量
(3)session session 域-指當前會話有效范圍,瀏覽器從打開到關閉過程中,轉發、重定向均可以使用
(4)application context 域-指只能在同一個 web 中使用,服務器未關閉或者重啟,數據就有效
53、什么是Maven?為什么要用Maven?
Maven: 翻譯為"專家"、“內行”,是Apache下的一個純Java開發的一個開源項目。
Maven是一個項目管理工具,使用Maven可以來管理企業級的Java項目開發及依賴JAr包的管理。
使用Maven開發,可以簡化項目配置,統一項目結構。總之,Maven可以讓開發者的工作變得更簡單。
傳統的項目(工程)中管理項目所依賴的jar包完全靠人工進行管理,而人工管理jar包可能會產生諸多問題。
1、不使用Maven,采用傳統方式管理jar包的弊端:
(1)在一些大型項目中會使用一些框架,比如SSM或者SSH框架,而框架中所包含的jar包非常多(甚至還依賴其他第三方的jar包),如果這些jar包我們手動去網上尋找,有些jar包不容易找到,比較麻煩。
(2)傳統方式會將jar包添加到工程中,比如Java工程中將jar包放在工程根目錄或者放在自建的lib目錄下;JavaWeb工程會將jar包放在:/WEB-INF/lib目錄下,這樣會導致項目文件的體積暴增(例如,有些項目代碼本身體積可能僅僅幾兆,而加入jar包后,工程的體積可能會達到幾十兆甚至百兆)。
(3)在傳統的Java項目中是將所有的jar包統一拷貝的同一目錄中,可能會存在jar包文件名稱沖突的問題!
(4)在進行項目整合時,可能會出現jar包版本沖突的問題。
(5)在傳統java項目中通過編譯(手動編譯或者在eclipse保存自動編譯)、測試(手動在main函數中測試、junit單元測試)、打包部署(手動打war包/手動發布)、運行(手動啟動tomcat運行),最終訪問程序。
2、使用Maven來管理jar包的優勢:
(1)Maven團隊維護了一個非常全的Maven倉庫(中央倉庫),其中幾乎包含了所有的jar包,使用Maven創建的工程可以自動到Maven倉庫中下載jar包,方便且不易出錯。
另外,在Maven構建的項目中,如果要使用到一些框架,我們只需要引入框架的核心jar包,框架所依賴的其他第三方jar包,Maven也會一并去下載。
(2)在Maven構建的項目中,不會將項目所依賴的jar包拷貝到每一個項目中,而是將jar包統一放在倉庫中管理,在項目中只需要引入jar包的位置(坐標)即可。這樣實現了jar包的復用。
(3)Maven采用坐標來管理倉庫中的jar包,其中的目錄結構為【公司名稱+項目/產品名稱+版本號】,可以根據坐標定位到具體的jar包。即使使用不同公司中同名的jar包,坐標不同(目錄結構不同),文件名也不會沖突。
(4)Maven構建的項目中,通過pom文件對項目中所依賴的jar包及版本進行統一管理,可避免版本沖突。
(5)在Maven項目中,通過一個命令或者一鍵就可以實現項目的編譯(mvn complie)、測試(mvn test)、打包部署(mvn deploy)、運行(mvn install)等。
還有發布到tomcat服務器中運行: mvn tomcat7:run。如果想實現上面的所有過程,只需要記住一個命令:mvn install
總之,使用Maven遵循規范開發有利于提高大型團隊的開發效率,降低項目的維護成本,大公司都會優先使用Maven來構建項目.
54、什么是mybatis?使用mybatis有什么優勢?
MyBatis 本是apache的一個開源項目iBatis,2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。2013年11月遷移到Github。
MyBatis是一個優秀的持久層框架,它對jdbc的操作數據庫的過程進行封裝,使開發者只需要關注SQL本身,而不需要花費精力去處理例如注冊驅動、創建connection、創建statement、手動設置參數、結果集檢索等jdbc繁雜的過程代碼。
Mybatis通過xml或注解的方式將要執行的各種statement(statement、preparedStatemnt)配置起來,并通過java對象和statement中的sql進行映射生成最終執行的sql語句,最后由mybatis框架執行sql并將結果映射成java對象并返回。
總之,Mybatis對JDBC訪問數據庫的過程進行了封裝,簡化了JDBC代碼,解決JDBC將結果集封裝為Java對象的麻煩。
1、使用傳統方式JDBC訪問數據庫:
(1)使用JDBC訪問數據庫有大量重復代碼(比如注冊驅動、獲取連接、獲取傳輸器、釋放資源等);
(2)JDBC自身沒有連接池,會頻繁的創建連接和關閉連接,效率低;
(3)SQL是寫死在程序中,一旦修改SQL,需要對類重新編譯;
(4)對查詢SQL執行后返回的ResultSet對象,需要手動處理,有時會特別麻煩;
…
2、使用mybatis框架訪問數據庫:
(1)Mybatis對JDBC對了封裝,可以簡化JDBC代碼;
(2)Mybatis自身支持連接池(也可以配置其他的連接池),因此可以提高程序的效率;
(3)Mybatis是將SQL配置在mapper文件中,修改SQL只是修改配置文件,類不需要重新編譯。
(4)對查詢SQL執行后返回的ResultSet對象,Mybatis會幫我們處理,轉換成Java對象。
…
總之,JDBC中所有的問題(代碼繁瑣、有太多重復代碼、需要操作太多對象、釋放資源、對結果的處理太麻煩等),在Mybatis框架中幾乎都得到了解決!!
55、mybatis中#{}與${}的區別?
#{}:
相當于JDBC中的問號(?)占位符,是為SQL語句中的參數值進行占位,大部分情況下都是使用#{}占位符;并且當#{}占位符是為字符串或者日期類型的值進行占位時,在參數值傳過來替換占位符的同時,會進行轉義處理(在字符串或日期類型的值的兩邊加上單引號)
${}:
是為SQL片段(字符串)進行占位,將傳過來的SQL片段直接拼接在 ${} 占位符所在的位置,不會進行任何的轉義處理。(由于是直接將參數拼接在SQL語句中,因此可能會引發SQL注入攻擊問題)
需要注意的是:使用 ${} 占位符為SQL語句中的片段占位時,即使只有一個占位符,在傳遞
對應的值時,即使只有一個參數,也需要將值存入map集合中!!也需要將參數先封裝再傳遞!
56、什么是動態SQL?什么情況下使用動態SQL?
動態SQL:code that is executed dynamically。就是(在進行sql操作的時候)動態的根據屬性值(所匹配的條件)來拼接數據庫執行的sql語句,也就是多次查詢或變更操作,根據傳入的屬性值不同,動態拼接出不同的可執行sql。包含判斷為空、循環等;
查詢條件往往是這樣一種非常常見的邏輯:如果客戶填了查詢信息,則查詢該條件;如果客戶沒填,則返回所有數據。
可組合成非常靈活的SQL語句,從而提高編程效率。
57、動態SQL常用標簽有哪些?
Mybatis動態sql(有哪些)標簽:
1、:
if是為了判斷傳入的值是否符合某種規則,比如是否不為空;
2、:
where標簽可以用來做動態拼接查詢條件,當和if標簽配合的時候,不用顯示的聲明類似where 1=1這種無用的條件;
3、:
這是一組組合標簽,他們的作用類似于 Java 中的 switch、case、default。只有一個條件生效,也就是只執行滿足的條件 when,沒有滿足的條件就執行 otherwise,表示默認條件;
4、:
foreach標簽可以把傳入的集合對象進行遍歷,然后把每一項的內容作為參數傳到sql語句中,里面涉及到 item(具體的每一個對象), index(序號), open(開始符), close(結束符), separator(分隔符);
5、:
include可以把大量重復的代碼整理起來,當使用的時候直接include即可,減少重復代碼的編寫;
6、:
適用于更新中,當匹配某個條件后,才會對該字段進行更新操作
7、:
是一個格式化標簽,主要有4個參數:
prefix(前綴);
prefixOverrides(去掉第一個標記);
suffix(后綴);
suffixOverrides(去掉最后一個標記);
58、什么是Spring?它的優勢是什么?
spring是分層的JavaSE及JavaEE應用于全棧的輕量級開源框架,以IoC(Inverse Of Control:控制反轉/反轉控制)和AOP(Aspact Oriented Programming:面向切面編程)為核心,提供了表現層SpringMVC和持久層SpringJDBC以及業務層事務管理等眾多模塊的企業級應用技術,還能整合開源世界中眾多著名的第三方框架和類庫,逐漸成為使用最多的JavaEE企業應用開源框架。
優勢:
1).方便解耦,簡化開發
通過 Spring提供的 IoC容器,可以將對象間的依賴關系交由Spring進行控制,避免硬編碼所造成的過度程序耦合。用戶也不必再為較為底層的需求編寫代碼,可以更專注于上層的應用。
2).AOP 編程的支持
通過 Spring的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統OOP(Object Oriented Programming:面向對象編程) 實現的功能可以通過 AOP 輕松應付。
3).聲明式事務的支持
可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理,提高開發效率和質量。
4).方便程序的測試
可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。
5).方便集成各種優秀框架
Spring可以降低各種框架的使用難度,提供了對各種優秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
6).降低 JavaEE API 的使用難度。
Spring對 JavaEE API(如 JDBC、JavaMail、遠程調用等)進行了薄薄的封裝層,使這些API 的使用難度大為降低。
7).Spring框架源碼是經典學習范例
Spring的源代碼設計精妙、結構清晰、匠心獨用,處處體現著大師對Java設計模式靈活運用以及對 Java技術的高深造詣。它的源代碼無疑是Java技術的最佳實踐的范例。
59、Spring的核心內容是什么?
Spring是一個無侵入式的輕量級開源框架
Spring兩大特性 :
1.IOC:控制反轉
IOC作用:解除類與類之間的關系耦合
解除耦合的方式用了四個技術點:
2.AOP:面相切面編程
作用:為了解除業務邏輯耦合,例如耦合或者數據業務邏輯日志業務
AOP實現原理是基于代理的
Spring進行內部實現的時候 ,會檢測是否存在接口,存在時選擇jdk動態代理,不存在選擇CGLIB代理
Spring類似一個管家,后期幾乎所有內容都交給Spring管理,View層Spring不管理,與java相關的全部管理.(Spring容器)
Spring的核心思想是解除程序中的耦合(解除了業務邏輯耦合,解除了類與類之間的關系耦合)
輕量級與重量級的區分:
1.性能開銷
2.框架本身的大小問題
3.使用的難易程度
Spring中所有的行為都是基于Spring能夠管理所有的類
Spring也有持久層框架,但是因為性能不強,所以沒有人用,用來給hibernate和mybitas支持
Spring對web框架也是有支持的
Spring還是一個mvc結構的框架
Core解除的是類級別的耦合
AOP解除的是方法級別的耦合
IOC控制反轉 Inversion Of Control
高層模塊不應該依賴底層模塊(如Action依賴Dao層)
實現必須依賴抽象,而不是是抽象依賴實現
依賴注入:Dependency Injection
DI是IOC的核心實現原理
通俗的說就是利用set方法或者構造器給屬性賦值
59.Spring的核心內容是什么?
IOC、DI、AOP
60.IOC、AOP各是什么
spring的核心內容就是控制反轉IOC、依賴注入DI和面向切面編程AOP
IOC:傳統的JAVA開發模式中,當需要一個對象時,我們使用new,直接或者間接調用構造方法創建一個對象,而在Spring開發模式中,Spring容器使用工廠模式為我們創建了所需要的對象,不需要我們自己去創建了,直接調用Spring提供的對象就可以了,這就是控制反轉。
DI:Spring使用JavaBean對象的set方法或者帶參數的構造方法為我們在創建所需要對象時將其屬性自動設置為我們所需要的值的過程,這就是依賴注入。
AOP:AOP即面向切面編程,是OOP編程的有效補充。使用AOP技術,可以將一些系統性相關的編程工作,獨立提取出來,獨立實現,然后通過切面切入進系統。從而避免了在業務邏輯的代碼中混入很多的系統相關的邏輯——比如權限管理,事物管理,日志記錄等
61.什么是MVC?工作原理?
MVC就是一種設計模式,它就是強制性使應用程序的輸入,處理和輸出分開。將一個應用程序分為三個部分:Model,View,Controller。
springmvc的工作原理是:
前端控制器(DispatcherServlet):主要負責捕獲來自客戶端的請求和調度各個組件。
處理器映射器(HandlerMapping):根據url查找后端控制器Handler。
處理器適配器(HandlerAdapter):執行后端控制器(Handler),拿到后端控制器返回的結果ModelAndView后將結果返回給前端控制器DispatcherServlet。
后端控制器(處理器)(Handler):主要負責處理前端請求,完成業務邏輯,生成ModelAndView對象返回給HandlerAdapter。
視圖解析器(ViewResolver):主要負責將從DispatcherServlet中拿到的ModelAndView對象進行解析,生成View對象返回給DispatcherServlet。
62.springboot?
是一個腳手架一種全新的編程規范,他的產生簡化了框架的使 用,所謂簡化是指簡化了Spring眾多框架中所需的大量且繁瑣的配置 文件,主要作用是簡化配置文件。
63.1.什么是AOP(Aspect Orient Programming)?解決了什么問題?應用原理?應用場景
?
是一種設計思想,是軟件設計領域中的面向切面編程,它是面向對象編程(OOP)的一種補充和完善。它以通過預編譯方式和運行期動態代理方式,實現在不修改源代碼的情況下給程序動態統一添加額外功能的一種技術。
2.解決的問題
實際項目中我們通常將面向對象理解為一個靜態過程(例如一個系統有多少個模塊,一個模塊有哪些對象,對象有哪些屬性),面向切面的運行期代理方式,理解為一個動態過程,可以在對象運行時動態織入一些擴展功能或控制對象執行。
3.應用原理
1)假如目標對象(被代理對象)實現接口,則底層可以采用JDK動態代理機制為目標對象創建代理對象(目標類和代理類會實現共同接口)。
2)假如目標對象(被代理對象)沒有實現接口,則底層可以采用CGLIB代理機制為目標對象創建代理對象(默認創建的代理類會繼承目標對象類型)。
4.應用場景
實際項目中通常會將系統分為兩大部分,一部分是核心業務,一部分是非核業務。在編程實現時我們首先要完成的是核心業務的實現,非核心業務一般是通過特定方式切入到系統中,這種特定方式一般就是借助AOP進行實現。
64.基本步驟: 切面/方面(Aspect)
切入點(Pointcut)
目標對象(Target Object)
AOP代理(AOP Proxy)
過程:要利用切面,我們不直接在3個方法進行調用,將方法進行抽取出來分離關注點,被通知的對象Advice。
spring會根據配制文件中配制的切入點去匹配target中方法的調用,從而知道哪些方法需要增加。
當客戶端調用這些方法時,直接調用的是代理對象的方法。
AOP通過配制文件中配制的切入點與Advice,從而找到指定方法需要增強的功能。
最終通過代理將Advice動態織入到指定方法。
切入點(Pointcut)
目標對象(Target Object)
AOP代理(AOP Proxy)
66.基于此依賴spring可以整合AspectJ框架快速完成AOP的基本實現。AspectJ 是一個面向切面的框架,他定義了AOP的一些語法,有一個專門的字節碼生成器來生成遵守java規范的class文件。
@Aspect 注解用于標識或者描述AOP中的切面類型,基于切面類型構建的對象用于為目標對象進行功能擴展或控制目標對象的執行。
@Pointcut注解用于描述切面中的方法,并定義切面中的切入點(基于特定表達式的方式進行描述),在本案例中切入點表達式用的是bean表達式,這個表達式以bean開頭,bean括號中的內容為一個spring管理的某個bean對象的名字。
@Around注解用于描述切面中方法,這樣的方法會被認為是一個環繞通知(核心業務方法執行之前和之后要執行的一個動作),@Aournd注解內部value屬性的值為一個切入點表達式或者是切入點表達式的一個引用(這個引用為一個@PointCut注解描述的方法的方法名)。
ProceedingJoinPoint類為一個連接點類型,此類型的對象用于封裝要執行的目標方法相關的一些信息。一般用于@Around注解描述的方法參數。
@Aspect 指定一個類為切面類
@Pointcut(“execution(* cn.itcast.e_aop_anno..(…))”) 指定切入點表達式
@Before(“pointCut_()”) 前置通知: 目標方法之前執行
@After(“pointCut_()”) 后置通知:目標方法之后執行(始終執行)
@AfterReturning(“pointCut_()”) 返回后通知: 執行方法結束前執行(異常不執行)
@AfterThrowing(“pointCut_()”) 異常通知: 出現異常時候執行
@Around(“pointCut_()”) 環繞通知: 環繞目標方法執行
68.啟用聲明式事務管理,在項目啟動類上添加@EnableTransactionManagement,新版本中也可不添加(例如新版Spring Boot項目)。
將@Transactional注解添加到合適的業務類或方法上,并設置合適的屬性信息。
69.
1).啟動異步配置
在基于注解方式的配置中,借助@EnableAsync注解進行異步啟動聲明,Spring Boot版的項目中,
2).Spring中@Async注解應用
70.在業務方法中我們可能調用數據層方法獲取數據庫中數據,假如訪問數據的頻率比較高,為了提高的查詢效率,降低數據庫的訪問壓力,可以在業務層對數據進行緩存.
71. 1)良好的基因 因為SpringBoot是伴隨著Spring 4.0而生的,boot是引導的意思,也就是它的作用其實就是在于幫助開發者快速的搭建Spring框架,因此SpringBoot繼承了Spring優秀的基因在Spring中開發更為方便快捷。
2)簡化編碼 比如我們要創建一個web項目,使用 Spring 的朋友都知道,在使用 Spring 的時候,需要在 pom 文件中添加多個依賴,而 Spring Boot 則會幫助開發著快速啟動一個 web 容器,在 Spring Boot 中,我們只需要在 pom 文件中添加starter-web 依賴即可。
3)簡化配置 Spring 雖然使Java EE輕量級框架,但由于其繁瑣的配置,一度被人認為是“配置地獄”。各種XML、Annotation配置會讓人眼花繚亂,而且配置多的話,如果出錯了也很難找出原因。Spring Boot更多的是采用 Java Config 的方式,對 Spring 進行配置
4)簡化部署 在使用 Spring 時,項目部署時需要我們在服務器上部署 tomcat,然后把項目打成 war 包扔到 tomcat里,在使用 Spring Boot 后,我們不需要在服務器上去部署 tomcat,因為 Spring Boot 內嵌了 tomcat,我們只需要將項目打成 jar 包,使用 java -jar xxx.jar一鍵式啟動項目。
另外,也降低對運行環境的基本要求,環境變量中有JDK即可
5)簡化監控 我們可以引入 spring-boot-start-actuator 依賴,直接使用 REST 方式來獲取進程的運行期性能參數,從而達到監控的目的,比較方便。但是 Spring Boot 只是個微框架,沒有提供相應的服務發現與注冊的配套功能,沒有外圍監控集成方案,沒有外圍安全管理方案,所以在微服務架構中,還需要 Spring Cloud 來配合一起使用。
72.Shiro是apache旗下一個開源安全框架(http://shiro.apache.org/),它將軟件系統的安全認證相關的功能抽取出來,實現用戶身份認證,權限授權、加密、會話管理等功能,組成了一個通用的安全認證框架。使用shiro就可以非常快速的完成認證、授權等功能的開發,降低系統成本。
73.Subject :主體對象,負責提交用戶認證和授權信息。
SecurityManager:安全管理器,負責認證,授權等業務實現。
Realm:領域對象,負責從數據層獲取業務數據。
74.系統調用subject的login方法將用戶信息提交給SecurityManager
SecurityManager將認證操作委托給認證器對象Authenticator
Authenticator將用戶輸入的身份信息傳遞給Realm。
Realm訪問數據庫獲取用戶信息然后對信息進行封裝并返回。
Authenticator 對realm返回的信息進行身份認證。
75.系統調用subject相關方法將用戶信息(例如isPermitted)遞交給SecurityManager。
SecurityManager將權限檢測操作委托給Authorizer對象。
Authorizer將用戶信息委托給realm。
Realm訪問數據庫獲取用戶權限信息并封裝。
Authorizer對用戶授權信息進行判定。
76.當我們進行授權操作時,每次都會從數據庫查詢用戶權限信息,為了提高授權性能,可以將用戶權限信息查詢出來以后進行緩存,下次授權時從緩存取數據即可。
77.客戶端業務實現
在頁面上選中記住我,然后執行提交操作,將用戶名,密碼,記住我對應的值提交到控制層
服務端業務實現
在SysUserController中的doLogin方法中基于是否選中記住我,設置token的setRememberMe方法。
78.使用shiro框架實現認證操作,用戶登錄成功會將用戶信息寫入到會話對象中,其默認時長為30分鐘,
總結
以上是生活随笔為你收集整理的Java-ZZH1-78面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QLineEdit setFocus失效
- 下一篇: otg usb 定位_什么是USB OT