J2EE基礎知識(選看)

1、Servlet接口中有哪些方法及Servlet生命週期

Servlet接口定義了5個方法,其中前三個方法與生命週期有關
·void init(ServletConfig config)throws ServletException
·void service(ServletRequest request,ServletResponse response)throws ServletException,java.io.IOException
·void destroy()
·java.lang.String getServletInfo()
·ServletConfig getServletConfig()

生命週期:Web容器加載Servlet並將其實例化後,Servlet生命週期開始,容器運行其init()方法進行Servlet的初始化;請求達到調用Servlet的service()方法,service()方法會根據需要調用與請求對應的doGet或doPost方法;當服務器關閉或者項目被卸載時服務器會將Servlet實例銷燬,此時會調用Servlet的destroy()方法。init方法和destroy方法只會執行一次,每次客戶端請求servlet都會執行service()方法。Servlet中有時會用到一些需要初始化與銷燬的資源,因此可以把初始化資源的代碼放入init方法中,銷燬資源代碼放入destroy方法中,這樣就不需要每次處理客戶端的請求都需要初始化與銷燬資源。

2、get和post請求的區別

可以吧get和post當做兩個不同的行爲,兩者本質上沒有區別,底層都是TCP連接。get請求用來從服務器上獲取資源,post是用來向服務器提交數據。比如你要獲取人員列表可以使用get請求,當你需要創建一個人員是可以使用post,這也是Restful API最基本的一個要求。

3、什麼情況調用doGet()和doPost()

Form標籤裏的method的屬性爲get時調用doGet方法,爲post時調用doPost方法

4、轉發和重定向的區別

轉發是服務器行爲,重定向是客戶端行爲

轉發(forward)通過RequestDispatcher對象的forward(HTTPServletRequest res,HTTPServletResponse resp)方法實現的。RequestDispatcher可以通過HttpServletRequest的
getRequestDispatcher()方法獲得。如下代碼就是跳轉到login_success.jsp頁面。

request.getRequestDispatcher("login_success.jsp").forward(request, response);

重定向(Redirect)是利用服務器返回的狀態碼實現的。客戶端瀏覽器請求服務器的時候,服務器會返回一個狀態碼。服務器通過HTTPServletResponse的setStatus(int status)方法設置狀態碼。如果服務器返回301或302,則瀏覽器會到新的網址重新請求該資源。

1.從地址欄顯示來說:forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容從哪裏來的,所以它的地址還是原來的地址,redirect是服務器根據邏輯,發送一個狀態碼,告訴瀏覽器重新請求那個地址,所以地址欄顯示的是新的URL。
2.從數據共享來說:forward轉發頁面和轉發到的頁面可以共享request裏面的數據,redirect不能共享數據。
3.從運用地方來說:forward一般用於用戶登錄的時候,根據角色轉發到對應的模塊;redirect一般用於用戶註銷登錄時返回主頁面或跳轉到其他的網站等
4.從效率上來說:forward高,redirect低。


5、Servlet與線程安全

Servlet線程是不安全的,多線程併發的讀寫會導致數據不同步的問題。解決的辦法是儘量不要定義name屬性,而是要把name變量分別定義在doGet和doPost方法內。雖然使用
synchronized(name){}語句塊可以解決問題,但是會造成線程池的等待,不是很科學的辦法。注意:多線程的併發的讀寫Servlet類屬性會導致數據不同步。但是如果只是併發地讀取屬性
而不寫入,則不存在數據不同步的問題。因此Servlet裏的只讀屬性最好定義爲final類型。

6、JSP和Servlet是什麼關係

Servlet是一個特殊的Java程序,它運行於服務器的JVM中,能夠依靠服務器的支持向瀏覽器提供顯示內容。JSP本質上是Servlet的一種簡易形式,JSP會被服務器處理成一個類似於Servlet的Java程序,可以簡化頁面內容的生成。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名爲.jsp的文件。有人說,Servlet就是在Java中寫HTML,而JSP就是在HTML中寫Java代碼,當然這個說法是很片面且不夠準確的。JSP側重於視圖,Servlet更側重於控制邏輯,在MVC架構模式中,JSP適合充當視圖(view)而Servlet適合充當控制器(controller)。

7、JSP工作原理

JSP是一種Servlet,但是與HttpServlet的工作方式不太一樣。HttpServlet是先由源代碼編譯爲class文件後部署到服務器下,爲先編譯後部署。而JSP則是先部署後編譯。JSP會在客戶端第一次請求JSP文件時被編譯爲HttpJspPage類(接口Servlet的一個子類)。該類會被服務器臨時存放在服務器工作目錄裏面。

8、JSP有哪些內置對象,作用分別是什麼

JSP有9個內置對象:
·request:封裝客服端的請求,其中包括來自get或post請求的參數;
·response:封裝服務器端對客戶的的響應;
·pageContext:通過該對象可以獲取其他對象;
·session:封裝用戶會話的對象;
·application:封裝服務器運行環境的對象;
·out:輸出服務器響應的輸出流對象;
·config:Web應用的配置對象;
·page:JSP頁面本身(相當於JAVA中的this);
·exception:封裝頁面拋出異常的對象。

