日期:2014-05-19  浏览次数:20822 次

『译』Java EE 6 Pocket.Guide—Servlets3.0(二)

  Servlet Filters(过滤器)

?

  Servlet Filter(过滤器)用于从Servlet取得和更新request(请求)、response(响应)的内容和头信息,要注意的是Filter不创建response或者像servlets那样响应request 。认证、日志、数据压缩、加密是使用过滤器一些典型用途。 过滤器包装了一个servlet并作用于动态或静态内容。
  过滤器可以与一个servlet或与一组servlets、或指定的URL的静态内容向关联。过滤器由注解@WebFilter所定义:

@WebFilter("/*")
public class LoggingFilter implements javax.servlet.Filter {
  public void doFilter(HttpServletRequest request,HttpServletResponse response) {
    //. . .
  }
}

?  代码表示,该Loggingfilter是适用于这个web程序所有的servlet和静态网页,这里@WebInitParam同样可用于指定初始化参数。一个过滤器和目标servlet总是在同一调用线程执行,多个过滤器可形成一个过滤器链。在部署描述符中一个过滤器由<filter>和<filtermapping>元素来定义:

<filter>
  <filter-name>LoggingFilter</filter-name>
  <filter-class>org.sample.LoggingFilter</filter-class>
</filter>
. . .
<filter-mapping>
  <filter-name>LoggingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

?  除了使用@WebFilter和web.xml来配置过滤器,也可以用ServletContext.addFilter()方法来编程化定义,在ServletContainerInitializer.onStartup()方法或者ServletContextListener.contextInitialized()方法执行时来起作用,addFilter()方法返回一个ServletRegistration,动态的用来添加匹配URL映射、设置初始化参数和其他配置项:

@HandlesTypes(value = { HttpServlet.class })
public class MyInitializer implements ServletContainerInitializer {
  public void onStartup(Set<Class<?>> clazz, ServletContext context) {
    FilterRegistration.Dynamic reg = context.addServlet("LoggingFilter","org.example.LoggingFilter");
    reg.addMappingForUrlPatterns(null, false, "/");
  }
}

  实现类需要添加一个HandlesTypes注解,这个注解有一个value值,这个值是一个Class数组,包含了你想要处理的类,容器会扫描出所有匹配这个数组里面的类型的类(包含实现,扩展或者被注解的类),然后将这种类型作为onStartup的第一个参数传入。

?

?  Event Listeners(事件监听

?

  事件监听器提供ServletContext、HttpSession、ServletRequest对象的生命周期回调事件,监听器类实现一个接口,支持这些对象的状态变化的事件通知,通过注解@WebListener、在web.xml中声明,或通过注册一个ServletContext.addListener()方法来申明,监听器是不需要程序员额外明确编程化注册,或在初始化和恢复一个数据库连接去编程化的声明的一个servlet。可能有多个监听器类同时监听每一个事件类型,容器调用监听器时他们可能按指定的顺序监听每一个事件类型,应用程序关闭时以相反的顺序通知监听器。

  ServletContextListener监听容器的事件信息:

?

@WebListener
public class MyContextListener implements ServletContextListener {
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    ServletContext context = sce.getServletContext();
    //. . .
  }
  @Override
  public void contextDestroyed(ServletContextEvent sce) {
  //. . .
  }
}

ServletContextAttributeListener监听上下文中属性的变化:

?

public class MyServletContextAttributeListener implements ServletContextAttributeListener {
  @Override
  public void attributeAdded(ServletContextAttributeEvent event) {
    //. . . event.getName();
    //. . . event.getValue();
  }
  @Override
  public void attributeRemoved(ServletContextAttributeEvent event) {
    //. . .
  }
  @Override
  public void attributeReplaced(ServletContextAttributeEvent event) {
    //. . .
  }
}

HttpSessionListener监听Session创建或销毁事件:

?

@WebListener
public class MySessionListener implements HttpSessionListener {
  @Override
  public void sessionCreated(HttpSessionEvent hse) {HttpSession session = hse.getSession();
  //. . .
  }
  @Override
  public void sessionDestroyed(HttpSessionEvent hse) {
  //. . .
  }
}

  HttpSessionActivationListener用于监听Session钝化或激活事件:

?

public class MyHttpSessionActivationListener implements HttpSessionActivationListener {
  @Override
  public void sessionWillPassivate(HttpSessionEvent hse) {
    // ... hse.getSession();
  }
  @Override
  public void sessionDidActivate(HttpSe