servlet是運行在Web服務器中的小型Java程序,通常通過HTTP接受和響應來自客戶端的請求。
servlet 通常運行在多線程服務器上,因此應該意識到 servlet 必須處理併發請求並小心地同步對共享資源的訪問。共享資源包括內存數據(比如實例或類變量)和外部對象(比如文件、數據庫連接和網絡連接)。
Servlet相關接口、類
Servlet工作流程
Servlet生命週期
Web服務器接收到HTTP請求後將請求委託給Servlet容器,然後
- 加載Servlet類 ,當Servlet容器接收到servlet的第一個請求時,類加載器將加載servlet類
- 創建Servlet實例 ,加載後會創建一個servlet實例
- 調用init() ,只初始化一次servlet,生命週期開始
- 調用service()
- 調用destory() ,將servlet從容器中移除
Servlet容器處理請求
- 將請求與web.xml文件中的servlet進行映射
- 爲請求創建請求和響應對象
- 調用線程上的service方法
- 公共service方法內部調用受保護的service方法
- 受保護的service方法根據請求的類型調用doGet方法
- doGet方法生成響應,並將其傳遞給客戶端
- 發送響應後,Web容器將刪除請求和響應對象。線程包含在線程池中或刪除取決於服務器實現。
war文件
web.xml
歡迎文件優先級:指定文件->index.html->
加載優先級:context-param -> listener -> filter -> servlet ,同類型按mapping順序進行調用。
加載過程如下:
- 啓動一個WEB項目的時候,WEB容器會去讀取它的配置文件web.xml,讀取和兩個結點。
- 緊急着,容創建一個ServletContext(servlet上下文),這個web項目的所有部分都將共享這個上下文。
- 容器將轉換爲鍵值對,並交給servletContext。
- 容器創建中的類實例,創建監聽器。
元素詳解:
向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(在調用資源的響應中包含另一個資源的響應內容)
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開發
- 編寫java類實現Filter接口,並實現其doFilter方法。
- 在 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):當會話無效時被調用。