一、Servlet 类javax.servlet.http.HttpServlet; 1.是单例模式,一个web容器中只有一个实例。服务器调用它的service方法进行请求处理, service方法又根据请求的类型分别调用doGet,doPost等方法。 2.由于是单例模式,所以线程不安全 3.自定义Servlet需继承HttpServlet,并重写相应的doGet等方法。方法体内不能调用父类的该方法。 web.xml注册: <servlet> <servlet-name>myservlet</servlet-name> <servlet-class>com.zk.baseservlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myservlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 二、Filter 接口javax.servlet.Filter; 1.过滤器首先执行init方法,从web.xml中的filter配置中读取信息进行初始化。只执行一次。 2.客户端的每次请求,都会经过doFilter方法。过滤器必须配置拦截路径。 3.多个过滤器执行流程
控制台输出: init2 method init3 method init method MyFilter1 before MyFilter2 before MyFilter3 before servlet doget method MyFilter3 after MyFilter2 after MyFilter1 after 是个U型流程
Filter1类源码
public class MyFilter1 implements Filter { public MyFilter1() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("MyFilter1 before"); chain.doFilter(request, response); System.out.println("MyFilter1 after"); } public void init(FilterConfig fConfig) throws ServletException { System.out.println("init method1"); } }
MyFilter2,
MyFilter3同上
web.xml注册,3个过滤器都拦截/a路径:
<filter-mapping> <filter-name>myfilter1</filter-name> <url-pattern>/a</url-pattern> </filter-mapping> <filter-mapping> <filter-name>myfilter2</filter-name> <url-pattern>/a</url-pattern> </filter-mapping> <filter-mapping> <filter-name>myfilter3</filter-name> <url-pattern>/a</url-pattern> </filter-mapping>
分析:init方法在容器启动时候,只执行一次。doFilter则每访问一次路径就执行一次。
三、Listener 接口ServletContextListener 监听器用于监听并接收被监听对象的变化 1.容器启动通知contextInitialized方法在filter和servlet前调用。 2.contextDestroyed方法在容器关闭后,filter和servlet销毁后调用。
不完善的地方欢迎大家补充