javaWEB监听器
概述
Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。
监听器可以监听就是在 application,session,request 三个对象创建、销毁或者往其中添加修改删除属性时自动
执行代码的功能组件。
监听器的组件:
监听器可以大致分为四个组件(方便理解)
事件源:事件发生的源头
监听器:监听事件发生
绑定:将监听器绑定到事件源
事件:能够触发监听器的事
监听器分类
Servlet规范中提供了8个监听器
按功能进行划分将其分成三类,如下:
一类:监听三个域对象的创建和销毁的监听器
二类:监听三个域对象的属性变更的监听器。(属性添加、属性移除、属性替换)
三类:监听HttpSession对象中的JavaBean的状态的改变。(绑定、解除绑定、钝化、活化)
监听器分类 | 监听器名称 | 作用 |
---|---|---|
ServletContext监听 | ServletContextListener | 监听ServletContext对象的创建和销毁 |
ServletContextAttributeListener | 监听ServletContext对象中属性的增删改 | |
Session监听 | HttpSessionListener | 监听Session对象的创建和销毁 |
HttpSessionAttributeListener | 监听Session对象中属性的增删改 | |
HttpSessionBindingListener | 监听对象与Session的绑定与解除 | |
HttpSessionActivationListener | 监听Session的激活 | |
Request监听 | ServletRequestListener | 监听Request对象的创建和销毁 |
ServletRequestAttributeListener | 监听Request对象中属性的增删改 |
监听器的开发步骤
1.自定义类实现一类监听器
2.重写监听器中的方法
3.配置xml配置文件或注解配置
配置方式:
/**
* 监听器开发步骤
*/
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
//监听ServletContext域的销毁,随着服务器的关闭
System.out.println("ServletContext销毁");
}
}
配置xml文件:
<listener>
<listener-class>com.gx.listener.FirstListener</listener-class>
</listener>
注解方式:
@WebListener,加了该注解默认配置了监听器
/**
* 监听器开发步骤
*/
@WebListener
public class FirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的销毁,随着服务器的关闭
*/
System.out.println("ServletContext销毁");
}
}
一类监听器
监听三个域对象(ServletContext、Session、Request)的创建与销毁
监听ServletContext域对象
实现ServletContextListener接口并覆盖方法
监听服务器启动的时候创建ServletContext对象时
监听服务器关闭的时候ServletContext对象被销毁掉
/**
* 监听ServletContext
*/
@WebListener
public class TestServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的初始化,随着服务器的启动
*/
System.out.println("ServletContext初始化");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
/**
* 监听ServletContext域的销毁,随着服务器的关闭
*/
System.out.println("ServletContext销毁");
}
}
监听Session域对象
实现HttpSessionListener接口并覆盖方法
- 监听服务器端第一次调用getSession方法时
- 监听session过期或调用了invalidate方法
/**
* 监听HttpSession
*/
@WebListener
public class TestHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("Session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("Session销毁");
}
}
Servlet测试
@WebServlet(name = "TestSessionServlet", value = "/tss")
public class TestSessionServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Session对象
HttpSession session = request.getSession();
System.out.println(session.getId());
//销毁Session对象
session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
监听Request域对象
实现ServletRequestListener接口并覆盖方法
- 监听客户的向服务器发送了一次请求而创建这一个request对象
- 监听当服务器为这次请求作出了响应之后的request对象销毁
/**
* 监听ServletRequest
*/
@WebListener
public class TestServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("Request对象创建");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent){
System.out.println("Request对象销毁");
}
}
Servlet测试
@WebServlet(name = "TestRequestServlet", value = "/trs")
public class TestRequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String requestURI = request.getRequestURI();
System.out.println(requestURI);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
二类监听器
监听三个域对象的属性变更的监听器(属性添加、属性移除、属性替换)
监听ServletContext属性
实现ServletContextAttributeListener接口并覆盖方法
- 监听ServletContext域中的属性变更
/**
* 监听ServletContext域中的属性变更
*/
@WebListener
public class TestServletContextAttributeListener implements
ServletContextAttributeListener {
/**
* 监听ServletContext域对象中属性的添加
*/
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext Added");
}
/**
* 监听ServletContext域对象中属性的移除
*/
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext Removed");
}
/**
* 监听ServletContext域对象中属性的替换
*/
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("ServletContext Replaced");
}
}
servlet:测试
@WebServlet(name = "TestServletContextAttributeServlet", value = "/tscas")
public class TestServletContextAttributeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext servletContext = getServletContext();
//添加
servletContext.setAttribute("name", "ziph");
//替换
servletContext.setAttribute("name", "join");
//移除
servletContext.removeAttribute("name");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
监听Session属性
实现HttpSessionAttributeListener接口并覆盖方法
- 监听HttpSession域中的属性变更
/**
* 监听Session域中的属性变更
*/
@WebListener
public class TestHttpSessionAttributeListener implements
HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("Session Added");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("Session Removed");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("Session Replaced");
}
}
Servlet测试
/**
* 注意:销毁和移除都能触发监听器的attributeRemoved方法
*/
@WebServlet(name = "TestSessionAttributeServlet", value = "/tsas")
public class TestSessionAttributeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
StringBuffer buffer = new StringBuffer();
buffer.append("ziph");
//添加
session.setAttribute("name", buffer);
buffer.append(" is very good!");
//替换
session.setAttribute("name", buffer);
//移除
session.removeAttribute("name");
//销毁
session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
监听Request属性
- 实现ServletRequestAttributeListener接口并覆盖方法
- 监听ServletRequest中的属性变更
/**
* 监听Request域中的属性变更
*/
@WebListener
public class TestServletRequestAttributeListener implements
ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("Request Added");
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("Request Removed");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("Request Replaced");
}
}
Servlet测试
@WebServlet(name = "TestServletRequestAttributeServlet", value = "/tsras")
public class TestServletRequestAttributeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
StringBuffer buffer = new StringBuffer();
buffer.append("ziph");
//添加
request.setAttribute("name", buffer);
buffer.append("marry");
//替换
request.setAttribute("name", buffer);
//移除
request.removeAttribute("name");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
三类监听器
HttpSessionBindingListener监听HttpSession中的JavaBean的状态(绑定和解除绑定状态)
注意:该监听器不需要xml配置和注解配置
/**
* 三类监听器HttpSessionBingingListener
*/
public class User implements HttpSessionBindingListener {
private int id;
private String username;
private String password;
public User() {
}
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent)
{
System.out.println("User对象绑定");
}
@Override
public void valueUnbound(HttpSessionBindingEvent
httpSessionBindingEvent) {
System.out.println("User对象解绑");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password\='" + password + '\'' +
'}';
}
}
Servlet测试
@WebServlet(name = "TestHttpSessionBingingListenerServlet", value = "/thsbls")
public class TestHttpSessionBingingListenerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//绑定
session.setAttribute("user", new User(1, "ziph", "123456"));
//解绑
session.removeAttribute("user");
//销毁也是解绑的一种
// session.invalidate();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}