Java面試寶典之Java Web篇20題
1.session和cookie的區別?
session是存儲在服務(wù)器端,cookie是存儲在客戶(hù)端的,所以安全來(lái)講session的安全性要比cookie高,然后我們獲取session里的信息是通過(guò)存放在會(huì )話(huà)cookie里的sessionid獲取的。又由于session是存放在服務(wù)器的內存中,所以session里的東西不斷增加會(huì )造成服務(wù)器的負擔,所以會(huì )把很重要的信息存儲在session中,而把一些次要東西存儲在客戶(hù)端的cookie里,然后cookie確切的說(shuō)分為兩大類(lèi)分為會(huì )話(huà)cookie和持久化cookie,會(huì )話(huà)cookie確切的說(shuō)是,存放在客戶(hù)端瀏覽器的內存中,所以說(shuō)他的生命周期和瀏覽器是一致的,瀏覽器關(guān)了會(huì )話(huà)cookie也就消失了,然而持久化cookie是存放在客戶(hù)端硬盤(pán)中,而持久化cookie的生命周期就是我們在設置cookie時(shí)候設置的那個(gè)保存時(shí)間,然后我們考慮一問(wèn)題當瀏覽器關(guān)閉時(shí)session會(huì )不會(huì )丟失,從上面敘述分析session的信息是通過(guò)會(huì )話(huà)cookie的sessionid獲取的,當瀏覽器關(guān)閉的時(shí)候會(huì )話(huà)cookie消失所以我們的sessionid也就消失了,但是session的信息還存在服務(wù)器端,這時(shí)我們只是查不到所謂的session但它并不是不存在。那么,session在什么情況下丟失,就是在服務(wù)器關(guān)閉的時(shí)候,或者是session過(guò)期(默認時(shí)間是30分鐘),再或者調用了invalidate()的或者是我們想要session中的某一條數據消失調用session.removeAttribute()方法,然后session在什么時(shí)候被創(chuàng )建呢,確切的說(shuō)是通過(guò)調用getsession()來(lái)創(chuàng )建,這就是session與cookie的區別.
2、session和cookie聯(lián)系?
session是通過(guò)cookie來(lái)工作的session和cookie之間是通過(guò)$_COOKIE['PHPSESSID']來(lái)聯(lián)系的,通過(guò)$_COOKIE['PHPSESSID']可以知道session的id,從而獲取到其他的信息。
在購物網(wǎng)站中通常將用戶(hù)加入購物車(chē)的商品聯(lián)通session_id記錄到數據庫中,當用戶(hù)再次訪(fǎng)問(wèn)是,通過(guò)sessionid就可以查找到用戶(hù)上次加入購物車(chē)的商品。因為sessionid是唯一的,記錄到數據庫中就可以根據這個(gè)查找了。
3.servlet的生命周期?
Servlet生命周期可以分成四個(gè)階段:加載和實(shí)例化、初始化、服務(wù)、銷(xiāo)毀。
當客戶(hù)第一次請求時(shí),首先判斷是否存在Servlet對象,若不存在,則由Web容器創(chuàng )建對象,而后調用init()方法對其初始化,此初始化方法在整個(gè)Servlet生命周期中只調用一次。
完成Servlet對象的創(chuàng )建和實(shí)例化之后,Web容器會(huì )調用Servlet對象的service()方法來(lái)處理請求。
當Web容器關(guān)閉或者Servlet對象要從容器中被刪除時(shí),會(huì )自動(dòng)調用destory()方法。
4.什么是webservice?
從表面上看,WebService就是一個(gè)應用程序向外界暴露出一個(gè)能通過(guò)Web進(jìn)行調用的API,也就是說(shuō)能用編程的方法通過(guò)Web來(lái)調用這個(gè)應用程序。我們把調用這個(gè)WebService的應用程序叫做客戶(hù)端,而把提供這個(gè)WebService的應用程序叫做服務(wù)端。從深層次看,WebService是建立可互操作的分布式應用程序的新平臺,是一個(gè)平臺,是一套標準。它定義了應用程序如何在Web上實(shí)現互操作性,你可以用任何你喜歡的語(yǔ)言,在任何你喜歡的平臺上寫(xiě)Web?service?,只要我們可以通過(guò)Web?service標準對這些服務(wù)進(jìn)行查詢(xún)和訪(fǎng)問(wèn)。
5.jsp和servlet的區別、共同點(diǎn)、各自應用的范圍?
JSP是Servlet技術(shù)的擴展,本質(zhì)上就是Servlet的簡(jiǎn)易方式。JSP編譯后是“類(lèi)servlet”。Servlet和JSP最主要的不同點(diǎn)在于,Servlet的應用邏輯是在Java文件中,并且完全從表示層中的HTML里分離開(kāi)來(lái)。而JSP的情況是Java和HTML可以組合成一個(gè)擴展名為.jsp的文件。JSP側重于視圖,Servlet主要用于控制邏輯。在struts框架中,JSP位于MVC設計模式的視圖層,而Servlet位于控制層。
6.轉發(fā)(forward)和重定向(redirect)的區別?
1、從地址欄顯示來(lái)說(shuō)
forward是服務(wù)器請求資源,服務(wù)器直接訪(fǎng)問(wèn)目標地址的URL,把那個(gè)URL的響應內容讀取過(guò)來(lái),然后把這些內容再發(fā)給瀏覽器。瀏覽器根本不知道服務(wù)器發(fā)送的內容從哪里來(lái)的,所以它的地址欄還是原來(lái)的地址。
redirect是服務(wù)端根據邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請求那個(gè)地址。所以地址欄顯示的是新的URL。
2、從數據共享來(lái)說(shuō)
forward:轉發(fā)頁(yè)面和轉發(fā)到的頁(yè)面可以共享request里面的數據。
redirect:不能共享數據。
3、從運用地方來(lái)說(shuō)
forward:一般用于用戶(hù)登陸的時(shí)候,根據角色轉發(fā)到相應的模塊。
redirect:一般用于用戶(hù)注銷(xiāo)登陸時(shí)返回主頁(yè)面和跳轉到其它的網(wǎng)站等
4、從效率來(lái)說(shuō)
forward:高。
redirect:低。
7.request.getAttribute()和request.getParameter()有何區別?
1、request.getParameter()取得是通過(guò)容器的實(shí)現來(lái)取得通過(guò)類(lèi)似post,get等方式傳入的數據。
2、request.setAttribute()和getAttribute()只是在web容器內部流轉,僅僅是請求處理階段。
3、getAttribute是返回對象,getParameter返回字符串
4、getAttribute()一向是和setAttribute()一起使用的,只有先用setAttribute()設置之后,才能夠通過(guò)getAttribute()來(lái)獲得值,它們傳遞的是Object類(lèi)型的數據。而且必須在同一個(gè)request對象中使用才有效。,而getParameter()是接收表單的get或者post提交過(guò)來(lái)的參數
8.jsp靜態(tài)包含和動(dòng)態(tài)包含的區別?
1、兩者格式不同,靜態(tài)包含:<%@ include file="文件" %>,而動(dòng)態(tài)包含:<jsp : include page = "文件" />。
2、包含時(shí)間不同,靜態(tài)包含是先將幾個(gè)文件合并,然后再被編譯,缺點(diǎn)就是如果含有相同的標簽,會(huì )出錯。動(dòng)態(tài)包含是頁(yè)面被請求時(shí)編譯,將結果放在一個(gè)頁(yè)面。
3、生成的文件不同,靜態(tài)包含會(huì )生成一個(gè)包含頁(yè)面名字的servlet和class文件;而動(dòng)態(tài)包含會(huì )各自生成對應的servlet和class文件
4、.傳遞參數不同,動(dòng)態(tài)包含能夠傳遞參數,而靜態(tài)包含不能
9.MVC的各個(gè)部分都有哪些技術(shù)來(lái)實(shí)現?如何實(shí)現?
MVC是Model-View-Controller的簡(jiǎn)寫(xiě)。"Model" 代表的是應用的業(yè)務(wù)邏輯(通過(guò)JavaBean,EJB組件實(shí)現), "View" 是應用的表示面(由JSP頁(yè)面產(chǎn)生),"Controller" 是提供應用的處理過(guò)程控制(一般是一個(gè)Servlet),通過(guò)這種設計模型把應用邏輯,處理過(guò)程和顯示
邏輯分成不同的組件實(shí)現。這些組件可以進(jìn)行交互和重用。
10.jsp有哪些內置對象?作用分別是什么?
JSP有9個(gè)內置對象:?
request:封裝客戶(hù)端的請求,其中包含來(lái)自GET或POST請求的參數;?
response:封裝服務(wù)器對客戶(hù)端的響應;?
pageContext:通過(guò)該對象可以獲取其他對象;?
session:封裝用戶(hù)會(huì )話(huà)的對象;?
application:封裝服務(wù)器運行環(huán)境的對象;?
out:輸出服務(wù)器響應的輸出流對象;?
config:Web應用的配置對象;?
page:JSP頁(yè)面本身(相當于Java程序中的this);?
exception:封裝頁(yè)面拋出異常的對象。
11.方法的區別。
1、Get是向服務(wù)器發(fā)索取數據的一種請求,而Post是向服務(wù)器提交數據的一種請求
2、Get是獲取信息,而不是修改信息,類(lèi)似數據庫查詢(xún)功能一樣,數據不會(huì )被修改
3、Get請求的參數會(huì )跟在url后進(jìn)行傳遞,請求的數據會(huì )附在URL之后,以?分割URL和傳輸數據,參數之間以&相連,%XX中的XX為該符號以16進(jìn)制表示的ASCII,如果數據是英文字母/數字,原樣發(fā)送,如果是空格,轉換為+,如果是中文/其他字符,則直接把字符串用BASE64加密。
4、Get傳輸的數據有大小限制,因為GET是通過(guò)URL提交數據,那么GET可提交的數據量就跟URL的長(cháng)度有直接關(guān)系了,不同的瀏覽器對URL的長(cháng)度的限制是不同的。
5、GET請求的數據會(huì )被瀏覽器緩存起來(lái),用戶(hù)名和密碼將明文出現在URL上,其他人可以查到歷史瀏覽記錄,數據不太安全。
在服務(wù)器端,用Request.QueryString來(lái)獲取Get方式提交來(lái)的數據
Post請求則作為。
6、POST表示可能修改變服務(wù)器上的資源的請求,在服務(wù)器端,用Post方式提交的數據只能用Request.Form來(lái)獲取。
12.tomcat容器是如何創(chuàng )建servlet類(lèi)實(shí)例?用到了什么原理?
當容器啟動(dòng)時(shí),會(huì )讀取在webapps目錄下所有的web應用中的web.xml文件,然后對xml文件進(jìn)行解析,并讀取servlet注冊信息。然后,將每個(gè)應用中注冊的servlet類(lèi)都進(jìn)行加載,并通過(guò)反射的方式實(shí)例化。(有時(shí)候也是在第一次請求時(shí)實(shí)例化)
在servlet注冊時(shí)加上<load-on-startup>1</load-on-startup>如果為正數,則在一開(kāi)始就實(shí)例化,如果不寫(xiě)或為負數,則第一次請求實(shí)例化。
13.JDBC訪(fǎng)問(wèn)數據庫的基本步驟是什么?
第一步:Class.forName()加載數據庫連接驅動(dòng);
第二步:DriverManager.getConnection()獲取數據連接對象;
第三步:根據SQL獲取sql會(huì )話(huà)對象,有2種方式 Statement、PreparedStatement ;
第四步:執行SQL,執行SQL前如果有參數值就設置參數值setXXX();
第五步:處理結果集;
第六步:關(guān)閉結果集、關(guān)閉會(huì )話(huà)、關(guān)閉連接。
14.為什么要使用PreparedStatement?
PreparedStatement接口繼承Statement,PreparedStatement實(shí)例包含已編譯的SQL語(yǔ)句,所以其執行速度要快于Statement對象。
作為Statement的子類(lèi), PreparedStatement 繼承了Statement的所有功能。三種方法execute、 executeQuery和executeUpdate已被更改以使之不再需要參數。
在 JDBC 應用中,多數情況下使用PreparedStatement,原因如下:
代碼的可讀性和可維護性。Statement需要不斷地拼接,而PreparedStatement不會(huì )。
PreparedStatement盡最大可能提高性能。DB有緩存機制,相同的預編譯語(yǔ)句再次被調用不會(huì )再次需要編譯。
最重要的一點(diǎn)是極大地提高了安全性。Statement容易被SQL注入,而PreparedStatement傳入的內容不會(huì )和sql 語(yǔ)句發(fā)生任何匹配關(guān)系。
15.數據庫連接池的原理。為什么要使用連接池?
1、數據庫連接是一件費時(shí)的操作,連接池可以使多個(gè)操作共享一個(gè)連接。
2、數據庫連接池的基本思想就是為數據庫連接建立一個(gè)“緩沖池”。預先在緩沖池中放入一定數量的連接,當需要建立數據庫連接時(shí),只需從“緩沖池”中取出一個(gè),使用完畢之后再放回去。我們可以通過(guò)設定連接池最大連接數來(lái)防止系統無(wú)盡的與數據庫連接。更為重要的是我們可以通過(guò)連接池的管理機制監視數據庫的連接的數量、使用情況,為系統開(kāi)發(fā),測試及性能調整提供依據。
3、使用連接池是為了提高對數據庫連接資源的管理
16.execute,executeQuery,executeUpdate的區別是什么?
1、Statement的execute(String query)方法用來(lái)執行任意的SQL查詢(xún),如果查詢(xún)的結果是一個(gè)ResultSet,這個(gè)方法就返回true。如果結果不是ResultSet,比如insert或者update查詢(xún),它就會(huì )返回false。我們可以通過(guò)它的getResultSet方法來(lái)獲取ResultSet,或者通過(guò)getUpdateCount()方法來(lái)獲取更新的記錄條數。?
2、Statement的executeQuery(String query)接口用來(lái)執行select查詢(xún),并且返回ResultSet。即使查詢(xún)不到記錄返回的ResultSet也不會(huì )為null。我們通常使用executeQuery來(lái)執行查詢(xún)語(yǔ)句,這樣的話(huà)如果傳進(jìn)來(lái)的是insert或者update語(yǔ)句的話(huà),它會(huì )拋出錯誤信息為 “executeQuery method can not be used for update”的java.util.SQLException。 ,
3、Statement的executeUpdate(String query)方法用來(lái)執行insert或者update/delete(DML)語(yǔ)句,或者 什么也不返回,對于DDL語(yǔ)句,返回值是int類(lèi)型,如果是DML語(yǔ)句的話(huà),它就是更新的條數,如果是DDL的話(huà),就返回0。?
只有當你不確定是什么語(yǔ)句的時(shí)候才應該使用execute()方法,否則應該使用executeQuery或者executeUpdate方法。
17.JDBC的ResultSet是什么?
在查詢(xún)數據庫后會(huì )返回一個(gè)ResultSet,它就像是查詢(xún)結果集的一張數據表。?
ResultSet對象維護了一個(gè)游標,指向當前的數據行。開(kāi)始的時(shí)候這個(gè)游標指向的是第一行。如果調用了ResultSet的next()方法游標會(huì )下移一行,如果沒(méi)有更多的數據了,next()方法會(huì )返回false。可以在for循環(huán)中用它來(lái)遍歷數據集。?
默認的ResultSet是不能更新的,游標也只能往下移。也就是說(shuō)你只能從第一行到最后一行遍歷一遍。不過(guò)也可以創(chuàng )建可以回滾或者可更新的ResultSet
當生成ResultSet的Statement對象要關(guān)閉或者重新執行或是獲取下一個(gè)ResultSet的時(shí)候,ResultSet對象也會(huì )自動(dòng)關(guān)閉。?
可以通過(guò)ResultSet的getter方法,傳入列名或者從1開(kāi)始的序號來(lái)獲取列數據。
18.什么是Servlet?
Servlet是使用Java Servlet應用程序接口(API)及相關(guān)類(lèi)和方法的Java程序,所有的Servlet都必須要實(shí)現的核心接口是javax.servlet.servlet。每一個(gè)servlet都必須要直接或者間接實(shí)現這個(gè)接口,或者繼承javax.servlet.GenericServlet或javax.servlet.。
Servlet主要用于處理客戶(hù)端傳來(lái)的HTTP請求,并返回一個(gè)響應。
19.doGet和doPost方法有什么區別?
doGet:GET方法會(huì )把名值對追加在請求的URL后面。因為URL對字符數目有限制,進(jìn)而限制了用在客戶(hù)端請求的參數值的數目。并且請求中的參數值是可見(jiàn)的,因此,敏感信息不能用這種方式傳遞。
doPOST:POST方法通過(guò)把請求參數值放在請求體中來(lái)克服GET方法的限制,因此,可以發(fā)送的參數的數目是沒(méi)有限制的。最后,通過(guò)POST請求傳遞的敏感信息對外部客戶(hù)端是不可見(jiàn)的。
20.JSP有哪些動(dòng)作?分別是什么?
JSP共有以下6種基本動(dòng)作
jsp:include:在頁(yè)面被請求的時(shí)候引入一個(gè)文件。
jsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個(gè)JavaBean的屬性。
jsp:forward:把請求轉到一個(gè)新的頁(yè)面。
jsp:plugin:根據瀏覽器類(lèi)型為Java插件生成OBJECT或EMBED標記