標籤:java jsp servlet 面試
在面試Java程式員工作時,經常會被問到JSP Servlet中相關的知識。這些知識都是JSP Servlet的基礎,這篇文章主要梳理一下JSP Servlet比較基礎但是又比較重要的知識。
1 service方法調用過程
在Servlet介面中有一個service方法,這個方法不是有人手動的調動,而是在運行時由tomcat自動調用的。GenericServlet抽象類別實現了Servlet介面,當然它也重寫了service方法,但是它也沒有具體實現。到了HttpServlet類中,service方法有了具體實現,它調用的是該類的protected service方法。具體的如下:
2 Servlet的生命週期
最重要的一條:在Servlet為用戶端提供服務的整個過程中,只有一個Servlet對象。當有使用者同時訪問時,是通過多線程方式完成的,線程有一個線程池。
生命全過程如下:
a、載入 classLoader
b、執行個體化 new(第一次用戶端過來時被執行個體化,整個生命過程中,只被執行個體化一次)
c、初始化 init(ServletConfig) (整個生命過程中,只被執行個體化一次)
d、處理請求 service()、 doGet()、 doPost() (以多線程方法執行)
e、退出服務 destroy() (web應用程式退出時、重新載入時、自動重新載入時都會調用該方法)
具體執行個體如下:
運行結果如下:
3 為何會有兩個init方法
在GenericServlet類中定義了兩個init方法:
首先看GenericServlet源碼。在GenericServlet類中,init(ServletConfig config)的源碼為:
因此,如果沒有兩個init方法時,我們程式員可以重寫init(ServletConfig config)方法,但如果程式員忘了寫了this.config = config一句話,就會出現錯誤。所以,程式員只要重寫那個不帶參數的init方法就行,不需要在意init(ServletConfig config)方法,系統會自動調用init(ServletConfig config)方法方法,通過該方法會調用到使用者自訂的init()方法。
4 JSP的內建對象
JSP的內建對象是可以在jsp代碼中不需要建立就可以直接用常用的內建對象,比如out對象,它就是JSP的一個內建對象,此外還有request、response、session、application、cookie、config、page、exception等。
5 JSP的動態包含和靜態包含
靜態包含
靜態包含的文法:<%@ include … %>
靜態包含的餓功能:意思是包含另一個網頁,方便重用。
靜態包含的特點:
a、被包含頁面在編譯之前就已經包含進來。
b、它轉換的結果是轉換為一個class檔案。(動態包含是兩個class)
c、這種包含不能傳參數,例如:代碼<%@include file="TitleBar.jsp?user=liguohui" %>就不行,這裡傳的參數user=liguohui是沒有意義的,因為在編譯期間傳參數是沒有意義的。
d、包含頁面和被包含頁面訪問的是同一個request對象,即不論是TileBar.jsp還是TestBar.jsp頁面都能調用“request.getParamter();”函數,且他們調用的是同一個對象,得到同一個結果。
e、包含頁面和被包含頁面裡的字元集必須是相同的,例如,如果在TileBar.jsp代碼裡面定義的字元集為:<%@page contentType="text/html;charset=gbk"%>;而在TestBar.jsp代碼裡面定義的字元集為:<%@pagecontentType="text/html;charset=gb2312"%>,那麼就會出錯。(但是這隻是tomcat的特點,不是所有容器的共同特點)。
f、在被包含頁面裡面沒有必要寫<html></html>標籤。
靜態包含的具體案例:
動態包含
動態包含的文法:<jsp:include page="date.jsp"/>
靜態包含的具體案例:
運行結果為:
動態包含和靜態包含還有一個巨大的區別是:靜態包含時,後台只會編譯出一個class檔案,而動態包含是後台會編譯出兩個class檔案。
6 sendRedirect和forward實現頁面跳轉
sendRedirect
利用sendRedirect方法可以將頁面轉到另一個地方去,例如下面代碼,可以將當前頁面轉到forforward1.jsp頁面去,同時可以傳一個參數name=liguohui。
當在地址欄裡面輸入地址:http://127.0.0.1/my/forward/test.jsp?name=zhumingyun&oldName=hui,同時給這個頁面傳兩個參數,會發現如下結果:
可見name=zhumingyun&oldName=hui參數被丟棄,而sendRedirect裡面的參數name=liguohui被保留。
後台列印出了一句話,可見,當sendRedirect指令發出後,後面的話繼續執行。
forward
Forward是動態轉向,代碼如下:
用戶端輸入地址:http://127.0.0.1/my/forward/forward.jsp?name=liguohui,並傳一參數name=liguohui,如所示:首先,它的地址欄沒變;其次,它能取到兩個頁面的參數,且同名參數時,後面的覆蓋前面的
總結sendRedirect和forward的區別如下(表格部分摘自北京尚學堂輔導機構視頻)
7 JSP中亂碼問題
解決方式大致如下:
全文完。轉賬請註明出處。
JSP Servlet學習筆記