• servlet、filter、listener继承的基类和获得作用域的方式


    一、servlet:
     1、servlet属于j2ee的组件,构建servlet的web project不需要导入项目框架jar包
     2、servlet的体系结构:
      在j2ee API中,提供给servlet的支持接口和基类都位于javax.servlet.*和javax.servlet.http.*(提供所有与http请求有关的API)两个包中
      servlet包中常使用的接口
       Interface ServletConfig
       Interface ServletContext
       Interface ServletRequest
       Interface ServletResponse
       Interface Servlet:此接口中提供的方法有init,getServletConfig,getServletInfo,destroy,service
          jqavax.servlet.Genericservlet(实现了servlet接口,实现了基本servlet功能,提供有service()方法)
          javax.servlet.http.HttpServlet(继承了Genericservlet类,可以处理http请求,提供的doGet()+doPost()和service()方法作用相同

     3、实现servlet控制器的功能类需要继承HttpServlet类,并重写HttpServlet类中的方法
      public class TestServlet extends HttpServlet{
       public void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
        String username=req.getParameter("username");//可以随意调用Request和Response方法
        String name="admin";
        String password="admin";
        System.out.println(name+" "+password);
       }
       public void doGet(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
        this.doPost(req, resp);
        System.out.println("这是get提交方式");
       }
       通过上面的这种重写方式,可以避免因处理doGet或者doPost不同的提交方式而导致代码重复的问题
       或者采用重写service()方法,实际上,重写doGet()和doPost()方法,也是程序自动调用service()方法进行解析get或者post的提交方式:
       public void service(HttpServletRequest req,HttpServletResponse resp)throws ServletException,IOException{
        String username=req.getParameter("username");//可以随意调用Request和Response方法
        String name="admin";
        String password="admin";
        System.out.println(name+" "+password);  
       }

       servlet的生命周期:通过重写下面的两个方法(过滤器中的)可以了解servlet的生命周期:
       public void init(ServletConfig config)throws ServletException{
        //第一条请求到来时加载,可以将当前servlet的初始化配置以ServletConfig config类型传出来
        System.out.println("servlet初始化");
       }
       public void destroy(){------------------------------------->>//服务器停止时加载,是最后调用的方法
        System.out.println("servlet的销毁方法");
       }
     4、servlet中获得请求对象:
      application----ServletContext    ServletContext application=config.getServletContext();这是通过config获得的,也可以通过session获得
      session----HttpSession           HttpSession session=request.getSession();通过session获得
      request---HttpServletRequest,继承ServletRequest------------>>servlet,filter  listener等的所有请求都是这个类型的
      response---HttpServletResponse,继承ServletResponse---------->>servlet,filter  listener等的所有响应都是这个类型的
      config---ServletConfig ------------------>>获得初始化参数值          
      out----PrintWriter:PrintWriter out = response.getWriter();
      exception----Exception
      pageContext----javax.servlet.jsp.PageContext
      page----javax.servlet.jsp.JspPage
     5、servlet在web.xml中的配置:
      <!-- 配置servlet --> 
      <servlet>
       <servlet-name>LoginServlet</servlet-name>--------->>为此servlet定义的名称
       <servlet-class>net.cstp.servlet.LoginServlet</servlet-class>-------->>让容器tomcat加载相应的servlet类
       <1-- 可以设置初始化参数,在servlet初始化方法中通过ServletConfig config对象获得该初始化参数 -->
       <init-param>
        <param-name>name</param-name>
        <param-value>admin</param-value>
       </init-param>
       <init-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
       </init-param>
      </servlet>
      <servlet-mapping>
       <servlet-name>LoginServlet</servlet-name>---------->>为了找到匹配加载类(servlet控制器),与servlet节点中的name相同
       <url-pattern>/login</url-pattern>------------------>>servlet入口,与地址栏的url或者表单中action的url相对应,以/开头
      </servlet-mapping>
             
      <!-- 配置session的生命周期:单位分钟 -->
      <session-config>
       <session-timeout>20</session-timeout>
      </session-config>

    二、filter:过滤器,j2ee组件
     1、filter的体系结构:位于javax.servlet.*包中
      FilterConfig:提供获得application对象的方法getServletContext() 以及初始化请求参数的方法getInitParameter(String name)
      FilterChain:提供向下传递请求的方法doFilter(ServletRequest request, ServletResponse response) 
      Filter:提供三个方法,filter初始化init()、销毁destroy() 、处理请求doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     2、实现filter接口功能的方式:实现Filter接口,并重写Filter接口的三个方法
      public class Myfilter implements Filter {
       public void init(FilterConfig fConfig) throws ServletException {
        System.out.println("过滤器初始化成功");
       }
       public void destroy() {
        System.out.println("过滤器销毁的方法");
       }
       public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        //获得能处理http请求的请求request和响应response对象
        HttpServletRequest request=(HttpServletRequest)req;
        HttpServletResponse response=(HttpServletResponse)resp;

        String username=(String)request.getSession().getAttribute("username");
        if(username!=null){
         //调用FilterChain接口声明的变量chain作用:1.让请求沿着过滤器向下传递;2.起分割的作用:上处理请求,下处理响应
         System.out.println("处理的相关请求");
         chain.doFilter(request, response);
         System.out.println("处理的相关响应");
        }else{
         response.sendRedirect("../index.jsp");
        } 
       }

      }
     3、filter在web.xml中的配置:
      <!-- 全部过滤 -->
       <filter>
       <filter-name>YourFilter</filter-name>
       <filter-class>net.cstp.filter.YourFilter</filter-class> 
      </filter>
      <filter-mapping>
       <filter-name>YourFilter</filter-name>
       <url-pattern>/*</url-pattern> 
      </filter-mapping>
      <!-- 选择性过滤 -->
      <filter-mapping>
       <filter-name>YourFilter</filter-name>
       <url-pattern>/update</url-pattern> 
      </filter-mapping>

    三、Listener:监听器,j2ee组件
     1、Listener的体系结构,位于javax.servlet.*和javax.servlet.http.*:针对不同的作用域对象,提供相对应的实现接口,并且依据作用不同,区分不同功能的实现接口
      request对象:
       Interface ServletRequestListener:提供创建和销毁的方法
       Interface ServletRequestAttributeListener:对作用域中属性值添加、删除、替换的监测
      session对象:
       Interface HttpSessionListener,可以用于统计网站当前的在线人数
       Interface HttpSessionAttributeListener:绑定值 解除绑定
       Interface HttpSessionBindingListener
      application对象:
       Interface ServletContextListener:监听tomcat的启动或者或者销毁,也可以说当web项目被加载或者被销毁的时候,可以用于统计网站历史访问量
       Interface ServletContextAttributeListener
     2、自定义监听器:
      1)、实现ServletRequestListener接口:
       public class ValidateRequestListener implements ServletRequestListener {
           public void requestDestroyed(ServletRequestEvent event) {  
        System.out.println("监听器已经销毁");
           }
           public void requestInitialized(ServletRequestEvent  event) {
        System.out.println("监听器已经启动");
        ServletRequest req=event.getServletRequest();
        HttpServletRequest request=(HttpServletRequest)req;
        ....
           }
       }
      2)、实现ServletRequestAttributeListener接口:
       public class ValidateServletArributeRequest implements ServletRequestAttributeListener {
       //当把值添加到作用域中时,能够监测得到
       public void attributeAdded(ServletRequestAttributeEvent arg0) {
        System.out.println("向request作用域添加一个属性名"+arg0.getName()+"的值为:"+arg0.getValue()); 
       }
       //当把值从作用域中删除时,能够监测得到
       public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("把值从作用域中删除了"+arg0.getName()+"的值为:"+arg0.getValue()); 
       }
       //当把作用域中的值替换时,能过监测得到
       public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("获得被替换值为:"+arg0.getName()+"的值为:"+arg0.getValue());
        
        ServletRequest req=arg0.getServletRequest();
        HttpServletRequest request=(HttpServletRequest)req;
        String name=(String)request.getAttribute("name");
        System.out.println("获得替换后的值为:"+name); 
       }
      }
     3、listener在web.xml中的配置:用到哪个,添加哪个
      <listener>
       <listener-class>net.cstp.listener.ValidateRequestListener</listener-class>
      </listener>

      <listener>
       <listener-class>net.cstp.listener.ValidateSessionListener</listener-class>
      </listener>
      <!-- 
      <listener>
       <listener-class>net.cstp.listener.ValidateApplicationListener</listener-class>
      </listener>
    四、servlet、filter、listener的配置顺序与加载顺序:
     加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加 载 filter。但是配置顺序尽量与加载顺序一致,也方便管理
     web.xml 的加载顺序是:context- param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据 对应的 mapping 的顺序进行调用的。

  • 相关阅读:
    C++中rand()函数的用法
    oracle用户操作
    oracle日期操作
    PLS-00157: AUTHID only allowed on schema-level programs解决办法 包体的过程使用调用者权限方法
    oracle表空间中PCTFREE, PCTUSED, INITRANS, MAXTRANX参数的解释
    证券从业人员考试
    Oracle连接远程数据库的四种设置方法
    [中英對照] Steve Jobs 對美國史丹福大學畢業生演講全文
    myeclipse之完全破解
    JDK配置之坑
  • 原文地址:https://www.cnblogs.com/tian830937/p/5181357.html
Copyright © 2020-2023  润新知