EL&Filter&Listener

EL&Filter&Listener

EL表达式

EL 表达式介绍

  • EL(Expression Language):表达式语言

  • JSP2.0规范加入的内容,也是servlet规范的一部分

  • 作用:在JSP页面中获取数据。让我们的JSP脱离java代码块和JSP表达式

  • 基本语法:EL表达式的语法格式非常简单,写为${表达式内容}

    Java代码块JSP表达式EL表达式
    <%<br/> <br/> String message = (String)request.getAttribute("message");<br/> out.write(message);<br/>%><%=request.getAttribute("message")%>${message}

EL表达式快速入门

  1. 创建一个web项目

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0SfLllf-1643441177938)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128205047499.png)]

  2. 在web目录下创建el01.jsp

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYlu0SCD-1643441177939)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128205111585.png)]

  3. 在文件中向域对象添加数据

  4. 使用第三方方式获取域对象中的java代码块,jsp表达式,EL表达式

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>EL表达式入门案例</title>
      </head>
      <body>
        <%--使用java代码在请求域中存入一个名称为message的数据--%>
        <% request.setAttribute("message","Expression Language");%>
    
        Java代码块获取:<% out.print(request.getAttribute("message"));%>
        <br/>
        JSP表达式获取:<%=request.getAttribute("message")%>
        <br/>
        EL表达式获取:${message}
      </body>
    </html>
    

EL表达式获取数据

  1. 获取基本数据类型的数据
  2. 获取自定义对象类型的数据
  3. 获取数组类型的数据
  4. 获取List集合类型的数据
  5. 获取Map集合类型的数据

封装Student类

package com.example.jsp_demo.bean;

public class Student {
    private String username;
    private int age;
    private int score;

    @Override
    public String toString() {
        return "Student{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public Student(String username, int age, int score) {
        this.username = username;
        this.age = age;
        this.score = score;
    }

    public Student() {
    }
}
<%@ page import="com.example.jsp_demo.bean.Student" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: heroma
  Date: 2022/1/28
  Time: 8:49 下午
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el表达式获取不同的值</title>
</head>
<body>

<%--  1. 获取基本数据类型的数据  --%>
<%
    pageContext.setAttribute("num", 10);
%>
基本数据类型:${num}<br>

<%--  2. 获取自定义对象类型的数据  --%>
<%
    Student student = new Student("zhangsan", 12, 25);
    pageContext.setAttribute("student", student);
%>
自定义对象类型数据:${student.toString()}<br>
<%--student.username实际上调用的get方法--%>
自定义对象类型数据:${student.username}<br>
<%--  3. 获取数组类型的数据  --%>
<%
    String[] arr = {"hello", "word"};
    pageContext.setAttribute("arr",arr);
%>
获取数组类型的数据:${arr[0]}&nbsp;${arr[1]}<br>
<%--  4. 获取List集合类型的数据  --%>
<%
    ArrayList<String> arrayList = new ArrayList<>();
    arrayList.add("aaaa");
    arrayList.add("bbbb");
    pageContext.setAttribute("list",arrayList);
%>
获取List集合类型的数据:${list}<br>
获取List集合类型的数据:${list[1]}<br>
<%--  5. 获取Map集合类型的数据  --%>
<%
    HashMap<String,Student> map = new HashMap<>();
    map.put("hash01",new Student("hero",23,25));
    map.put("hash02",new Student("yang",23,25));
    map.put("hash03",new Student("qian",23,25));
    pageContext.setAttribute("map",map);
%>
获取Map集合类型的数据:${map}<br>
获取Map集合类型的数据:${map.hash01}<br>
获取Map集合类型的数据:${map.hash01.username}<br>

</body>
</html>

EL表达式注意事项

  • EL表达式没有空指针异常
  • EL表达式没有索引越界异常
  • EL表达式没有字符串的拼接

