servlet的学习

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配置

[html]  view plain copy
  1. <!-- 编码过滤器 -->  
  2.     <filter>  
  3.         <filter-name>setCharacterEncoding</filter-name>  
  4.         <filter-class>com.company.strutstudy.web.servletstudy.filter.EncodingFilter</filter-class>  
  5.         <init-param>  
  6.             <param-name>encoding</param-name>  
  7.             <param-value>utf-8</param-value>  
  8.         </init-param>  
  9.     </filter>  
  10.     <filter-mapping>  
  11.         <filter-name>setCharacterEncoding</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  
  14.    
  15. <!-- 请求url日志记录过滤器 -->  
  16.     <filter>  
  17.         <filter-name>logfilter</filter-name>  
  18.         <filter-class>com.company.strutstudy.web.servletstudy.filter.LogFilter</filter-class>  
  19.     </filter>  
  20.     <filter-mapping>  
  21.         <filter-name>logfilter</filter-name>  
  22.         <url-pattern>/*</url-pattern>  
  23.     </filter-mapping>  

编码拦截器:

[java]  view plain copy
  1. public class EncodingFilter implements Filter {  
  2.     private String encoding;  
  3.     private Map<String, String> params = new HashMap<String, String>();  
  4.     // 项目结束时就已经进行销毁  
  5.     public void destroy() {  
  6.         System.out.println("end do the encoding filter!");  
  7.         params=null;  
  8.         encoding=null;  
  9.     }  
  10.     public void doFilter(ServletRequest req, ServletResponse resp,  
  11.             FilterChain chain) throws IOException, ServletException {  
  12.         //UtilTimerStack.push("EncodingFilter_doFilter:");  
  13.         System.out.println("before encoding " + encoding + " filter!");  
  14.         req.setCharacterEncoding(encoding);  
  15.         // resp.setCharacterEncoding(encoding);  
  16.         // resp.setContentType("text/html;charset="+encoding);  
  17.         chain.doFilter(req, resp);        
  18.         System.out.println("after encoding " + encoding + " filter!");  
  19.         System.err.println("----------------------------------------");  
  20.         //UtilTimerStack.pop("EncodingFilter_doFilter:");  
  21.     }  
  22.    
  23.     // 项目启动时就已经进行读取  
  24.     public void init(FilterConfig config) throws ServletException {  
  25.         System.out.println("begin do the encoding filter!");  
  26.         encoding = config.getInitParameter("encoding");  
  27.         for (Enumeration e = config.getInitParameterNames(); e  
  28.                 .hasMoreElements();) {  
  29.             String name = (String) e.nextElement();  
  30.             String value = config.getInitParameter(name);  
  31.             params.put(name, value);  
  32.         }  
  33.     }  
  34.  }  
日志拦截器:
[java]  view plain copy
  1. public class LogFilter implements Filter {  
  2.     FilterConfig config;  
  3.    
  4.     public void destroy() {  
  5.         this.config = null;  
  6.     }  
  7.    
  8.     public void doFilter(ServletRequest req, ServletResponse res,  
  9.             FilterChain chain) throws IOException, ServletException {  
  10.         // 获取ServletContext 对象,用于记录日志  
  11.         ServletContext context = this.config.getServletContext();  
  12.         //long before = System.currentTimeMillis();  
  13.         System.out.println("before the log filter!");  
  14.         //context.log("开始过滤");  
  15.         // 将请求转换成HttpServletRequest 请求  
  16.         HttpServletRequest hreq = (HttpServletRequest) req;  
  17.         // 记录日志  
  18.         System.out.println("Log Filter已经截获到用户的请求的地址:"+hreq.getServletPath() );  
  19.         //context.log("Filter已经截获到用户的请求的地址: " + hreq.getServletPath());  
  20.         try {  
  21.             // Filter 只是链式处理,请求依然转发到目的地址。  
  22.             chain.doFilter(req, res);  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         System.out.println("after the log filter!");  
  27.         //long after = System.currentTimeMillis();  
  28.         // 记录日志  
  29.         //context.log("过滤结束");  
  30.         // 再次记录日志  
  31.         //context.log(" 请求被定位到" + ((HttpServletRequest) req).getRequestURI()  
  32.         //      + "所花的时间为: " + (after - before));  
  33.     }  
  34.    
  35.     public void init(FilterConfig config) throws ServletException {  
  36.         System.out.println("begin do the log filter!");  
  37.         this.config = config;  
  38.     }  
  39.    
  40.  }  
HelloServlet类:
[java]  view plain copy
  1. public class HelloWorldServlet extends HttpServlet{  
  2.    
  3.     /** 
  4.      * 查看httpservlet实现的service一看便知,起到了一个controll控制器的作用(转向的) 
  5.      * 之后便是跳转至我们熟悉的doget,dopost等方法中  
  6.      */  
  7.     @Override  
  8.     protected void service(HttpServletRequest req, HttpServletResponse resp)  
  9.             throws ServletException, IOException {  
  10.         System.out.println("doservice..."+this.getInitParameter("encoding"));  
  11.           
  12.         super.service(req, resp);  
  13.     }  
  14.    
  15.     @Override  
  16.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  17.             throws ServletException, IOException {  
  18.         System.out.println("doget...");  
  19.         doPost(req, resp);  
  20.     }  
  21.    
  22.     @Override  
  23.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  24.             throws ServletException, IOException {  
  25.         System.out.println("dopost...");  
  26.     }  
  27.       
  28.       
  29.    
  30.  }  
结果:

[plain]  view plain copy
  1. before encoding utf-8 filter!  
  2.   before the log filter!  
  3.   Log Filter已经截获到用户的请求的地址:/hello  
  4.   doservice...UTF-8  
  5.   doget...  
  6.   dopost...  
  7.   after the log filter!  
  8.   after encoding utf-8 filter!  
  9.   ----------------------------------------  

总结:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值