java的三大组件指Servlet、Filter、Listener。八大监听器指八个接口。前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置,

Listener监听那些事件。

  java web的cookie和session机制有篇博客讲的很好,有兴趣的博友可以去看看。地址:https://www.cnblogs.com/whgk/p/6422391.html


一:Filter

  1.基本概念

    Filter称之为过滤器,是用来做一些拦截的任务, 在Servlet接受请求之前,做一些事情,如果不满足限定,可以拒绝进入Servlet。

    

    一个web项目中可以配置多个filter过滤器,浏览器访问静态资源如html、jsp、css或者访问动态资源servlet都会经过filter过滤器,满足条件,过滤器放行,否则直接返回。

  2.使用

    filter有很多用处,网上一搜,在filter层,来获取用户的身份,可以考虑在filter层做一些常规的校验(如参数校验,referer校验等),可以在filter层做

  稳定性相关的工作(如全链路打点,可以在filter层分配一个traceId;也可以在这一层做限流等)。我最常见的是spring中的编码过滤器。我们通过编码过滤器认识filter。

    代码:

package com.briup.servlet.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; /**
* Servlet Filter implementation class EncodingFilter
* 编码过滤器
*/
public class EncodingFilter implements Filter { private String encoding; public EncodingFilter() {} public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//设置编码格式【只对post方式有效】;
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
//放行;
chain.doFilter(request, response); System.out.println("servlet执行完毕,返回到filter");
} public void init(FilterConfig fConfig) throws ServletException {
//我们把编码设置在web.xml中,如果需要改编码在配置文件中更改而不需要更改代码
encoding = fConfig.getInitParameter("encoding");
} }

  web.xml:

<filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.briup.servlet.filter.EncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <!-- /* 代表拦截所有请求 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

访问:http://127.0.0.1:7778/StudyServlet/HelloWorld或者http://127.0.0.1:7778/StudyServlet/success.html,控制台都会输出一句:"servlet执行完毕,返回到filter"。

  

3.拦截地址的配置

    filter我主要想说的就是拦截地址如何配置了。    

第一种 【匹配任意】

<url-pattern>/*</url-pattern>

第二种 【精确匹配】

<url-pattern>/test_servlet</url-pattern>

表示此拦截器只会拦截/test_servlet这一个路径

第三种 【扩展名匹配】

<url-pattern>*.html</url-pattern>

表示此拦截器只会拦截后缀名是.html的路径

第四种 【路径匹配】

<url-pattern>/test/*</url-pattern>

表示此拦截器拦截/test路径下的所有资源

注意:服务器内部跳转不会拦截,只会拦截浏览器发送的地址。

二:监听器

  Servlet监听器的作用是监听Web容器的有效期事件,可以监听由于Web应用中状态改变而引起的Servlet容器产生的相应事件,然后接受并处理这些事件。

  下面简单介绍这8个接口和其中的方法。

  监听ServletContent(应用上下文)

    1.ServletContentListener接口

      Servlet的上下文监听,它主要实现监听ServletContext的创建和删除

        (1)contextInitialized(ServletContextEvent event); //通知正在收听的对象,应用程序已经被加载和初始化。

        (2)contextDestroyed(ServletCotextEvent event);  // 通知正在收听的对象,应用程序已经被载出,即关闭。

    2.ServletContextAttributeListener接口

      应用上下文存、移除、更改数据进行监听。

        (1)attributeAdded(ServletContextAttributeEvent event); //应用上下文存数据的时候触发【调用setAttribute方法】

        (2)attributeRemoved(ServletContextAttributeEvent event); //ServletContent对象调用removeAttribute方法触发。

        (3)attributeReplaced(ServletContextAttributeEvent event);  //当存数据的时候,key值已经存在,value值被替换的时候触发。

  

  监听session接口

    3.HttpSessionListener接口

      (1)sessionCreated(HttpSessionEvent even); //session被创建的时候触发。

      (2)sessionDestroyed(HttpSessionEvent event); //session过期失效触发

    4.HttpSessionAttributeListener

      用法和ServletContextAttributeListener接口类似。

  

  监听request接口

    5.ServletRequestListener

    6.ServletRequestAttributeListener

  用法和上面类似。

  7.HttpSessionActivationListener;        
     该接口实现监听HTTP会话active和passivate。
                     (1)attributeAdded(HttpSessionBindingEvent event); // 当有对象加入session的范围时,通知正在收听的对象
                     (2)attributeReplaced(HttpSessionBindingEvent event); //当在session的范围有对象取代另一个对象时,通知正在收听的对象。
                     (3)attributeRemoved(HttpSessionBindingEvent event);  //当有对象从session的范围有对象取代另一个对象时,通知正在收听的对象 。

    其中HttpSessionBindingEvent类主要有三个方法:getName()、getSession()和getValue()

  8.HttpBindingListener;                     
    接口实现监听HTTP会话中对象的绑定信息。
                  (1)alueBound(HttpSessionBindingEvent event);   //当有对象加入session的范围时会被自动调用
                  (2)valueUnBound(HttpSessionBindingEvent event);  //当有对象从session的范围内移除时会被自动调用

注:本文一部分是参考网上资料的。

java web(五):java web三大组件之另外两个和八大监听器的更多相关文章

  1. java基础 五 java注释 关键字 标识符

    一:java有三大注释: 1:当行注释: 使用://开始进行注释. 2:多行注释: /**/  在/*和*/之间的内容 会被编译器忽略. 3:文档注释: /***/  /**注释信息*/和多行注释是一 ...

  2. Java基础(五)-Java序列化与反序列化

    .output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...

  3. Spring Boot之注册servlet三大组件

    由于Spring Boot默认是以jar包的形式启动嵌入式的Servlet容器来启动Spring Boot的web应用是,没有web.xml配置文件 注册三大组件用以下方式 ServletRegist ...

  4. java web 三大组件

    JavaWeb三大组件 Servlet,Filter,Listener. Servlet Servlet的作用 在Java web b/s架构中,servlet扮演了重要的角色,作为一个中转处理的容器 ...

  5. Java Web三大组件之过滤器(Filter)

    什么是过滤器?有什么用? 过滤器JavaWeb三大组件之一,它与Servlet很相似.不过滤器是用来拦截请求的,而不是处理请求的.过滤,顾名思义,就是留下我们想要的,丢掉我们不需要的.例如:某个网站的 ...

  6. java Web三大组件--过滤器

    参考博客:http://www.cnblogs.com/coderland/p/5902878.html https://www.cnblogs.com/HigginCui/p/5772514.htm ...

  7. JAVA首选五款开源Web开发框架

    Spring Spring是一个开源的Java/Java EE全功能栈应用程序框架,在JavaEE社区中非常受欢迎,以Apache许可证形式发布,也有.NET平台上的移植版本. Struts2 Str ...

  8. Java Web(五) JSP详解(四大作用域九大内置对象等)

    前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编 ...

  9. Java Web之Servlet的三大作用域对象

    Servlet的作用域是干嘛的?答案就是共享数据而存在的,如图: 下面通过代码演示来具体讲解一下三大作用域 我们新建两个类 package main.com.vae.scope; import jav ...

