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

时间:2021-09-03 16:37:10

一、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+"\t"+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+"\t"+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 的顺序进行调用的。

servlet、filter、listener继承的基类和获得作用域的方式的更多相关文章

  1. ServletContextInitializer添加 servlet filter listener

    ServletContextInitializer添加 servlet filter listener https://www.cnblogs.com/pomer-huang/p/9639322.ht ...

  2. SpringBoot学习笔记&lpar;6&rpar;----SpringBoot中使用Servlet&comma;Filter&comma;Listener的三种方式

    在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...

  3. JavaWeb三大组件&lpar;Servlet&comma;Filter&comma;Listener 自己整理&comma;初学者可以借鉴一下&rpar;

    JavaWeb三大组件(Servlet,Filter,Listener 自己整理,初学者可以借鉴一下) Reference

  4. C&sol;C&plus;&plus; 多继承&lbrace;虚基类&comma;虚继承&comma;构造顺序,析构顺序&rcub;

    C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...

  5. SpringBoot---注册Servlet&comma;Filter&comma;Listener

    1.概述 1.1.当使用  内嵌的Servlet容器(Tomcat.Jetty等)时,将Servlet,Filter,Listener  注册到Servlet容器的方法: 1.1.1.直接注册Bean ...

  6. servlet filter listener interceptor 知识点

    这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下:   概念 生命周期 使命 servlet ...

  7. C&plus;&plus; &vert; 继承(基类,父类,超类),(派生类,子类)

    转载:https://blog.csdn.net/Sherlock_Homles/article/details/82927515 文章参考:https://blog.csdn.net/war1111 ...

  8. C&plus;&plus;&sol;&sol;菱形继承 &sol;&sol;俩个派生类继承同一个基类 &sol;&sol;又有某个类同时继承俩个派生类 &sol;&sol;成为 菱形继承 或者 钻石 继承&sol;&sol;&plus;解决

    1 //菱形继承 2 //俩个派生类继承同一个基类 3 //又有某个类同时继承俩个派生类 4 //成为 菱形继承 或者 钻石 继承 5 6 #include <iostream> 7 #i ...

  9. servlet&sol;filter&sol;listener&sol;interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

随机推荐

  1. Denormalization 2

    In a relational database, denormalization is an approach to speeding up read performance (data retri ...

  2. C&num; WinForm修改配置文件

    AppConfigPath 配置文件路径 ,注意 是exe运行的相对路径 private static string AppConfigPath = "WinListen.exe.confi ...

  3. Leetcode-462 Minimum Moves to Equal Array Elements II

    #462.   Minimum Moves to Equal Array Elements II Given a non-empty integer array, find the minimum n ...

  4. Visitor

    #include <iostream> #include <vector> using namespace std; #define DESTROY_POINTER(ptr) ...

  5. java&lowbar;web用户的自动登录模块的实现

    javaBean的代码 package bean; import java.io.Serializable; public class Admin implements Serializable{ / ...

  6. 【转】与BT下载相关的概念

    1. DHT DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法.在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整 ...

  7. 基于visual Studio2013解决面试题之1305字符串所有子集

     题目

  8. quartz定时格式配置以及JS验证

    一个Cron-表达式是一个由六至七个字段组成由空格分隔的字符串,其中6个字段是必须的而一个是可选的,如下: ---------------------------------------------- ...

  9. 主席树——求区间第k个不同的数字(向右密集hdu5919)

    和向左密集比起来向右密集只需要进行小小的额修改,就是更新的时候从右往左更新.. 自己写的被卡死时间.不知道怎么回事,和网上博客的没啥区别.. /* 给定一个n个数的序列a 每次询问区间[l,r],求出 ...

  10. MIT Molecular Biology 笔记2 DNA的突变和修复

    视频  https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...