Servlet的使用和原理分析


servlet是運行在Web服務器中的小型Java程序,通常通過HTTP接受和響應來自客戶端的請求。
servlet 通常運行在多線程服務器上,因此應該意識到 servlet 必須處理併發請求並小心地同步對共享資源的訪問。共享資源包括內存數據(比如實例或類變量)和外部對象(比如文件、數據庫連接和網絡連接)。

Servlet相關接口、類

Servlet工作流程

Servlet生命週期
Web服務器接收到HTTP請求後將請求委託給Servlet容器,然後

  1. 加載Servlet類 ,當Servlet容器接收到servlet的第一個請求時,類加載器將加載servlet類
  2. 創建Servlet實例 ,加載後會創建一個servlet實例
  3. 調用init() ,只初始化一次servlet,生命週期開始
  4. 調用service()
  5. 調用destory() ,將servlet從容器中移除

Servlet容器處理請求

  1. 將請求與web.xml文件中的servlet進行映射
  2. 爲請求創建請求和響應對象
  3. 調用線程上的service方法
  4. 公共service方法內部調用受保護的service方法
  5. 受保護的service方法根據請求的類型調用doGet方法
  6. doGet方法生成響應,並將其傳遞給客戶端
  7. 發送響應後,Web容器將刪除請求和響應對象。線程包含在線程池中或刪除取決於服務器實現。

war文件

web.xml

歡迎文件優先級:指定文件->index.html->
加載優先級:context-param -> listener -> filter -> servlet ,同類型按mapping順序進行調用。
加載過程如下

  1. 啓動一個WEB項目的時候,WEB容器會去讀取它的配置文件web.xml,讀取和兩個結點。
  2. 緊急着,容創建一個ServletContext(servlet上下文),這個web項目的所有部分都將共享這個上下文。
  3. 容器將轉換爲鍵值對,並交給servletContext。
  4. 容器創建中的類實例,創建監聽器。

元素詳解:
向ServletContext提供鍵值對(上下文信息),getServletContext().getInitParameter(“context/param”)可得到。
監聽客戶端請求、服務端操作,可自動激發一些操作。常用監聽接口、類有。
將一個名字與一個實現javaxs.servlet.Filter接口的類相關聯。
是的子元素,代表servlet。
是的子元素,表示servlet的名稱。
是的子元素,表示servlet的類。
是的子元素。它用於映射servlet。
是的子元素。客戶端使用此模式來調用servlet。
1可傳遞正值負值,servlet將在項目部署或服務器啓動時加載。
其他元素
其他
Listener

Servlet協作

	RequestDispatcher接口接收來自客戶端的請求並將它們發送到服務器上的任何資源(比如 servlet、HTML 文件或 JSP 文件)的對象。

	獲取RequestDispatcher對象:調用ServletRequest接口的getRequestDispatcher()方法返回RequestDispatcher的對象,它充當位於給定路徑上的資源的包裝器。可以使用 RequestDispatcher 對象將請求轉發到資源,或者在響應中包含資源。

使用:
1)forward(請求轉發,由第二個資源給客戶端響應)
2)include(在調用資源的響應中包含另一個資源的響應內容)

serialVersionUID

Servlet重定向

HttpServletResponse接口的sendRedirect()方法可以用於將響應重定向到另一個資源,資源可能是servlet,jsp或html文件。與forward()不同的是方法在客戶端工作。response.sendRedirect("http://www.yiibai.com");

屬性配置

ServletConfig 從web.xml文件獲取配置信息傳遞給servlet,提供了初始化參數
獲取:調用Servlet接口的getServletConfig()

<servlet>
    ......
    <init-param>  
      <param-name>parameter_name</param-name>
      <param-value>parameter_value</param-value>
    </init-param>

ServletContext配置信息
ServletContext對象由Web容器在部署一個項目時創建一個ServletContext對象,可用於從web.xml文件獲取配置信息。
如果有信息要共享給多個servlet使用,最好在web.xml文件中使用元素提供它。

