1、Servlet、Filter和Listener的功能html
Servlet的功能:Servlet是一個運行在web服務器上的小應用程序,用於接收來自客戶端的請求,進行處理及返回響應。(Servlet自己實際上已經能夠完成Filter和Listener的功能,可是把這兩個獨立出來造成組件,其實是實現了功能複用和可插拔式的架構)java
Filter的功能:Filter,即過濾器,是一種在Servlet獲取請求前、應答後進行功能處理的技術。(裝飾器模式)web
Listener的功能:Listener用於監聽對象的變化而進行相應的功能處理。在本文中,Listener是Servlet的監聽器,Servlet的操做事件和生命狀態變化會觸發相應的監聽器。(觀察者模式)服務器
2、Servlet、Filter和Listener的生命週期對比session
(一)、這三個組件的生命週期皆是由web容器控制架構
階段 | Servlet | Filter | Listener |
初始化 | void init(ServletConfig config) | void init(FilterConfig) | |
處理 | void service(ServletRequest req, ServletResponse res) | void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | |
銷燬 | void destroy() | void destroy() |
(二)、相應類和配置的寫法,能夠發現Servlet和Filter很類似。app
這兩篇文章寫得不錯《web.xml 中的listener、 filter、servlet 加載順序及其詳解》《Java中Filter、Servlet、Listener的學習》。eclipse
這裏的主要就是注意一下他們都實現了什麼樣的方法。本文中的監聽器只是對對象生命週期變化進行監控,另外還有的監聽器是對對象操做的事件進行監控,如:HttpSessionAttributeListener。ide
package com.kwan.web.three; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; public class DemoServlet extends HttpServlet { @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub super.service(arg0, arg1); } @Override public void destroy() { // TODO Auto-generated method stub super.destroy(); } @Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); } @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub super.init(config); } } package com.kwan.web.three; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class DemoFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } package com.kwan.web.three; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; //listen the lifecycle of object HttpSession, ServletContext, ServletRequest public class DemoListener implements HttpSessionListener, ServletContextListener, ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent arg0) { // TODO Auto-generated method stub } @Override public void requestInitialized(ServletRequestEvent arg0) { // TODO Auto-generated method stub } @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub } @Override public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub } @Override public void sessionDestroyed(HttpSessionEvent arg0) { // TODO Auto-generated method stub } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true"> <servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>com.kwan.web.three.DemoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/servlet</url-pattern> </servlet-mapping> <filter> <filter-name>FilterDemo</filter-name> <filter-class>com.kwan.web.three.DemoFilter</filter-class> </filter> <filter-mapping> <filter-name>FilterDemo</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>com.kwan.web.three.DemoListener</listener-class> </listener> </web-app>
3、裝飾器模式和觀察者模式(之後有時間再補充)學習