1. 程式人生 > >有關Servlet和JSP的梳理(一)

有關Servlet和JSP的梳理(一)

con type 獨立 ava 項目 考試成績 add lean 提交

  大二第一學期的時候有學JSP的課,但是因為在開學之前做過JSP的小項目,所以一個學期的課也沒聽,直到期末考試成績出來了,才回想JSP的內容還有多少記得,沒想到模模糊糊也記不起多少,趕緊回頭學回來。接下來是關於Servlet和JSP的梳理。

-------------------------------------------------------------------------------------------------------------------------------------------------

  Servlet是一個Java程序,一個Servlet應用有一個或多個Servlet程序,而且JSP頁面也會被轉換和編譯成Servlet程序。

  Servlet應用無法獨立運行,必須運行在Servlet容器中。Servlet容器將用戶的請求傳遞給Servlet應用,並將結果返回給用戶。由於大部分Servlet應用都包含多個JSP頁面,因此更準確地說是“Servlet/JSP應用”。

  其中,Servlet API是開發Servlet的主要技術。而Servlet API有以下4個Java包:

Java

包含的內容

javax.servlet

定義Servlet和Servlet容器之間契約的類和接口

javax.servlet.http

定義HTTP Servlet和Servlet容器之間契約的類和接口

javax.servlet.annotation

標註Servlet、Filter、Listener的標註。它還被標註原件定義元數據

javax.servlet.descriptor

包含提供程序化登陸web應用程序的配置信息的類型。

  Servlet技術的核心是Servlet,它是所有Servlet類必須直接或間接實現的一個接口,而Servlet接口定義了Servlet與Servlet容器之間的契約。這個契約歸結起來就是,Servlet容器將Servlet類載入內存,並在Servlet實例上調用具體的方法。當用戶的請求使得Servlet容器調用Servlet的Service方法,會傳入一個ServletRequest實例和一個ServletResponse實例,其中,ServletRequest中封裝了當前的HTTP請求,而ServletResponse表示當前用戶的HTTP響應。對於每一個應用程序,Servlet容器還會創建一個ServletContext實例,這個對象中封裝了上下文(應用程序)的環境詳情。每個上下文只有一個ServletContext,而且每個Servlet實例都有一個配置的ServletConfig。

技術分享圖片

 Servlet的生命周期方法:

  

Servlet容器的生命周期方法

作用

init

該方法在Servlet第一次被請求的時候,Servlet就會調用這個方法,而後不再被調用,所以可以用這個方法進行初始化工作。調用這個方法時,Servlet容器會傳入一個ServletConfig。

Service

每當請求Servlet時,Servlet容器就會調用這個方法。第一次請求Servlet時,Servlet容器調用init方法和Service方法。後續的請求將只調用Service方法。

destroy

當要銷毀Servlet時,Servlet容器就會調用這個方法。一般會在這個方法中編寫清除代碼。

  在介紹一個Servlet中另外兩個非生命周期的方法:

Servlet容器的非生命周期方法

作用

getServletInfo

這個方法會返回Servlet的描述

getServletConfig

這個方法會返回由Servlet容器傳給init方法的ServletConfig。

但是為了讓getServletConfig返回一個非null值,必須將傳給init方法的ServletConfig賦給一個類級變量。

-------------------------------------------------------------------------------------------------------------------------------------------------

  接下來是Servlet的各類接口:

  ServletRequest

 

接口

說明

ServletRequest

對於每一個HTTP請求,Servlet容器都會創建一個ServletRequest實例,並將它傳給Servlet的Service方法。ServletRequest封裝了關於這個請求的信息。

  常用的方法有:

    

方法

說明

public int getContentLength()

返回請求主體的字節數。

public java.lang.String getContentType()

返回請求主體的MIME類型。

public java.lang.String getParameter(java.lang.String name)

返回指定請求參數的值

public java.lang.String getProtocol()

返回這個HTTP請求的協議名稱和版本

  ServletResponse

接口

說明

ServletResponse

該接口表示一個Servlet響應。在調用Servlet的Service方法前,Servlet容器首先創建一個ServletResponse,並將它作為第二個參數傳給Service方法。ServletResponse隱藏了向瀏覽器發送響應的復雜過程。

  常用的方法:

 

方法

說明

getWriter()

返回了一個可以向客戶端發送文本的java.io.PrintWriter。默認情況下,PrintWriter對象使用ISO-8859-1編碼。

setContentType(“type”)

設置響應的內容類型,並將”text/html”作為一個參數傳入。如果沒有設置相應內容類型,有些瀏覽器就會將HTML標簽顯示為普通文本。

  ServletConfig

  

