1.在web.xml文件中配置servlet,先启动servlet容器,启动servlet容器后并不是立即初始化servlet,而是等接收到客户端的请求之后再进行初始化,这样可以缩短servlet的容器的启动时间。
2.如果在web.xml文件中的servlet中配置了<load-on-stabtup>属性,不管客户端有没有请求都会初始化该servlet。
servlet功能:
init()在servlet的生命周期中,仅执行一次。
httpservlet类能够根据客户端发出的http请求,生成相应的http响应结果。
servletcontext定义了一系列方法用于与相应的servlet容器通信。如获得文件的MIME类型、分派请求,或者向日志写日志等。servletcontext对象包含在servletConfig对象之中,servletConfig对象在servlet初始化时提供servlet对象。
servlet过滤器
servlet过滤器能够在servlet在调用之前检查request对象,修改request header 和request内容;在servlet被调用之后检查response对象,修改response header 和response内容。所有的servlet都必须实现javax.servlet.filter接口。
(1)servlet过滤器可以检查和修改servletrequest和servletResponse对象
(2)servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器。
(3)servlet过滤器可以串联在一起,形成管道效应,协同修改请求和响应对象。
例子:
web.xml配置
- <!-- 编码过滤器 -->
- <filter>
- <filter-name>setCharacterEncoding</filter-name>
- <filter-class>com.company.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>setCharacterEncoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 请求url日志记录过滤器 -->
- <filter>
- <filter-name>logfilter</filter-name>
- <filter-class>com.company.strutstudy.web.servletstudy.filter.LogFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>logfilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
编码拦截器:
- public class EncodingFilter implements Filter {
- private String encoding;
- private Map<String, String> params = new HashMap<String, String>();
- // 项目结束时就已经进行销毁
- public void destroy() {
- System.out.println("end do the encoding filter!");
- params=null;
- encoding=null;
- }
- public void doFilter(ServletRequest req, ServletResponse resp,
- FilterChain chain) throws IOException, ServletException {
- //UtilTimerStack.push("EncodingFilter_doFilter:");
- System.out.println("before encoding " + encoding + " filter!");
- req.setCharacterEncoding(encoding);
- // resp.setCharacterEncoding(encoding);
- // resp.setContentType("text/html;charset="+encoding);
- chain.doFilter(req, resp);
- System.out.println("after encoding " + encoding + " filter!");
- System.err.println("----------------------------------------");
- //UtilTimerStack.pop("EncodingFilter_doFilter:");
- }
- // 项目启动时就已经进行读取
- public void init(FilterConfig config) throws ServletException {
- System.out.println("begin do the encoding filter!");
- encoding = config.getInitParameter("encoding");
- for (Enumeration e = config.getInitParameterNames(); e
- .hasMoreElements();) {
- String name = (String) e.nextElement();
- String value = config.getInitParameter(name);
- params.put(name, value);
- }
- }
- }
- public class LogFilter implements Filter {
- FilterConfig config;
- public void destroy() {
- this.config = null;
- }
- public void doFilter(ServletRequest req, ServletResponse res,
- FilterChain chain) throws IOException, ServletException {
- // 获取ServletContext 对象,用于记录日志
- ServletContext context = this.config.getServletContext();
- //long before = System.currentTimeMillis();
- System.out.println("before the log filter!");
- //context.log("开始过滤");
- // 将请求转换成HttpServletRequest 请求
- HttpServletRequest hreq = (HttpServletRequest) req;
- // 记录日志
- System.out.println("Log Filter已经截获到用户的请求的地址:"+hreq.getServletPath() );
- //context.log("Filter已经截获到用户的请求的地址: " + hreq.getServletPath());
- try {
- // Filter 只是链式处理,请求依然转发到目的地址。
- chain.doFilter(req, res);
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("after the log filter!");
- //long after = System.currentTimeMillis();
- // 记录日志
- //context.log("过滤结束");
- // 再次记录日志
- //context.log(" 请求被定位到" + ((HttpServletRequest) req).getRequestURI()
- // + "所花的时间为: " + (after - before));
- }
- public void init(FilterConfig config) throws ServletException {
- System.out.println("begin do the log filter!");
- this.config = config;
- }
- }
- public class HelloWorldServlet extends HttpServlet{
- /**
- * 查看httpservlet实现的service一看便知,起到了一个controll控制器的作用(转向的)
- * 之后便是跳转至我们熟悉的doget,dopost等方法中
- */
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("doservice..."+this.getInitParameter("encoding"));
- super.service(req, resp);
- }
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("doget...");
- doPost(req, resp);
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("dopost...");
- }
- }
- before encoding utf-8 filter!
- before the log filter!
- Log Filter已经截获到用户的请求的地址:/hello
- doservice...UTF-8
- doget...
- dopost...
- after the log filter!
- after encoding utf-8 filter!
- ----------------------------------------
总结:
1.过滤器执行流程
2.常用过滤器
servlet监听器:
1.对servlet上下文进行监听。
servletcontextattributelistener:监听对servletconxt属性的操作,如增加、删除和修改操作。
servletcontextlistener:监听servletcontext,当创建servletcontext时候,激发contextinitlized方法;当销毁servletcontext时候,激发contextdestory方法。
2.监听http会话
httpsessionlistener:监听httpsession的操作。
httpsessionactivationListener:监听http会话active、passivate情况。
httpsessionattributelistener:监听httpsession中属性的操作。
3.对客户端进行监听
servletrequestlistener接口和servletrequestAttributelistener接口。
二、监听器的基本使用
创建步骤:
1、创建一个实现监听器接口的类
2、配置web.xml文件,注册监听器
<listener> <listener-class>完整类名</listener-class> </listener>
监听器的启动顺序:按照web.xml的配置顺序来启动
加载顺序:监听器>过滤器>Servlet