EL表达式的运算符

  • 关系运算符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZ7B8Q4F-1643441177940)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128220531926.png)]

  • 逻辑运算符

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLMZ5rM8-1643441177941)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128220545287.png)]-

  • 其他运算符

    运算符作用
    empty1.判断对象是否为null 2.判断字符串是否为空字符串 3.判断容器元素是否为0
    条件?表达式1:表达式2三元运算符
    <%--empty运算符--%>
    <%
        String str1=null;
        String str2="";
        int a[] ={};
    %>
    ${empty str1}<br>
    ${empty str2}<br>
    ${empty a}<br>
    <%--三元运算符 在对应的按钮上进行勾选--%>
    <%
        pageContext.setAttribute("gender","woman");
    %>
    <input type="radio" name="gender" value="man" ${gender=="man"?"checked":""}>男
    <input type="radio" name="gender" value="woman" ${gender=="woman"?"checked":""}>女
    

EL表达式使用细节

  • EL表达式能够获取四大域对象的数据,根据名称从小到大在域对象中查找

    <%--获取四大域对象的数据--%>
    <%
        pageContext.setAttribute("username","zhangsan");
        request.setAttribute("username","zhangsan");
        session.setAttribute("username","zhangsan");
        application.setAttribute("username","zhangsan");
    %>
    ${username}
    
  • 可以获取JSP表达式中其他八个隐式对象,并调用对象中的方法

    <%--可以获取JSP表达式中其他八个隐式对象--%>
    <%=request.getServletPath()%>
    ${pageContext.request.servletPath}
    

EL表达式隐式对象

EL中的隐式对象类型对应JSP隐式对象备注
PageContextJavax.serlvet.jsp.PageContextPageContext完全一样
ApplicationScopeJava.util.Map没有应用层范围
SessionScopeJava.util.Map没有会话范围
RequestScopeJava.util.Map没有请求范围
PageScopeJava.util.Map没有页面层范围
HeaderJava.util.Map没有请求消息头key,值是value(一个)
HeaderValuesJava.util.Map没有请求消息头key,值是数组(一个头多个值)
ParamJava.util.Map没有请求参数key,值是value(一个)
ParamValuesJava.util.Map没有请求参数key,值是数组(一个名称多个值)
InitParamJava.util.Map没有全局参数,key是参数名称,value是参数值
CookieJava.util.Map没有Key是cookie的名称,value是cookie对象
<%--pageContext 可以或得其他三个域对象和jsp中其他八个隐式对象--%>
${pageContext.request.contextPath}<br>
<%--applicationScope sessionScope requestScope pageScope--%>
<%
    request.setAttribute("username","zhangsan");
%>
${username}<br>
${request.username}<br>
<%--header headerValues 获取请求头数据信息--%>
${header["connection"]}<br>
${headerValues["connection"]}<br>
<%--param paramValues 获取请求参数数据--%>
${param.username}<br>
${paramValues.username}<br>
<%--initParam 获取全局配置参数--%>
${initParam["hero"]}<br>

<%--Cookie 直接获取Cookie信息--%>
${cookie}<br> <%-- 直接写Cookie 获取的是map集合--%>
${cookie.JSESSIONID}<br>
${cookie.JSESSIONID.name}<br> <%-- 获取Cookie对象的名称--%>
${cookie.JSESSIONID.value}<br> <%-- 获取Cookie对象的值--%>

JSTL

JSTL介绍

  • JSTL(JSP Standard Tag Libary):JSP中标准的标签库。它是由Apache实现的。
  • 主要提供给开发人员一个标准通用的标签库
  • 开发人员可以使用这些标签取代JSP页面上的java代码,从而提高成程序的可读性,降低程序的维护难度
组成作用说明
Core核心标签库。通用逻辑处理
Fmt国际化有关。需要不同地域显示不同语言时使用
FunctionsEL函数EL表达式可以使用的方法
SQL操作数据库。了解
XML操作XML。了解

核心标签库

在我们实际开发中,用到的jstl标签库主要以核心标签库为准,偶尔会用到国际化标签库的标签。下表中把我们经常可能用到的标签列在此处,其余标签库请同学们参考【JSTL标签库.doc】文档。

标签名称功能分类分类作用
<c:if>流程控制核心标签库用于判断
<c:choose> ,<c:when>,<c:otherwise>流程控制核心标签库用于多个条件判断
<c:foreache>迭代操作核心标签库用于循环遍历

JSTL使用

  • 条件控制
<%--
  Created by IntelliJ IDEA.
  User: heroma
  Date: 2022/1/28
  Time: 10:55 下午
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入jstl标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>流程控制</title>
</head>
<body>
<%--    向域数据中添加成员数据--%>
${pageContext.setAttribute("score", "C")}
<%--对成绩进行判断--%>
<c:if test="${score eq 'A'}">
    优秀