ServletContext的優點如果有任何信息要共享給所有的servlet使用,並且要讓它容易維護,最好的辦法就是在web.xml文件中提供這些信息,所以如果信息要更改直接在web.xml中修改,而不需要修改servlet代碼。

ServletContext接口的使用

  • ServletContext對象提供容器和servlet之間的接口。
  • 使用ServletContext對象在web.xml文件獲取配置信息。
  • ServletContext對象可用於設置,獲取或刪除web.xml文件中屬性。
  • ServletContext對象可用於提供應用程序間通信。

獲取對象:

  • 通過ServletConfig接口的getServletContext()方法返回ServletContext對象
  • 通過GenericServlet類的getServletContext()方法返回ServletContext對象
<web-app>  
 ......  
  <context-param>  
    <param-name>parameter_name</param-name>  
    <param-value>parameter_value</param-value>  
  </context-param>
 ...... 

屬性設置
Servlet中有以下4種屬性方法,它們具體如下:
public void setAttribute(String name,Object object)
在應用程序範圍內設置給定的對象。

public Object getAttribute(String name)
返回指定名稱的屬性。

public Enumeration getInitParameterNames()
返回上下文的初始化參數的名稱,轉爲String對象的枚舉。

public void removeAttribute(String name)
從servlet上下文中刪除具有給定名稱的屬性。

過濾器

過濾器在web.xml中被定義,在預加載或後加載時被調用對web資源進行攔截從而實現轉換、日誌記錄、壓縮、加解密、輸入驗證等過濾任務。

Filter

Filter開發

  1. 編寫java類實現Filter接口,並實現其doFilter方法。
  2. 在 web.xml 文件中使用和元素對編寫的filter類進行註冊,並設置它所能攔截的資源。

過濾器API
Filter接口提供了生命週期方法(init、doFilter、destory)。
FilterChain接口負責調用鏈中下一個過濾器或資源(doFilter)。
FilterConfig對象由Web容器創建,可用於獲取web.xml文件中的配置信息(init、getInitParameter、getInitParameterNames、getServletContext)。
過濾器配置
用於爲過濾器指定一個名字,該元素的內容不能爲空。
元素用於指定過濾器的完整的限定類名。
元素用於爲過濾器指定初始化參數,它的子元素指定參數的名字,指定參數的值。
在過濾器中,可以使用FilterConfig接口對象來訪問初始化參數。
元素用於設置一個 Filter 所負責攔截的資源。一個Filter攔截的資源可通過兩種方式來指定:Servlet 名稱和資源訪問的請求路徑
子元素用於設置filter的註冊名稱。該值必須是在元素中聲明過的過濾器的名字
設置 filter 所攔截的請求路徑(過濾器關聯的URL樣式)
指定過濾器所攔截的Servlet名稱。

會話跟蹤

HTTP協議是無狀態的,需要一種方式來維護用戶狀態,即會話跟蹤。
常用技術:Cookies 隱藏表格域 網址重寫 HttpSession
Cookies
Cookie是由Server產生在客戶端維護用於唯一地標識客戶端的一段信息,具有名稱,單個值和一些屬性如註釋路徑域限定符版本號等。
類型

  • 非持久性cookie,適用於單個對話,關閉瀏覽器即刪除
  • 持久性Cookie,適用於多個對話,在用戶註銷時才被刪除

javax.servlet.http.Cookie提供了Cookie功能,有以下方法
構造:

  • Cookie()
  • Cookie(String name,String value) 構造具有指定名稱和值的cookie
    常用方法:setMaxAge() getValue() getName() setName() setValue()

使用

  • servlet 通過使用 HttpServletResponse#addCookie 方法將 cookie 發送到瀏覽器,該方法將字段添加到 HTTP 響應頭,以便一次一個地將 cookie 發送到瀏覽器。
  • 瀏覽器通過向 HTTP 請求頭添加字段將 cookie 返回給 servlet。可使用 HttpServletRequest#getCookies 方法從請求中獲取 cookie

