1. Servlet的生命周期?
Servlet的生命周期:實例化、初始化、處理請求、銷毀四個階段。
這個聲明周期由javax.servlet.Servlet接口的init(),service()和destroy方法表達。
Servlet被服務(wù)器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應(yīng)的doXXX方法(doGet,doPost)等,當(dāng)服務(wù)器決定將實例銷毀的時候調(diào)用其destroy方法。
web容器加載servlet,生命周期開始。通過調(diào)用servlet的init()方法進行servlet的初始化。通過調(diào)用service()方法實現(xiàn),根據(jù)請求的不同調(diào)用不同的do***()方法。結(jié)束服務(wù),web容器調(diào)用servlet的destroy()方法。
2. Servlet 中forward()與redirect()的區(qū)別(轉(zhuǎn)發(fā)和重定向)
1)從地址欄顯示來說
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.所以redirect等于客戶端向服務(wù)器端發(fā)出兩次request,同時也接受兩次response。
2)從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).
redirect不僅可以重定向到當(dāng)前應(yīng)用程序的其他資源,還可以重定向到同一個站點上的其他應(yīng)用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源.
forward方法只能在同一個Web應(yīng)用程序內(nèi)的資源之間轉(zhuǎn)發(fā)請求.forward 是服務(wù)器內(nèi)部的一種操作.
redirect 是服務(wù)器通知客戶端,讓客戶端重新發(fā)起請求。所以說 redirect 是一種間接的請求, 但是不能說"一個請求是屬于forward還是redirect "
3)
forward:一般用于用戶登陸的時候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊。
redirect:一般用于用戶注銷登陸時返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等.
4)從效率來說
forward:高.
redirect:低.
3. jsp靜態(tài)包含和動態(tài)包含的區(qū)別
1)<%@include file="xxx.jsp"%>為jsp中的編譯指令,其文件的包含是發(fā)生在jsp向servlet轉(zhuǎn)換的時期,而<jsp:include page="xxx.jsp">是jsp中的動作指令,其文件的包含是發(fā)生在編譯時期,也就是將java文件編譯為class文件的時期。
2)使用靜態(tài)包含只會產(chǎn)生一個class文件,而使用動態(tài)包含會產(chǎn)生多個class文件。
3)使用靜態(tài)包含,包含頁面和被包含頁面的request對象為同一對象,因為靜態(tài)包含只是將被包含的頁面的內(nèi)容復(fù)制到包含的頁面中去;而動態(tài)包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象可以取到的參數(shù)范圍要相對大些,不僅可以取到傳遞到包含頁面的參數(shù),同樣也能取得在包含頁面向下傳遞的參數(shù)
4. jsp有哪些內(nèi)置對象?作用分別是什么?
JSP共有以下9個內(nèi)置的對象:
1)request 用戶端請求,此請求會包含來自GET/POST請求的參數(shù)
2)response 網(wǎng)頁傳回用戶端的回應(yīng)
3)pageContext 網(wǎng)頁的屬性是在這里管理
4)session 與請求有關(guān)的會話期
5)application servlet 正在執(zhí)行的內(nèi)容
6)out 用來傳送回應(yīng)的輸出
7)config servlet的構(gòu)架部件
8)page JSP網(wǎng)頁本身
9)exception 針對錯誤網(wǎng)頁,未捕捉的例外
5. Http中,get和post方法的區(qū)別
1)Get是向服務(wù)器發(fā)索取數(shù)據(jù)的一種請求,而Post是向服務(wù)器提交數(shù)據(jù)的一種請求
2)Get是獲取信息,而不是修改信息,類似數(shù)據(jù)庫查詢功能一樣,數(shù)據(jù)不會被修改
3)Get請求的參數(shù)會跟在url后進行傳遞,請求的數(shù)據(jù)會附在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,%XX中的XX為該符號以16進制表示的ASCII,如果數(shù)據(jù)是英文字母/數(shù)字,原樣發(fā)送,如果是空格,轉(zhuǎn)換為+,如果是中文/其他字符,則直接把字符串用BASE64加密。
4)Get傳輸?shù)臄?shù)據(jù)有大小限制,因為GET是通過URL提交數(shù)據(jù),那么GET可提交的數(shù)據(jù)量就跟URL的長度有直接關(guān)系了,不同的瀏覽器對URL的長度的限制是不同的。
5)GET請求的數(shù)據(jù)會被瀏覽器緩存起來,用戶名和密碼將明文出現(xiàn)在URL上,其他人可以查到歷史瀏覽記錄,數(shù)據(jù)不太安全。
6))POST表示可能修改變服務(wù)器上的資源的請求,在服務(wù)器端,用Post方式提交的數(shù)據(jù)只能用Request.Form來獲取。
注意:在服務(wù)器端,用Request.QueryString來獲取Get方式提交來的數(shù)據(jù);Post請求則作為http消息的實際內(nèi)容發(fā)送給web服務(wù)器,數(shù)據(jù)放置在HTML Header內(nèi)提交,Post沒有限制提交的數(shù)據(jù)。Post比Get安全,當(dāng)數(shù)據(jù)是中文或者不敏感的數(shù)據(jù),則用get,因為使用get,參數(shù)會顯示在地址,對于敏感數(shù)據(jù)和不是中文字符的數(shù)據(jù),則用post。
6. 什么是cookie?Session和cookie有什么區(qū)別?
Cookie是會話技術(shù),將用戶的信息保存到瀏覽器的對象.
區(qū)別:
1)cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上
2)cookie不是很安全,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙,如果主要考慮到安全應(yīng)當(dāng)使用session
3)session會在一定時間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,如果主要考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE
4)單個cookie在客戶端的大小和個數(shù)都有限制,不同瀏覽器可能有具體差異
總之,在進行頁面cookie操作的時候,應(yīng)該盡量保證cookie個數(shù)小于20個,總大小 小于4KB
注意:將登陸信息等重要信息存放為SESSION;其他信息如果需要保留,可以放在COOKIE中。
7. jsp和servlet的區(qū)別、共同點、各自應(yīng)用的范圍?
JSP是Servlet技術(shù)的擴展,本質(zhì)上就是Servlet的簡易方式。JSP編譯后是“類servlet”。
Servlet和JSP最主要的不同點在于:Servlet的應(yīng)用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名為.jsp的文件。
JSP側(cè)重于視圖,Servlet主要用于控制邏輯。
8. tomcat容器是如何創(chuàng)建servlet類實例?用到了什么原理?
當(dāng)容器啟動時,會讀取在webapps目錄下所有的web應(yīng)用中的web.xml文件,然后對xml文件進行解析,并讀取servlet注冊信息。然后,將每個應(yīng)用中注冊的servlet類都進行加載,并通過反射的方式實例化。(有時候也是在第一次請求時實例化)
在servlet注冊時加上<load-on-startup>1</load-on-startup>如果為正數(shù),則在一開始就實例化,如果不寫或為負(fù)數(shù),則第一次請求實例化。
9. JDBC訪問數(shù)據(jù)庫的基本步驟是什么?
1)加載驅(qū)動
2)通過DriverManager對象獲取連接對象Connection
3)通過連接對象獲取會話
4)通過會話進行數(shù)據(jù)的增刪改查,封裝對象
5)關(guān)閉資源
10. preparedStatement和Statement的區(qū)別
1)效率:預(yù)編譯會話比普通會話對象,數(shù)據(jù)庫系統(tǒng)不會對相同的sql語句不會再次編譯
2)安全性:可以有效的避免sql注入攻擊,sql注入攻擊就是從客戶端輸入一些非法的特殊字符,而使服務(wù)器端在構(gòu)造sql語句的時候仍然能夠正確構(gòu)造,從而收集程序和服務(wù)器的信息和數(shù)據(jù)。比如:
“select * from t_user where userName = ‘” + userName + “ ’ and password =’” + password + “’”
如果用戶名和密碼輸入的是’1’ or ‘1’=’1’ ; 則生產(chǎn)的sql語句是:
“select * from t_user where userName = ‘1’ or ‘1’ =’1’ and password =’1’ or ‘1’=’1’
這個語句中的where 部分沒有起到對數(shù)據(jù)篩選的作用。
11. 事務(wù)的概念,在JDBC編程中處理事務(wù)的步驟。
1)事務(wù)是作為單個邏輯工作單元執(zhí)行的一系列操作。
2)一個邏輯工作單元必須有四個屬性,稱為原子性、一致性、隔離性和持久性 (ACID) 屬性,只有這樣才能成為一個事務(wù)事務(wù)處理步驟:
3)conn.setAutoComit(false);設(shè)置提交方式為手工提交
4)conn.commit()提交事務(wù)
5)出現(xiàn)異常,回滾 conn.rollback();
12. JDBC的臟讀是什么?哪種數(shù)據(jù)庫隔離級別能防止臟讀?
當(dāng)我們使用事務(wù)時,有可能會出現(xiàn)這樣的情況,有一行數(shù)據(jù)剛更新,與此同時另一個查詢讀到了這個剛更新的值。這樣就導(dǎo)致了臟讀,因為更新的數(shù)據(jù)還沒有進行持久化,更新這行數(shù)據(jù)的業(yè)務(wù)可能會進行回滾,這樣這個數(shù)據(jù)就是無效的。數(shù)據(jù)庫的 TRANSACTIONREADCOMMITTED ,TRANSACTIONREPEATABLEREAD 和 TRANSACTION_SERIALIZABLE 隔離級別可以防止臟讀。
13. 什么是幻讀,哪種隔離級別可以防止幻讀?
幻讀是指一個事務(wù)多次執(zhí)行一條查詢返回的卻是不同的值。假設(shè)一個事務(wù)正根據(jù)某個條件進行數(shù)據(jù)查詢,然后另一個事務(wù)插入了一行滿足這個查詢條件的數(shù)據(jù)。之后這個事務(wù)再次執(zhí)行了這條查詢,返回的結(jié)果集中會包含剛插入的那條新數(shù)據(jù)。這行新數(shù)據(jù)被稱為幻行,而這種現(xiàn)象就叫做幻讀。
只有 TRANSACTION_SERIALIZABLE 隔離級別才能防止產(chǎn)生幻讀。
14. JDBC的 DriverManager是用來做什么的?
JDBC的DriverManager是一個工廠類,我們通過它來創(chuàng)建數(shù)據(jù)庫連接。當(dāng)JDBC的Driver類被加載進來時,它會自己注冊到DriverManager類里面然后我們會把數(shù)據(jù)庫配置信息傳成DriverManager.getConnection()方法,DriverManager會使用注冊到它里面的驅(qū)動來獲取數(shù)據(jù)庫連接,并返回給調(diào)用的程序。
15. execute,executeQuery,executeUpdate的區(qū)別是什么?
1)Statement的execute(String query)方法用來執(zhí)行任意的SQL查詢,如果查詢的結(jié)果是一個ResultSet,這個方法就返回true。如果結(jié)果不是ResultSet,比如insert或者update查詢,它就會返回false。我們可以通過它的getResultSet方法來獲取ResultSet,或者通過getUpdateCount()方法來獲取更新的記錄條數(shù)。
2)Statement的executeQuery(String query)接口用來執(zhí)行select查詢,并且返回ResultSet。即使查詢不到記錄返回的ResultSet也不會為null。我們通常使用executeQuery來執(zhí)行查詢語句,這樣的話如果傳進來的是insert或者update語句的話,它會拋出錯誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。 ,
3)Statement的executeUpdate(String query)方法用來執(zhí)行insert或者update/delete(DML)語句,或者 什么也不返回,對于DDL語句,返回值是int類型,如果是DML語句的話,它就是更新的條數(shù),如果是DDL的話,就返回0。
只有當(dāng)你不確定是什么語句的時候才應(yīng)該使用execute()方法,否則應(yīng)該使用executeQuery或者executeUpdate方法。
16. 解釋一下什么是Servlet?
Servlet是使用Java Servlet應(yīng)用程序接口(API)及相關(guān)類和方法的Java程序,所有的Servlet都必須要實現(xiàn)的核心接口是javax.servlet.servlet。每一個servlet都必須要直接或者間接實現(xiàn)這個接口,或者繼承javax.servlet.GenericServlet或javax.servlet.HTTPServlet。Servlet主要用于處理客戶端傳來的HTTP請求,并返回一個響應(yīng)。
17. JSP常用的指令?
page:針對當(dāng)前頁面的指令。
include:包含另一個頁面
taglib:定義和訪問自定義標(biāo)簽
18. MVC的各個部分都有哪些技術(shù)來實現(xiàn)?如何實現(xiàn)?
MVC是Model-View-Controller的簡寫。
Model代表的是應(yīng)用的業(yè)務(wù)邏輯(通過Java Bean,EJB組件實現(xiàn))。
View是應(yīng)用的表示面(由JSP頁面產(chǎn)生)。
Controller是提供應(yīng)用的處理過程控制(一般是一個Servlet),通過這種設(shè)計模型把應(yīng)用邏輯,處理過程和顯示邏輯分成不同的組件實現(xiàn),這些組件可以進行交互和重用。
19. 過濾器和攔截器的區(qū)別
1)攔截器是基于java的反射機制的,而過濾器是基于函數(shù)回調(diào)
2)過濾器依賴于servlet容器,而攔截器不依賴于servlet容器
3)攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用
4)攔截器可以訪問action上下文、值棧里的對象,而過濾器不能
5)在action的生命周期中,攔截器可以多次被調(diào)用,而過濾器只在容器初始化時調(diào)用一次
攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調(diào)用一個方法,或者在方法后調(diào)用一個方法比如動態(tài)代理就是攔截器的簡單實現(xiàn),在你調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作),也可以在你調(diào)用方法后打印出字符串,甚至在你拋出異常的時候做業(yè)務(wù)邏輯的操作。
過濾器:是在Javaweb中,你傳入的request,response提前過濾掉一些信息,或者提前設(shè)置一些參數(shù),然后再傳入servlet或者struts的 action進行業(yè)務(wù)邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統(tǒng)一設(shè)置字符集,或者去除掉一些非法字符.
20. 保存 session id 有幾種方法 ?
1)保存 session id 的方式可以采用 cookie ,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把 這個標(biāo)識發(fā)送給服務(wù)器。
2)由于 cookie 可以被人為的禁止,必須有其它的機制以便在 cookie 被禁止時仍然能夠把 session id 傳遞回服務(wù)器,經(jīng)常采用的一種技術(shù)叫做 URL 重寫,就是把 session id 附加在 URL 路徑的后面,附加的方式也有兩種,一種是作為 URL 路徑的附加信息,另一種是作為查詢 字符串附加在 URL 后面。網(wǎng)絡(luò)在整個交互過程中始終保持狀態(tài),就必須在每個客戶端可能 請求的路徑后面都包含這個 session id 。
21. session 何時被刪除 ?
1)程序調(diào)用 HttpSession.invalidate()
2)距離上一次收到客戶端發(fā)送的 session id 時間間隔超過了 session 的最大有效時間
3)服務(wù)器進程被停止
注意關(guān)閉瀏覽器只會使存儲在客戶端瀏覽器內(nèi)存中的 session cookie 失效,不會使服務(wù)器端 的 session 對象失效 .
22. 狀態(tài)碼
1XX:指示信息-表示請求已經(jīng)接收,繼續(xù)處理
2XX:成功-表示請求已經(jīng)被成功接收,理解
3XX:重定向-要完成必須進行進一步操作
4XX:客戶端錯誤-請求無法實現(xiàn)或請求語句錯誤
5XX:服務(wù)端錯誤-服務(wù)器未能實現(xiàn)合法請求
200:OK-客戶端請求成功
301:資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它URL
302:臨時移動,(重定向)
400:客戶端請求有語法錯誤,不能被服務(wù)器所理解
401:請求未經(jīng)授權(quán)
403:接收到請求但是拒絕服務(wù)
404:請求資源不存在
500:服務(wù)器發(fā)生了不可預(yù)期的錯誤
503:服務(wù)器當(dāng)前不能處理客戶端請求,一段時間之后可能恢復(fù)正常
23. 談?wù)剬τ贏jax的理解
Ajax的優(yōu)點:
1)最大的一點是頁面無刷新,給用戶的體驗非常好。
2)使用異步方式與服務(wù)器通信,不需要打斷用戶操作,具有更加迅速的響應(yīng)能力。
3)ajax的原則是“按需取數(shù)據(jù)”,最大程度的減少冗余請求,減少服務(wù)器的負(fù)荷。
Ajax的缺點:
1)破壞瀏覽器后退按鈕的正常行為。在動態(tài)更新頁面后,用戶無法回到前一個頁面的狀態(tài).
2)使用JavaScript作Ajax的引擎,JavaScript的兼容性和Debug本身就讓人頭大。
Ajax的應(yīng)用場景:
1)文本輸入提示(自動完成)的場景(注冊)
2)對數(shù)據(jù)進行聯(lián)動過濾的場景(三級聯(lián)動)
24. 簡述JavaWeb的四大域?qū)ο?/h5>
PageContext,ServletRequest,HttpSession,ServletContext;
1)PageContext域:作用范圍是整個JSP頁面,是四大作用域中最小的一個;生命周期是當(dāng)對JSP的請求時開始,當(dāng)響應(yīng)結(jié)束時銷毀。
2)ServletRequest域:作用范圍是整個請求鏈(請求轉(zhuǎn)發(fā)也存在);生命周期是在service方法調(diào)用前由服務(wù)器創(chuàng)建,傳入service方法。整個請求結(jié)束,request生命結(jié)束。
3)HttpSession域:作用范圍是一次會話。生命周期是在第一次調(diào)用request.getSession()方法時,服務(wù)器會檢查是否已經(jīng)有對應(yīng)的session,如果沒有就在內(nèi)存中創(chuàng)建一個session并返回。當(dāng)一段時間內(nèi)session沒有被使用(默認(rèn)為30分鐘),則服務(wù)器會銷毀該session。如果服務(wù)器非正常關(guān)閉(強行關(guān)閉),沒有到期的session也會跟著銷毀。如果調(diào)用session提供的invalidate() ,可以立即銷毀session。
注意:服務(wù)器正常關(guān)閉,再啟動,Session對象會進行鈍化和活化操作。同時如果服務(wù)器鈍化的時間在session 默認(rèn)銷毀時間之內(nèi),則活化后session還是存在的。否則Session不存在。 如果JavaBean 數(shù)據(jù)在session鈍化時,沒有實現(xiàn)Serializable 則當(dāng)Session活化時,會消失。
4)ServletContext域:作用范圍是整個Web應(yīng)用。當(dāng)Web應(yīng)用被加載進容器時創(chuàng)建代表整個web應(yīng)用的ServletContext對象,當(dāng)服務(wù)器關(guān)閉或Web應(yīng)用被移除時,ServletContext對象跟著銷毀。
作用域從小到大為:PageContext(jsp頁面),ServletRequest(一次請求),HttpSession(一次會話),ServletContext(整個web應(yīng)用)。
25. JSP頁面基本結(jié)構(gòu)
1)腳本元素
32指令元素
3)動作元素
4)內(nèi)置對象:Out 、request、response、session、application、pageContext
26. 作用域的使用原則
能使用小的,就不使用大的
1)pageContext: 頁面級作用域
只在同一個頁面中有效
2)request: 請求級作用域
將數(shù)據(jù)存儲在請求對象,在產(chǎn)生響應(yīng),請求對象銷毀,其作用域也銷毀
用戶在發(fā)起下一次請求前,上一次請求的數(shù)據(jù)已經(jīng)銷毀了
3)session: 會話級作用域
將數(shù)據(jù)存儲在服務(wù)器上(session中),給客戶端下發(fā)憑證
每個客戶端都有自己獨立的session存儲空間
在客戶端不關(guān)閉瀏覽器,服務(wù)器不超時,客戶端可以隨時從session中獲得數(shù)據(jù)
4)application:應(yīng)用級作用域
將數(shù)據(jù)存儲在服務(wù)器上(application中),并給數(shù)據(jù)起一個key
所有客戶端共享同一個application存儲空間
只要服務(wù)器不關(guān)閉,應(yīng)用級作用域中的數(shù)據(jù)一直存在
27. session中數(shù)據(jù)失效的情況
(1)客戶端關(guān)閉了瀏覽器,憑證消失,不能取得服務(wù)器內(nèi)存的數(shù)據(jù)
(2)服務(wù)器重啟或關(guān)閉,服務(wù)器內(nèi)存的內(nèi)存清空,憑證無效
(3)服務(wù)器設(shè)置了超時時間,當(dāng)會話超過了超時時間,服務(wù)器內(nèi)存被清理,憑證無效
(4)通過程序代碼清除了session中的數(shù)據(jù)