Servlet、Filter和Listener

一、Servlet、Filter和Listener的功能

Servlet的功能:Servlet是一个运行在web服务器上的小应用程序,用于接收来自客户端的请求,进行处理及返回响应。(Servlet本身实际上已经可以完成Filter和Listener的功能,但是把这两个独立出来形成组件,实际上是实现了功能复用和可插拔式的架构

Filter的功能:Filter,即过滤器,是一种在Servlet获取请求前、应答后进行功能处理的技术。(装饰器模式

Listener的功能:Listener用于监听对象的变化而进行相应的功能处理。在本文中,Listener是Servlet的监听器,Servlet的操作事件和生命状态变化会触发相应的监听器。(观察者模式

二、Servlet、Filter和Listener的生命周期对比

(一)、这三个组件的生命周期皆是由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很相似。

这两篇文章写得不错《web.xml 中的listener、 filter、servlet 加载顺序及其详解》《Java中Filter、Servlet、Listener的学习》。

这里的主要就是注意一下他们都实现了什么样的方法。本文中的监听器只是对对象生命周期变化进行监控,另外还有的监听器是对对象操作的事件进行监控,如:HttpSessionAttributeListener。

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>

三、装饰器模式和观察者模式(以后有时间再补充)

posted @ 2015-10-03 16:58  Emil92  阅读(277)  评论(0编辑  收藏  举报