</c:if>
<%--对成绩进行多条件判断--%>
<c:choose>
    <c:when test="${score eq 'A'}">
        优秀
    </c:when>
    <c:when test="${score eq 'B'}">
        良好
    </c:when>
    <c:when test="${score eq 'C'}">
        及格
    </c:when>
    <c:when test="${score eq 'D'}">
        较差
    </c:when>
</c:choose>
</body>
</html>
  • 遍历

    <%--向与对象中添加集合--%>
    <%
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("aaaa");
        arrayList.add("dddd");
        arrayList.add("aaaas");
        arrayList.add("ccc");
        pageContext.setAttribute("list",arrayList);
    %>
     <%-- c:forEach 它是用来遍历集合的
        	 属性:
        	 	items:要遍历的集合,它可以是EL表达式取出来的
        	 	var:把当前遍历的元素放入指定的page域中。 var的取值就是key,当前遍历的元素就是value
        	 		注意:它不能支持EL表达式,只能是字符串常量
        	 	begin:开始遍历的索引
        	 	end:结束遍历的索引
        	 	step:步长。i+=step
        	 	varStatus:它是一个计数器对象。里面有两个属性,一个是用于记录索引。一个是用于计数。
        	 			   索引是从0开始。计数是从1开始
        --%>
    <c:forEach items="${list}" var="str">
        ${str}<br>
    </c:forEach>
    

Filter

过滤器介绍

  • 过滤器——Filter,它是JavaWeb三大组件之一。另外两个是Servlet和Listener

  • 在程序中访问服务器资源时,当一个请求到来,服务器首先判断是否有过滤器与请求资源相关联,如果有,过滤器可以将请求拦截下来,完成一些特定的功能,再由过滤器决定是否交给请求资源。如果没有则像之前那样直接请求资源。响应也是类似的

  • 它是在2000年发布的Servlet2.3规范中加入的一个接口。是Servlet规范中非常实用的技术

  • 它可以对web应用中的所有资源进行拦截,并且在拦截之后进行一些特殊的操作

  • 常见应用场景:登录验证;URL级别的权限控制;过滤敏感词汇;中文乱码问题等等

Filter介绍

  • Filter是一个接口。如果要实现过滤功能,必须实现该接口

  • 核心方法

    返回值方法名作用
    voidinit(FilterConfig filterConfig)初始化方法
    voiddoFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)对请求资源和响应资源过滤
    voiddestroy()销毁方法
  • 配置方式

    • 注解方式
    • 配置文件

FilterChain介绍

  • FilterChain是一个接口,代表过滤链对象。由servlet容器提供实现类对象,直接使用即可

  • 过滤器可以定义多个,就会形成过滤链

  • 核心方法

    返回值方法名作用
    voiddoFilter(ServletRequest servletRequest, ServletResponse servletResponse)放行方法

    如果有多个过滤器,在第一个过滤器中调用下一个过滤器,以此类推,直到到达最终访问资源

    如果只有一个过滤器,放行时,就会直接到达最终访问资源

过滤器使用

  • 需求说明
    • 通过Filter过滤器实现多个资源写出中文乱码的问题
  • 最终目的
    • 通过本需求,最终掌握Filter过滤器的使用
  • 实现步骤
    1. 创建一个web项目
    2. 创建两个servlet功能类,向客户端写出中文数据
    3. 创建一个Filter过滤器实现类,重写doFilter核心方法
    4. 在方法内解决中文乱码,开放行
    5. 部署并启动项目
    6. 通过过滤器调试
package com.example.jsp_demo;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet( "/1")
public class HelloServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("demo01执行了。。。。");
        response.getWriter().write("demo01执行了。。。。");
    }

}
package com.example.jsp_demo;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet( "/2")
public class FilterServlet extends HttpServlet{

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        System.out.println("demo02执行了。。。。");
        response.getWriter().write("demo02执行了。。。。");
    }

}
package com.example.jsp_demo;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

@WebFilter("/*")
public class FilterImpl implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("过滤器执行了。。。。");
        //处理中文乱码
        servletResponse.setContentType("text/html;charset=UTF-8");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    public void destroy() {

    }
}

