Servlet接口上,与生命周期及请求服务相关的三个方法是init()、service()与destory()方法。当Web容器加载Servlet类并实例化之后,会生成ServletConfig对象并调用init()方法,将ServletConfig对象当作参数传入。ServletConfig相当于Servlet在web.xml中的设置代表对象,可以利用它来取得Servlet初始参数。
GenericServlet同时实现了Servlet及ServletConfig。主要的目的就是将初始Servlet调用init()方法所传入的ServletConfig封装起来。
当希望编写代码在Servlet初始化时运行,要重新定义无参数的init()方法,而不是有ServletConfig参数的init()方法或构造器。
ServletConfig上还定义了getServletContext()方法,这可以取得ServletContext实例,这个对象代表了整个web应用程序,可以从这个对象取得ServletContext初始参数,或者设置、取得、移除ServletContext属性。
每个Web应用程序都会有一个相对应的ServletContext,针对应用程序初始化时所需用到的一些参数资料,可以在web.xml中设置应用程序初始参数,设置时使用<context-param>标签来定义。每一对初始参数要使用一个<context-param>来定义。
在整个web应用程序生命周期,Servlet所需共享的资料可以设置为ServletContext属性。由于ServletContext在Web应用程序存活周期都会一直存在,所以设置为ServletContext属性的资料,除非主动移除,否则也是一直存活于Web应用程序中。
监听器顾名思义,就是可监听某些事件的发生,然后进行一些想做的事情。在Servlet/JSP中,如果想要在ServletRequest、HttpSession与ServletContext对象创建、销毁时收到通知,则可以实现以下相对应的监听器: ServletRequestListener HttpSessionListener ServletContextListener
Servlet/JSP中可能设置属性的对象有ServletRequest、HttpSession与ServletContext、如果想在这些对象被设置、移除、替换属性时收到通知,则可以实现以下相对应的监听器: ServletRequestAttributeListener HttpSessionAttributeListener ServletContextAttributeListener
Servlet/JSP中如果某个对象即将加入HttpSession中成为属性,而你想要该对象在加入HttpSession、从HttpSession移除、HttpSession对象在JVM间迁移时收到通知,则可以在将成为属性的对象上,实现以下相对应的监听器: HttpSessionBingingListener HttpSessionActivationListener
在Servlet/JSP中要实现过滤器,必须实现Filter接口,并在web.xml中定义过滤器,从容器知道加载哪个过滤类。Filter接口有三个要实现的方法,init()、doFilter()与destory(),三个方法的作用与Servlet接口的init()、service()、destory()类似。
Filter接口的init()方法的参数是FilterConfig,FilterConfig为过滤器定义的代表对象,可以通过FilterConfig的getInitParameter()方法来取得初始参数。
当请求来到过滤器时,会调用Filter接口的doFilter()方法,doFilter()上除了ServletRequest与ServletResponse之外,还有一个FilterChain参数。如果调用了FIlterChain的doFilter()方法,就会运行下一个过滤器,如果没有下一个过滤器了,就调用请求目标Servlet的service方法。如果因为某个条件(例如用户没有通过验证)而不调用FilterChain的doFilter(),则就不会继续至目标Servlet,这时就是所谓的拦截请求。
在实现Filter接口时,不用理会这个Filter前后是否有其它的Filter,完全作为一个独立的元件进行设计。
对于容器产生的HttpServletRequest对象,无法直接修改某些信息,如请求参数值。可以继承HttpServletRequestWrapper类(父类ServletRequestWrapper),并编写想要重新定义的方法。对于HttpServletResponse对象,则可以继承HttpServletResponseWrapper类(父类ServletResponseWrapper)来对HttpServletResponse对象进行封装。