JSP Servlet學習筆記

來源:互聯網
上載者:User

標籤: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的一個內建對象,此外還有requestresponsesession、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學習筆記

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.