过滤器使用细节

  • 配置方式

    • 注解方式,@WebFilter("/*")

    • 配置文件方式

      <!--配置过滤器-->
       <filter>
              <filter-name>filter01</filter-name>
              <filter-class>com.example.jsp_demo.FilterImpl</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>filter01</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      
  • 多个过滤器执行

    • 如果有多个过滤器,取决于过滤器映射的顺序

过滤器的生命周期

  • 创建
    • 当应用加载时实例化对象并执行init初始化方法
  • 服务
    • 对象提供服务的过程,执行doFilter方法
  • 销毁
    • 当应用卸载时或服务器停止对象销毁,执行destroy方法

FilterConfig介绍

  • FilterConfig是一个接口,代表过滤器的配置对象,可以加载一些初始化参数

  • 核心方法

    返回值方法名作用
    StringgetFilterName()获取过滤器对象名称
    StringgetInitParameter(Sting key)根据key获取value
    EnumerationgetInitParameterNames()获取所有参数的key
    ServletContextgetServletContext()获取应用上下文
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("对象执行了");
        String filterName = filterConfig.getFilterName();
        System.out.println(filterName);
        String username = filterConfig.getInitParameter("username");
        System.out.println(username);
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
    }
    

过滤器的五中拦截行为

  • 我们的过滤器目前拦截的是请求,但是在实际开发中,我们还有请求转发和请求包含,以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的,要想使用,需要我们配置。

  • 拦截方式

    <!--配置过滤器-->
    <filter>
        <filter-name>FilterDemo1</filter-name>
        <filter-class>com.example.jsp_demo.filter.FilterDemo1</filter-class>
        <!--配置开启异步支持,当dispatcher配置ASYNC时,需要配置此行-->
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>FilterDemo1</filter-name>
        <url-pattern>/ServletDemo1</url-pattern>
        <!--过滤请求:默认值。-->
        <dispatcher>REQUEST</dispatcher>
        <!--过滤全局错误页面:当由服务器调用全局错误页面时,过滤器工作-->
        <dispatcher>ERROR</dispatcher>
        <!--过滤请求转发:当请求转发时,过滤器工作。-->
        <dispatcher>FORWARD</dispatcher>
        <!--过滤请求包含:当请求包含时,过滤器工作。它只能过滤动态包含,jsp的include指令是静态包含-->
        <dispatcher>INCLUDE</dispatcher>
        <!--过滤异步类型,它要求我们在filter标签中配置开启异步支持-->
        <dispatcher>ASYNC</dispatcher>
    </filter-mapping>
    

过滤器与servlet的区别

方法/类型ServletFilter备注
初始化 方法void init(ServletConfig);void init(FilterConfig);几乎一样,都是在web.xml中配置参数,用该对象的方法可以获取到。
提供服务方法void service(request,response);void dofilter(request,response,FilterChain);Filter比Servlet多了一个FilterChain,它不仅能完成Servlet的功能,而且还可以决定程序是否能继续执行。所以过滤器比Servlet更为强大。 在Struts2中,核心控制器就是一个过滤器。
销毁方法void destroy();void destroy();