隱藏表格字段
在隱藏表單字段的情況下,一般使用隱藏(不可見)文本字段來維護用戶的狀態。在服務器維護,每個頁面需要額外提交表單字段。

URL重寫
在URL重寫中,我們將令牌或標識符附加到下一個Servlet或下一個資源的URL。
當用戶單擊超鏈接時,參數名稱/值對將被傳遞到服務器。 從Servlet中可以使用getParameter()方法獲取指定參數的值。
在鏈接上工作,只限於文本,不需要額外提交表單。

HttpSession

HttpSession對象在容器中爲每個用戶創建會話ID。容器使用此標識來識別特定的用戶。
HttpSession的一個對象可用於執行兩個任務:

  • 綁定對象
  • 查看和操作有關會話的信息,如會話標識符,創建時間和上次訪問時間。

HttpServletRequest接口提供了兩種獲取HttpSession對象的方法:

  • public HttpSession getSession():返回與此請求相關聯的當前會話,或者如果請求沒有會話,則創建一個會話。
  • public HttpSession getSession(boolean create):返回與此請求相關聯的當前HttpSession,如果沒有當前會話,並且create的值爲true,則返回一個新會話。

HttpSession接口的常用方法

  • public String getId() :返回一個包含唯一標識符值的字符串。
  • public long getCreationTime() :返回創建此會話的時間,GMT毫秒。
  • public long getLastAccessedTime() : 返回客戶端發送與此會話相關聯的請求的最後一次,GMT。
  • public void invalidate() : 使此會話無效,然後取消綁定綁定到該對象的任何對象。
  • public void setAttribute(String name, Object value):使用指定名稱將對象綁定到此會話
  • public Object getAttribute(String name):返回與此會話中的指定名稱綁定在一起的對象

事件和監聽器

更改對象的狀態稱爲事件。事件發生時可以執行一些操作:計數總數和當前登錄的用戶數,在部署項目時創建數據庫的表,創建數據庫連接對象等。
事件類

  • ServletRequestEvent
  • ServletContextEvent
  • ServletRequestAttributeEvent
  • ServletContextAttributeEvent
  • HttpSessionEvent
  • HttpSessionBindingEvent

事件接口

  • ServletRequestListener
  • ServletRequestAttributeListener
  • ServletContextListener
  • ServletContextAttributeListener
  • HttpSessionListener
  • HttpSessionAttributeListener
  • HttpSessionBindingListener
  • HttpSessionActivationListener

servlet初始化時ServletConfig作爲配置對象由容器提供給servlet,ServletContext對象包含在ServletConfig對象中實現servlet與容器的通信,容器在ServletContext對象之後創建ServletContextEvent的對象用於通知有關 Web 應用程序的 servlet 上下文更改的信息。

ServletContextEvent和ServletContextListener
Web應用部署時會通知ServletContextEvent事件,如果在部署時創建數據庫連接、創建項目所有表需要給ServletContextListener接口提供方法實現。

  • 事件構造方法:ServletContextEvent(ServletContext e)
  • 事件中返回更改的ServletContext實例:public ServletContext getServletContext()
  • 實現的接口方法應用部署時被調用:public void contextInitialized(ServletContextEvent e)
  • 實現的接口方法取消部署時被調用: public void contextDestroyed(ServletContextEvent e)
    HttpServletEvent和HttpSessionListener
    HttpServletEvent是表示Web程序內會話更改的類,相應的監聽器接口是HttpServletListener。可以在這個事件上計數統計當前登錄的用戶,記錄登錄時間,註銷時間等用戶詳細信息。
    HttpServletEvent給出了以下方法:
  • public HttpSessionEvent(HttpSession source):構造來自給定源的會話事件。
  • public HttpSession getSession():返回更改的會話。
    HttpSessionListener接口中聲明瞭兩種需給出實現的方法:
  • public void sessionCreated(HttpSessionEvent e):在創建會話對象時被調用。
  • public void sessionDestroyed(ServletContextEvent e):當會話無效時被調用。

官方文檔

許令波寫的原理分析

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