随机推荐

  1. 第七次作业——numpy统计分布显示

    用np.random.normal()产生一个正态分布的随机数组,并显示出来. np.random.randn()产生一个正态分布的随机数组,并显示出来. 显示鸢尾花花瓣长度的正态分布图,曲线图,散点 ...

  2. C# 遍历所有的子控件和孙控件,包括容器中的,并批量操作和调用

    这里要用两个知识,一个是递归,一个是队列. //定义一个Control类型的队列allCtrls private static Queue <Control> allCtrls = new ...

  3. MyBatis-day1

    Tips: 1, SQLSession通过SQLSessionFactory获得, SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得.有两种配 ...

  4. MySQL行转列、列转行

    一.行转列 有如图所示的表,现在希望查询的结果将行转成列 建表语句如下: CREATE TABLE `TEST_TB_GRADE` ( `ID` int(10) NOT NULL AUTO_INCRE ...

  5. ABP异常处理

    1.编译器错误消息: CS0012: 类型“System.Object”在未被引用的程序集中定义.必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=n ...

  6. java虚拟机——监控工具

    本篇记录本人在学习JDK监控工具的一些笔记.JDK是1.8 JPS:查看java的进程命令 左边的数字是进程ID,对应的是进程的名称. jstat:查看运行时状态信息. 1.-class:监控类装载, ...

  7. 从数组中取出N个元素的所有组合——递归实现

    https://www.cnblogs.com/null00/archive/2012/04/27/2473788.html 今天在做POJ 1753时,需要枚举一个数组中所有组合.之前也遇到过类似的 ...

  8. ansible小计

    一.忽略hosts,只在一台机器上执行: /usr/local/bin/ansible-playbook /app/ansiblecfg/ztr/ent_extract.yml --limit=10. ...

  9. 超低质量的超低起点PYQT ------前言

    由于年后要赶一个小工程,以前一直用VB6+sqL2K的做些小玩具一样的桌面项目,低级的不能再低级了,某日幡然醒悟,决定努力跟进潮流的尾巴..匆匆撸了一遍网上的PYTHON基础知识,面向对象,装饰器.. ...

  10. CSS效果:不怎么样的登录表单

    HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...