过滤器使用案例

  • 需求说明

    在我们访问html,js,image时,不需要每次都重新发送请求读取资源,就可以通过设置响应消息头的方式,设置缓存时间。但是如果每个Servlet都编写相同的代码,显然不符合我们统一调用和维护的理念。(此处有个非常重要的编程思想:AOP思想,在录制视频时提不提都可以)

  • 编写过滤器

    /**
     * 静态资源设置缓存时间
     * 	html设置为1小时
     *  js设置为2小时
     *  css设置为3小时
     */
    public class StaticResourceNeedCacheFilter implements Filter {
    
        private FilterConfig filterConfig;
    
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
        }
    
    
        public void doFilter(ServletRequest req, ServletResponse res,
                             FilterChain chain) throws IOException, ServletException {
            //1.把doFilter的请求和响应对象转换成跟http协议有关的对象
            HttpServletRequest  request;
            HttpServletResponse response;
            try {
                request = (HttpServletRequest) req;
                response = (HttpServletResponse) res;
            } catch (ClassCastException e) {
                throw new ServletException("non-HTTP request or response");
            }
            //2.获取请求资源URI
            String uri = request.getRequestURI();
            //3.得到请求资源到底是什么类型
            String extend = uri.substring(uri.lastIndexOf(".")+1);//我们只需要判断它是不是html,css,js。其他的不管
            //4.判断到底是什么类型的资源
            long time = 60*60*1000;
            if("html".equals(extend)){
                //html 缓存1小时
                String html = filterConfig.getInitParameter("html");
                time = time*Long.parseLong(html);
            }else if("js".equals(extend)){
                //js 缓存2小时
                String js = filterConfig.getInitParameter("js");
                time = time*Long.parseLong(js);
            }else if("css".equals(extend)){
                //css 缓存3小时
                String css = filterConfig.getInitParameter("css");
                time = time*Long.parseLong(css);
    
            }
            //5.设置响应消息头
            response.setDateHeader("Expires", System.currentTimeMillis()+time);
            //6.放行
            chain.doFilter(request, response);
        }
    
    
        public void destroy() {
    
        }
    
    }
    
  • 配置过滤器

    <filter>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <filter-class>com.example.jsp_demo.filter.StaticResourceNeedCacheFilter</filter-class>
        <init-param>
            <param-name>html</param-name>
            <param-value>3</param-value>
        </init-param>
        <init-param>
            <param-name>js</param-name>
            <param-value>4</param-value>
        </init-param>
        <init-param>
            <param-name>css</param-name>
            <param-value>5</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.js</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.css</url-pattern>
    </filter-mapping>
    

Listener

监听器介绍

  • 观察者模式:所有的监听器都是观察者设计模式的体现,它是事件驱动的一种体现形式。就好比在做什么事情的时候被人盯着。当对应做到某件事时,触发事件
  • 三个组成部分
    • 事件源:触发事件的对象。
    • 事件:触发的动作,里面封装了事件源。
    • 监听器:当事件源触发事件时,要做的事情。一般是一个接口,由使用者来实现。
  • 在程序当中,我们可以对对象的创建销毁、域对象中属性的变化、会话相关内容进行监听
  • servlet规范中共计8个监听器,监听器都是以接口形式提供的,具体功能需要我们自己完成

监听对象的监听器

  • ServletContextListener:用于监听ServletContext对象的创建和销毁

  • 核心方法

    返回值方法名作用
    voidcontextInitialized(ServletContextEvent sce)对象创建时执行方法
    voidcontextDestroyed(ServletContextEvent sce)对象销毁时执行方法

    参数:ServletContextEvent代表事件对象

    ​ 事件对象中封装了事件源,也就是ServletContext

    ​ 真正的事件是指创建或者销毁ServletContext对象的操作

  • HttpSessionListener:用于监听HttpSession对象的创建和销毁

  • 核心方法

    返回值方法名作用
    voidsessionCreated(HttpSessionEvent se)对象创建时执行方法
    voidsessionDestroyed(HttpSessionEvent se)对象销毁时执行方法
  • ServletRequestListener:用于监听ServletRequest对象的创建和销毁

    返回值方法名作用
    voidrequestInitialized (ServletRequestEvent sre)对象创建时执行方法
    voidrequestDestroyed (ServletRequestEvent sre)对象销毁时执行方法

    参数:ServletRequestEvent代表事件对象

    ​ 事件对象中封装了事件源,也就是ServletRequest

    ​ 真正的事件是指创建或者销毁ServletRequest对象的操作

监听域中属性发生变化的监听器

  • ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化

  • 核心方法

    返回值方法名作用
    voidattributeAdded(ServletContextAttributeEvent scae)域中添加了属性触发此方法
    voidattributeRemoved(ServletContextAttributeEvent scae)域中删除了属性触发此方法
    voidattributeReplaced(ServletContextAttributeEvent scae)域中属性发生改变触发此方法

    参数:ServletContextAttributeListener代表事件对象

    ​ 事件对象中封装了事件源,也就是ServletContext

    ​ 真正的事件是指添加、移除、替换应用域中属性的操作

  • HttpSessionAttributeListener:用于监听HttpSession应用域中属性的变化

  • 核心方法

    返回值方法名作用
    voidattributeAdded(HttpSessionBindingEvent se)域中添加了属性触发此方法
    voidattributeRemoved(HttpSessionBindingEvent se)域中删除了属性触发此方法
    voidattributeReplaced(HttpSessionBindingEvent se)域中属性发生改变触发此方法

    参数:HttpSessionAttributeListener代表事件对象

    ​ 事件对象中封装了事件源,也就是HttpSession

    ​ 真正的事件是指添加、移除、替换应用域中属性的操作

  • ServletRequestAttributeListener:用于监听ServletContext应用域中属性的变化

  • 核心方法

    返回值方法名作用
    voidattributeAdded(ServletRequestAttributeEvent srae)域中添加了属性触发此方法
    voidattributeRemoved(ServletRequestAttributeEvent srae)域中删除了属性触发此方法
    voidattributeReplaced(ServletRequestAttributeEvent srae)域中属性发生改变触发此方法

    参数:ServletRequestAttributeListener代表事件对象

    ​ 事件对象中封装了事件源,也就是ServletRequest

    ​ 真正的事件是指添加、移除、替换应用域中属性的操作