接口

說明

ServletConfig

用於存儲關於Servlet的配置信息。

當Servlet容器初始化Servlet時,Servlet容器會給Servlet的init()方法傳入一個ServletConfig。ServletConfig封裝可以通過@WebServlet或描述符傳給Servlet的配置信息。

   常用的方法:

 

方法

說明

java.lang.String getInitParameter(java,lang.String name)

為了從Servlet內部獲取到初始參數的值,要在Servlet容器傳給Servlet的init方法的ServletConfig中調用getInitParameter方法。

java.util.Enumration<java.lang.String> getInitParameterNames()

返回所有初始參數名稱的一個Enumeration。

String contactName = servletConfig.getInitParameter(“contactName”)

獲取contactName參數值

  ServletContext

接口

說明

ServletContext

每個Web應用程序只有一個上下文,所以ServletContext可以存儲這個上下文,並且ServletContext還可以共享從應用程序中的所有資料處訪問到的信息,並且可以動態註冊Web對象,而且是用ServletContext內部的Map保存。

  常用的方法:

 

方法

說明

getServletContext().getInitParameter(String name)

獲取在項目下的web.xml中設置context的初始化參數

this.getServletContext().log(“測試”)

在web.xml文件中,使用logger元素來設置日誌文件

getAttribute(String name)/get AttributeNames()

獲取ServletContext中的屬性

setAttribute(String name, Object object)

設置ServletContext中的屬性

removeAttribute(String name)

移除ServletContext中的屬性

  GenericServlet

接口

說明

GenericServlet

GenericServlet實現了Servlet和ServletConfig接口。將init方法中的ServletConfig賦給一個類級變量,以便可以通過getServletConfig獲取,為Servlet接口中的所有方法提供默認的實現,而且提供包括ServletConfig中的方法。

  Http Servlets

    

接口

說明

HttpServlet

HttpServlet類覆蓋了javax.servlet.GenericServlet類。使用HttpServlet時,還要借助分別代表Servlet請求和Servlet響應的HttpServletRequest和HttpServletResponse對象。而HttpServlet與GenericServlet的差別在於,HttpServlet覆蓋的是doGet或者doPost方法,而不是Service方法,而且使用的是HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。

HttpServletRequest

表示HTTP環境中的Servlet請求

HttpServletResponse

表示HTTP環境中的Servlet響應

  各個接口常用的方法如下:

  

接口

方法

說明

HttpServletRequest

java.lang.String getContextPath()

返回表示請求上下文的請求URI部分。

HttpServletRequest

Cookie[] getCookies()

返回一個Cookie對象的數組。

HttpServletRequest

java.lang.String getHeader(java.lang.String name)

返回指定HTTP標題的值。

HttpServletRequest

java.lang.String getMethod()

返回生成這個請求的HTTP方法名稱

HttpServletRequest

java.lang.String getQueryString()

返回請求URL中的查詢字符串。

HttpServletRequest

HttpSession getSession()

返回與這個請求相關的會話對象。如果沒有,將創建一個新的會話對象。

HttpServletRequest

HttpSession getSession(Boolean create)

返回與這個請求相關的繪畫對象,如果有,並且create參數為True,將創建一個新的會話對象。

HttpServletResponse

void addCookie(Cookie cookie)

給這個響應對象添加一個cookie。

HttpServletResponse

void addHeader(java.lang.String name, java.lang.String value)

給這個響應對象添加一個header。

HttpServletResponse

void sendRedirect(java.lang.String location)

發送一條響應碼,將瀏覽器跳轉到指定的位置。

-------------------------------------------------------------------------------------------------------------------------------------------------

  當用戶提交HTML表單時,在表單元素中輸入的值就會被當作請求參數發送到服務器。HTML輸入域(文本域、隱藏域或者密碼域)或者文本區的值,會被當作字符串發送到服務器。空的輸入域或者文本區會發送空的字符串。

  包含多個值的select元素發出一個字符串數組,可以通過ServletRequest.getParameterValues進行處理。

  核查過的復選框會發送字符串"on"到服務器,未經核查的復選框則不向服務器發送任何內容,ServletRequest.getParameter(fieldName)返回null。

  單選框將被選中按鈕的值發送到服務器。如果沒有選擇任何按鈕,將沒有任何內容被發送到服務器,並且ServletRequest.getParameter(fieldName)返會null。

  如果一個表單中包含多個輸入同名的元素,那麽所有值都會被提交,並且必須利用ServletRequest.getParameterValues來獲取它們。ServletRequest.getParameter將只返回最後一個值。

  

有關Servlet和JSP的梳理(一)