一、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很相似。
这两篇文章写得不错《》《》。
这里的主要就是注意一下他们都实现了什么样的方法。本文中的监听器只是对对象生命周期变化进行监控,另外还有的监听器是对对象操作的事件进行监控,如: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, ServletRequestpublic 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 }}
ServletDemo com.kwan.web.three.DemoServlet ServletDemo /servlet FilterDemo com.kwan.web.three.DemoFilter FilterDemo /* com.kwan.web.three.DemoListener
三、装饰器模式和观察者模式(以后有时间再补充)