监听会话相关的感知性监听器

  • HttpSessionBinderListener:用于感知对象和会话域绑定的监听器

  • 核心方法

    返回值方法名作用
    voidvalueBound(HttpSessionBindingEvent event)当数据加入会话域时,也就是绑定,此方法执行
    voidvalueUnbound(HttpSessionBindingEvent event)当从会话域移除时,也就是解绑,此方法执行

    参数:HttpSessionBinderListener代表事件对象

    ​ 事件对象中封装了事件源,也就是HttpSession

    ​ 真正的事件是指添加、移除会话域中数据的操作

  • HttpSessionActivationListener:用于感知对象和会话域中对象钝化和活化的监听器

  • 核心方法

    返回值方法名作用
    voidsessionWillPassivate(HttpSessionEvent se)当会话域中的数据钝化时,此方法执行
    voidsessionDidActivate(HttpSessionEvent se)当会话域中的数据活化时(激活),此方法执行

    参数:HttpSessionActivationListener代表事件对象

    ​ 事件对象中封装了事件源,也就是HttpSession

    ​ 真正的事件是指会话域中钝化和活化的操作

监听器的使用

  • ServletContextListener使用

    package com.example.jsp_demo;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class ListenerServlet implements ServletContextListener {
        /**
         * servletContext创建时执行
         * @param sce
         */
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println("监听到了对象的创建");
    //        获取对象
            ServletContext servletContext = sce.getServletContext();
            System.out.println(servletContext);
        }
    
        /**
         * servletContext对象销毁时执行
         * @param sce
         */
        @Override
        public void contextDestroyed(ServletContextEvent sce) {
            System.out.println("监听到了对象销毁");
    
        }
    }
    
  • ServletContextAttributeListener使用

    package com.example.jsp_demo;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    
    @WebServlet( "/1")
    public class HelloServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            System.out.println("demo01执行了。。。。");
            response.getWriter().write("demo01执行了。。。。");
            request.getServletContext().setAttribute("username","zhangsan");
            request.getServletContext().setAttribute("username","lisi");
        }
    
    }
    
    package com.example.jsp_demo;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class ListenerServlet implements ServletContextAttributeListener {
        /**
         * 向应用域中添加属性时执行方法
         * @param event
         */
        @Override
        public void attributeAdded(ServletContextAttributeEvent event) {
            System.out.println("监听到属性的添加");
            ServletContext servletContext = event.getServletContext();
            Object value = servletContext.getAttribute("username");
            System.out.println(value);
        }
        /**
         * 向应用域中移除属性时执行方法
         * @param event
         */
        @Override
        public void attributeRemoved(ServletContextAttributeEvent event) {
            System.out.println("监听到属性的移除");
            ServletContext servletContext = event.getServletContext();
            Object value = servletContext.getAttribute("username");
            System.out.println(value);
        }
        /**
         * 向应用域中替换属性时执行方法
         * @param event
         */
        @Override
        public void attributeReplaced(ServletContextAttributeEvent event) {
            System.out.println("监听到属性的替换");
            ServletContext servletContext = event.getServletContext();
            Object value = servletContext.getAttribute("username");
            System.out.println(value);
        }
    }
    
  • 配置文件配置

    <!--配置监听器-->
    <listener>
        <listener-class>com.example.jsp_demo.ListenerServlet</listener-class>
    </listener>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heromps

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值