标签:
一、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>
三、装饰器模式和监听器模式(以后有时间再补充)
标签:
原文地址:http://www.cnblogs.com/cheuk-kwan/p/4853583.html