9、include和include行爲的區別

include指令:JSP可以通過include指令來包含其他文件。被包含的文件可以是JSP文件、HTML或文本文件。包含的就好像是該JSP的一部分,會被同時編譯執行。語法格式:<%@ include file="文件相對URL的地址"%>
include動作:<jsp:include>動作元素用來包含靜態和動態的文件。該動作把指定的文件插入正在生成的頁面,語法格式:
<jsp:include page="相對URL地址" flush="true">

10、JSP九大內置對象、七大動作、三大指令

JSP中的四種作用域:page、request、session、application
·page代表與一個頁面相關的對象和屬性
·request代表與Web客戶端發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個Web組件;需要在頁面顯示的臨時數據可以置於此作用域。
·session代表與某個用戶與服務器建立的一次會話相關的對象和屬性。跟某個用戶相關的數據應該放在用戶自己的session中。
·application代表與整個Web應用程序相關的對象和屬性,它實際上是跨越整個Web應用程序,包括多個頁面、請求和會話的一個全局作用域。

11、如何實現JSP或Servlet的單線程模式

對於JSP頁面,同意通過page指令進行設置。<%@page isTheadSafe="false"%>
對於Servlet,可以讓自定義的Servlet實現SingleThreadModel標識接口
說明:如果將JSP或Servlet設置成單線程工作模式,會導致每個請求創建一個Servlet實例,這種實踐將導致嚴重的性能問題(服務器的內存壓力很大,還會頻繁的垃圾回收),所以通常情況下不會這麼做。

12、實現會話跟蹤的技術有哪些

1.使用cookie
向客戶端發送Cookie

Cookie c =new Cookie("name","value"); //創建Cookie 
c.setMaxAge(60*60*24); //設置最大時效,此處設置的最大時效爲一天
response.addCookie(c); //把Cookie放入到HTTP響應中

從客戶端讀取Cookie

String name ="name"; 
Cookie[]cookies =request.getCookies(); 
if(cookies !=null){ 
   for(int i= 0;i<cookies.length;i++){ 
    Cookie cookie =cookies[i]; 
    if(name.equals(cookis.getName())) 
    //do something in here. 
     cookie.getValue(); 
    }
 }

優點:數據可以持久保存,不需要服務器資源,簡單,基於文本的key-value
缺點:大小受到限制,用戶可以禁用cookie功能,由於保存在本地,有一定的風險

2.URL重寫
在URL中添加用戶的會話信息作爲請求的參數,或將唯一的會話ID添加到URL結尾以標識一個會話。
優點:在Cookie被禁用的時候任然可以使用
缺點:必須對網站的URL進行編碼,所有頁面必須動態生成,不能用預先記錄下來的URL進行訪問。

3.隱藏的表單域
    <input type="hidden" name="session" value="..." />
優點:cookie被禁用時可以使用,
缺點:所有頁面必須是表單提交之後的結果

4.HttpSession
在所有會話跟蹤技術中,HttpSession對象是最強大也是功能最多的。當一個用戶訪問某個網站時會自動創建HttpSession,每個用戶可以訪問他自己的HttpSession。可以通過HttpServletRequest對象的getSession方法獲得HttpSession,通過HttpSession的setAttribute方法可以將一個值放在HttpSession中,通過HttpSession的getAttribute方法,同時傳入屬性名就可以獲取保存在HttpSession中的對象。以上三種方式不同的是,HttpSession放在服務器的內存中,因此不要將過大的對象放在裏面,即使目前的Servlet容器可以在內存滿時將HttpSession中的對象移到其他存儲設備中,但是這樣勢必會影響性能。添加到HttpSession中的值可以是任意Java對象,這個對象最好實現了Serializble接口,這樣Servlet容器在必要的時候可以將其序列化到文件中,否則在序列化時就會出現異常。

13、Cookie和Session的區別

Cookie和Session都是用來跟蹤瀏覽器用戶的會話方式,但是兩者的應用場景不太一樣。
Cookie一般用來保存用戶信息。比如①我們在 Cookie 中保存已經登錄過的用戶信息,下次訪問網站的時候頁面可以自動幫你把登錄的一些基本信息給填了;②一般的網站都會有保持登錄也就是說下次你再訪問網站的時候就不需要重新登錄了,這是因爲用戶登錄的時候我們存放了一個 Token 在 Cookie 中,下次登錄的時候只需要根據 Token 值來查找用戶即可(爲了安全考慮,重新登錄一般要將 Token 重寫);③登錄一次網站後訪問網站其他頁面不需要重新登錄。
Session 的主要作用就是通過服務端記錄用戶的狀態。 典型的場景是購物車,當你要添加商品到購物車的時候,系統不知道是哪個用戶操作的,因爲 HTTP 協議是無狀態的。服務端給特定的用戶創建特定的 Session 之後就可以標識這個用戶並且跟蹤這個用戶了。
Cookie數據保存在客戶端(瀏覽器),Session保存數據在服務器端。
Cookie存儲在客服端中,而session存儲在服務器上,相對來說session安全性更高。若果cookie的一些敏感信息不要寫入cookie中,最好能將Cookie信息加密然後使用到的時候再去服務器端解密。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章