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表达式快速入门
-
创建一个web项目
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f0SfLllf-1643441177938)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128205047499.png)]](https://i-blog.csdnimg.cn/blog_migrate/67e19eb602d654a5326bd607088e61c3.png)
-
在web目录下创建el01.jsp
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iYlu0SCD-1643441177939)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128205111585.png)]](https://i-blog.csdnimg.cn/blog_migrate/b1065de62e2512a3180df90a66bd5fa8.png)
-
在文件中向域对象添加数据
-
使用第三方方式获取域对象中的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表达式获取数据
- 获取基本数据类型的数据
- 获取自定义对象类型的数据
- 获取数组类型的数据
- 获取List集合类型的数据
- 获取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]} ${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)]](https://i-blog.csdnimg.cn/blog_migrate/26e3333fc395661336a5898bcc009381.png)
-
逻辑运算符
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLMZ5rM8-1643441177941)(/Users/heroma/Library/Application Support/typora-user-images/image-20220128220545287.png)]-](https://i-blog.csdnimg.cn/blog_migrate/c257de8afbed96260fad05f9aabaa37d.png)
-
其他运算符
运算符 作用 empty 1.判断对象是否为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隐式对象 | 备注 |
|---|---|---|---|
| PageContext | Javax.serlvet.jsp.PageContext | PageContext | 完全一样 |
| ApplicationScope | Java.util.Map | 没有 | 应用层范围 |
| SessionScope | Java.util.Map | 没有 | 会话范围 |
| RequestScope | Java.util.Map | 没有 | 请求范围 |
| PageScope | Java.util.Map | 没有 | 页面层范围 |
| Header | Java.util.Map | 没有 | 请求消息头key,值是value(一个) |
| HeaderValues | Java.util.Map | 没有 | 请求消息头key,值是数组(一个头多个值) |
| Param | Java.util.Map | 没有 | 请求参数key,值是value(一个) |
| ParamValues | Java.util.Map | 没有 | 请求参数key,值是数组(一个名称多个值) |
| InitParam | Java.util.Map | 没有 | 全局参数,key是参数名称,value是参数值 |
| Cookie | Java.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 | 国际化有关。 | 需要不同地域显示不同语言时使用 |
| Functions | EL函数 | 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是一个接口。如果要实现过滤功能,必须实现该接口
-
核心方法
返回值 方法名 作用 void init(FilterConfig filterConfig) 初始化方法 void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 对请求资源和响应资源过滤 void destroy() 销毁方法 -
配置方式
- 注解方式
- 配置文件
FilterChain介绍
-
FilterChain是一个接口,代表过滤链对象。由servlet容器提供实现类对象,直接使用即可
-
过滤器可以定义多个,就会形成过滤链
-
核心方法
返回值 方法名 作用 void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) 放行方法 如果有多个过滤器,在第一个过滤器中调用下一个过滤器,以此类推,直到到达最终访问资源
如果只有一个过滤器,放行时,就会直接到达最终访问资源
过滤器使用
- 需求说明
- 通过Filter过滤器实现多个资源写出中文乱码的问题
- 最终目的
- 通过本需求,最终掌握Filter过滤器的使用
- 实现步骤
- 创建一个web项目
- 创建两个servlet功能类,向客户端写出中文数据
- 创建一个Filter过滤器实现类,重写doFilter核心方法
- 在方法内解决中文乱码,开放行
- 部署并启动项目
- 通过过滤器调试
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是一个接口,代表过滤器的配置对象,可以加载一些初始化参数
-
核心方法
返回值 方法名 作用 String getFilterName() 获取过滤器对象名称 String getInitParameter(Sting key) 根据key获取value Enumeration getInitParameterNames() 获取所有参数的key ServletContext getServletContext() 获取应用上下文 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的区别
| 方法/类型 | Servlet | Filter | 备注 |
|---|---|---|---|
| 初始化 方法 | 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对象的创建和销毁
-
核心方法
返回值 方法名 作用 void contextInitialized(ServletContextEvent sce) 对象创建时执行方法 void contextDestroyed(ServletContextEvent sce) 对象销毁时执行方法 参数:ServletContextEvent代表事件对象
事件对象中封装了事件源,也就是ServletContext
真正的事件是指创建或者销毁ServletContext对象的操作
-
HttpSessionListener:用于监听HttpSession对象的创建和销毁
-
核心方法
返回值 方法名 作用 void sessionCreated(HttpSessionEvent se) 对象创建时执行方法 void sessionDestroyed(HttpSessionEvent se) 对象销毁时执行方法 -
ServletRequestListener:用于监听ServletRequest对象的创建和销毁
返回值 方法名 作用 void requestInitialized (ServletRequestEvent sre) 对象创建时执行方法 void requestDestroyed (ServletRequestEvent sre) 对象销毁时执行方法 参数:ServletRequestEvent代表事件对象
事件对象中封装了事件源,也就是ServletRequest
真正的事件是指创建或者销毁ServletRequest对象的操作
监听域中属性发生变化的监听器
-
ServletContextAttributeListener:用于监听ServletContext应用域中属性的变化
-
核心方法
返回值 方法名 作用 void attributeAdded(ServletContextAttributeEvent scae) 域中添加了属性触发此方法 void attributeRemoved(ServletContextAttributeEvent scae) 域中删除了属性触发此方法 void attributeReplaced(ServletContextAttributeEvent scae) 域中属性发生改变触发此方法 参数:ServletContextAttributeListener代表事件对象
事件对象中封装了事件源,也就是ServletContext
真正的事件是指添加、移除、替换应用域中属性的操作
-
HttpSessionAttributeListener:用于监听HttpSession应用域中属性的变化
-
核心方法
返回值 方法名 作用 void attributeAdded(HttpSessionBindingEvent se) 域中添加了属性触发此方法 void attributeRemoved(HttpSessionBindingEvent se) 域中删除了属性触发此方法 void attributeReplaced(HttpSessionBindingEvent se) 域中属性发生改变触发此方法 参数:HttpSessionAttributeListener代表事件对象
事件对象中封装了事件源,也就是HttpSession
真正的事件是指添加、移除、替换应用域中属性的操作
-
ServletRequestAttributeListener:用于监听ServletContext应用域中属性的变化
-
核心方法
返回值 方法名 作用 void attributeAdded(ServletRequestAttributeEvent srae) 域中添加了属性触发此方法 void attributeRemoved(ServletRequestAttributeEvent srae) 域中删除了属性触发此方法 void attributeReplaced(ServletRequestAttributeEvent srae) 域中属性发生改变触发此方法 参数:ServletRequestAttributeListener代表事件对象
事件对象中封装了事件源,也就是ServletRequest
真正的事件是指添加、移除、替换应用域中属性的操作
监听会话相关的感知性监听器
-
HttpSessionBinderListener:用于感知对象和会话域绑定的监听器
-
核心方法
返回值 方法名 作用 void valueBound(HttpSessionBindingEvent event) 当数据加入会话域时,也就是绑定,此方法执行 void valueUnbound(HttpSessionBindingEvent event) 当从会话域移除时,也就是解绑,此方法执行 参数:HttpSessionBinderListener代表事件对象
事件对象中封装了事件源,也就是HttpSession
真正的事件是指添加、移除会话域中数据的操作
-
HttpSessionActivationListener:用于感知对象和会话域中对象钝化和活化的监听器
-
核心方法
返回值 方法名 作用 void sessionWillPassivate(HttpSessionEvent se) 当会话域中的数据钝化时,此方法执行 void sessionDidActivate(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>
1602

被折叠的 条评论
为什么被折叠?



