Java學習筆記-Day53 Servlet與JSP

金海湖底有寶藏發表於2020-12-24



一、Servlet

1、簡介


Servlet是執行在伺服器端的元件,能夠給客戶端返回動態頁面。多個客戶端同時請求訪問一個Servlet,Web應用伺服器將為每個客戶端的連線啟動一個執行緒來服務。

Servlet是多執行緒、單例項的。第一次訪問Servlet時,伺服器將建立一個該Servlet類的物件,並呼叫doXxx方法生成響應。多個客戶端訪問同一個Servlet時,不再建立新的物件,而是共用同一個Servlet物件。

Servlet是一個java的類,這個類必須繼承於 javax.servlet.http.HttpServlet類。通常在web專案中新建一個名為controller的包來存放servlet檔案。

在這裡插入圖片描述
Servlet類使用doXxx方法提供服務,這些方法繼承於HttpServlet類。檢視API,可見doXxx方法都有兩個引數,分別是請求和響應。伺服器會建立請求物件和響應物件傳遞給doXxx方法,doXxx方法中可以直接使用請求和響應物件。

HttpServlet的方法:

方法描述
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個 DELETE請求.
protected void doGet(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個 GET請求 .
protected void doOptions(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個OPTIONS 請求 .
protected void doPost(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個 POST請求.
protected void doPut(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個 PUT請求.
protected void doTrace(HttpServletRequest req, HttpServletResponse resp)被server呼叫 (通過service方法) 以允許一個 servlet處理一個 TRACE請求.
protected long getLastModified(HttpServletRequest req)返回HttpServletRequest物件最後一次被修改的時間,單位是毫秒,自格林威治時間1970年1月1日午夜開始計時。
protected void service(HttpServletRequest req, HttpServletResponse resp)收到一個標準的來自公有service 方法的HTTP 請求並將其分配到該類中定義的doXXX方法。
void service(ServletRequest req, ServletResponse res)將客戶端請求分配到受保護的 service方法.

2、生命週期


Servlet是單例模式,當使用者第一次從瀏覽器請求訪問Servlet時,對應的Servlet的生命週期為:

(1)Tomcat 呼叫 Servlet 的構造方法,建立該類的物件。
(2)Tomcat 呼叫 JavaEE API 中的初始化方法:先呼叫有引數的init方法,再呼叫無參的init方法,進行初始化工作。(init方法只執行一次)
(3)初始化成功後,呼叫服務方法,通過判斷請求方式,呼叫相應的 doXxx 方法,如 doGet、doPost 等方法。(服務方法執行多次)
(4)doXxx 方法正常返回後,即提供服務結束。
(5)Tomcat 根據使用情況,在適當的時機銷燬 Servlet 物件,銷燬前呼叫 destroy 方法。
(6)垃圾回收finalize方法(虛擬機器呼叫,只執行一次)。

3、Servlet載入啟動選項


預設情況下,只有當第一次訪問Servlet時,伺服器才會初始化Servlet例項。如果需要在Tomcat啟動的時候就能初始化Servlet例項,可以在web.xml或@WebServlet中配置。

(1)在WebContent->WEB-INF->web.xml中配置,使得在啟動Tomcat的時候就能對Servlet例項化。<load-on-startup>2</load-on-startup>中的數字2不是表示個數,而是Servlet啟動的順序。Servlet永遠只被例項化一個物件。

<servlet>
    <description></description>
    <display-name>TestServlet</display-name>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.etc.train.controller.TestServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>	

(2)可以在@WebServlet中配置loadOnStartup,loadOnStartup的預設值為-1,值為-1的時候Tomcat啟動時不會例項化Servlet。

	@WebServlet(urlPatterns = "/TestServlet",loadOnStartup=1)
public class TestServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public TestServlet() {
        super();
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

4、配置預設首頁


web.xml中可以配置預設首頁。當不指定具體訪問路徑時,預設訪問預設首頁。將按照順序訪問,如果都不存在則報404錯誤。當web.xml修改完成後,需要重新啟動Tomcat。

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
</welcome-file-list>

5、Request請求和Response響應


伺服器實現了請求和響應介面,實現類分別是 RequestFacade 以及 ResponseFacade 。每次訪問Servlet,伺服器都會建立請求物件和響應物件傳遞給Servlet類的doXxx方法。

5.1、Request請求


通過瀏覽器提交給伺服器端的所有資料,都稱為請求資料。Servlet API中,定義了請求介面,用來封裝和操作請求資料。

HttpServletRequest介面 :負責處理請求(Tomcat對其進行例項化),javax.servlet.http.HttpServletRequest介面繼承於javax.servlet. ServletRequest介面。

5.1.1、ServletRequest介面的方法


(1)public void setAttribute(java.lang.String name, java.lang.Object o):將資料儲存在請求範圍內。在請求的範圍內傳遞資料。name是一個指定變數名字的字串,o是被儲存的物件。name為鍵,o為值,可以通過name得到o。

	request.setAttribute("list",list);

(2)public void removeAttribute(java.lang.String name):從請求範圍中刪除一個屬性。name是一個指定需要刪除的變數名字的字串,也可以看成鍵。

	request.removeAttribute("list");

(3)public RequestDispatcher getRequestDispatcher(java.lang.String path):返回一個作為位於給定路徑的資源的封裝器的 RequestDispatcher 物件。RequestDispatcher 物件可以被用於向一個資源轉發請求,或者用於在一個響應中包含該資源。該資源可以是動態的也可以是靜態的。

  • RequestDispatcher 的方法:public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException:在伺服器上將一個請求從一個servlet轉到另一個資源 (servlet, JSP檔案, 或HTML檔案)。該方法允許一個servlet預處理一個請求和用於產生響應的另一個資源。
	//轉發:從servlet跳轉到jsp頁面
	request.getRequestDispatcher("a.jsp").forward(request, response);

(4)public java.lang.Object getAttribute(java.lang.String name):返回在請求範圍中對應name(鍵)的屬性,當沒有具有所給name的屬性時,則返回一個空值。

	List<Blog> list = (List<Blog>) request.getAttribute("list");

(5)public java.lang.String getParameter(java.lang.String name):返回一個請求引數的字串值。若該引數不存在,則返回一個空值。

(6)public java.lang.String[] getParameterValues(java.lang.String name):返回一個包含所有的給定請求引數的值的字串物件的向量。若該引數不存在,則返回一個空值。

注意:
setAttribute方法與getRequestDispatcher方法是一對搭檔,需要結合使用。通過setAttribute方法設定資料,通過getAttribute獲取資料,此時獲取的資料是Object型別。

5.1.2、HttpServletRequest介面的方法


public java.lang.String getHeader(java.lang.String name):返回指定的作為字串請求訊息頭的值。如果該請求沒有指定名稱的訊息頭,該方法將返回null值。

MIME:MIME全名叫多用途網際網路郵件擴充套件(Multipurpose Internet Mail Extensions),瀏覽器能接受的MIME,最初是為了將純文字格式的電子郵件擴充套件到可以支援多種資訊格式而定製的。後來被應用到多種協議裡,包括我們常用的HTTP協議。MIME的常見形式是一個主型別加一個子型別,用斜線分隔。比如text/html、application/javascript、image/png等。在訪問網頁時,MIME type幫助瀏覽器識別一個HTTP請求返回的是什麼內容的資料,應該如何開啟、如何顯示型別。

5.2、Response響應


通過伺服器返回給客戶端的所有資料,都稱為響應資料。Servlet API中,定義了響應介面,用來封裝和操作響應資料。

HttpServletResponse介面 :負責處理響應(Tomcat對其進行例項化),javax.servlet.http.HttpServletResponse介面 繼承於 javax.servlet. ServletResponse介面。

5.2.1、ServletResponse介面的方法


(1)public java.lang.String getCharacterEncoding():返回用於在這個響應訊息中被髮送的 MIME body的編碼的名稱。如果沒有分配charset ,就隱含地設定成ISO-8859-1 (Latin-1)。

(2)public void setCharacterEncoding(String env) throws UnsupportedEncodingException:設定用於在這個響應訊息中被髮送的 MIME body的編碼。

	request.setCharacterEncoding("utf-8");

(3)public java.io.PrintWriter getWriter() throws java.io.IOException:返回能夠向一個客戶機傳送字元的 PrintWriter 物件。 如果有必要的話,響應的 MIME 型別可以修改以反映所用的字元編碼。 本方法或方法getOutputStream() 兩者中的任何一個都可以被呼叫來寫入 body , 但不能同時呼叫這兩者。 返回一個能夠向一個客戶端返回字元的PrintWriter 物件。

	PrintWriter out = response.getWriter();
	out.print("<p>Servlet</p>");

(4)public void setContentType(java.lang.String type):設定正被髮往客戶端的響應的內容型別。 內容型別可以包括所用的字元編碼型別,例如, text/html; charset=ISO-8859-4。

5.2.2、HttpServletResponse介面的方法


(1)public void sendRedirect(java.lang.String location) throws java.io.IOException:用指定的重定位URL向客戶端傳送一個臨時重定位響應訊息。該方法可以接收相對的 URL。

	response.sendRedirect("b.jsp");

二、JSP檔案

1、JSP簡介


JSP(Java Server Pages)是JavaEE規範中的Web元件,用來編寫動態頁面。JSP執行在伺服器端,本質是Servlet。JSP檔案以.jsp為字尾,在Eclipse的工程目錄中存在WebContent目錄下。JSP檔案可以直接在瀏覽器中訪問。JSP檔案中的內容就是 HTML+Java程式碼,靜態部分使用HTML和文字即可,動態部分使用Java程式碼。

Servlet生成動態頁面比較繁瑣,使用JSP生成動態頁面比較便捷,因為其中的靜態內容可以使用HTML生成。JSP的執行過程是:翻譯-編譯-例項化-提供服務。JSP的本質就是Servlet,不過是伺服器將JSP進行了翻譯和編譯;可以說,JSP也是一個Java類。

JSP是包含Java程式碼的html檔案,用來展示資料。雖然servlet和jsp都能展示資料,但是通常不會使用servlet顯示資料,而是使用jsp來展示資料。

新建JSP檔案:在WebContent目錄右鍵 -> new -> JSP File -> Finish。

在JSP檔案總,快捷鍵 ctrl+shift+o 是無效的,而快捷鍵 Alt+/ 是有效的。

JSP中的語法:

(1)指令:用來導包和做一些文件的設定。語法:<%@指令 %>

<%@page import="com.etc.bs.service.BlogService"%>
<%@page language="java" contentType="text/html; charset=UTF-8"	pageEncoding="UTF-8"%>

(2)小指令碼:用來編寫Java程式碼。語法:<% Java程式碼 %>

<%
	System.out.println("小指令碼");
	System.out.println("Java程式碼");
%>

(3)表示式:用來做頁面輸出。語法:<%=表示式%>

	<% String s = "this.is jsp"%>
	<%=s%>

(4)註釋:在JSP中可以使用註釋元素,有三種情況:

  1. 格式為<%--JSP註釋--%>,JSP的註釋只有在原始碼中可見,翻譯時已經忽略。

  2. 在JSP中,除了使用JSP註釋外,還可以使用HTML註釋,<!--HTML註釋-->,HTML註釋會被返回到客戶端,但是不顯示到頁面中。

  3. JSP中的Java程式碼部分,可以使用Java註釋,Java註釋會翻譯到.java檔案中,但是編譯時忽略。

(5)宣告:如果需要在JSP檔案中定義類的成員變數或方法,可以使用宣告元素,格式為<%! 宣告語句%>

JSP中的執行過程:jsp檔案通過Tomcat翻譯成java檔案(servlet),java檔案再通過虛擬機器編譯成class位元組碼檔案。實際上響應給瀏覽器的是位元組碼檔案,所以有時候第一次載入網頁時可能比較慢,而後面再載入網頁時速度較快,生成的java檔案和位元組碼檔案都在Tomcat根目錄的work目錄之中。

Jar包的配置:Jar放到WebContent/WEB-INF/lib中,正常會自動加入構建路徑。可以在javaResources-> Libraries->Web App Libraries 檢視是否構建。

jdbc的DBUtil工具類需要載入驅動 class.forName("com.mysql.cj.jdbc.Driver");

Web專案的程式碼寫好之後,需要重新啟動Tomcat Service,同時要關注控制檯的輸出資訊。

2、JSP九大內建物件


(1)與輸入/輸出有關的物件: request、response、out

(2)與屬性作用域有關的物件:session、application、pageContext

(3)與Servlet 相關物件:page、config

(4)與錯誤處理有關的:exception
在這裡插入圖片描述

3、作用域範圍


(1)pagecontent(頁面上下文):當前頁面有效(頁面跳轉後無效)

(2)request(請求):同一次請求有效(請求轉發後有效,重定向後無效)

(3)session(會話):同一次對話有效(同一個瀏覽器在退出關閉之前都有效)

(4)application:全域性有效(整在伺服器一開始執行服務,到伺服器關閉為止)

從小到大順序:pagecontent < request < session < application

作用域範圍都包含 setAttribute方法 (儲存資料) 和 getAttribute方法 (獲取資料)。

相關文章