web监听器
客户端请求
服务端操作
ServletContext(application)
HttpSession(session)
ServletRequest(request)
servlet规范中定义的一种特殊类
用于监听servletcontext,httpsession,servletRequest等域对象的创建与销毁事件
用于监听域对象的属性发生修改的事件
在事件发生前后做一些处理
用途
第一个监听器
优先级
监听器>过滤器>Servlet
按照监听对象划分
监听事件划分
用途
ServletContextEvent对象可以调用一系列的方法
调用获取初始化参数
String myuser = servletContextEvent.getServletContext().getInitParameter("user");
//web.xml设置
<context-param>
<param-name>user</param-name>
<param-value>juedaiyuer</param-value>
</context-param>
用途
实现了HttpSessionListener接口
session服务参数配置
//配置session存活时间
<session-config>
<session-timeout>0</session-timeout>
</session-config>
用途
记录访问历史
//后台日志显示的启动情况(打印刷存在感)
requestInitialized
sessionCreated
requestDestroyed
同理可以根据ServletRequestEvent这个事件对象来获取request的参数(get一系列的方法)
String myname = servletRequestEvent.getServletRequest().getParameter("name");
url:http://localhost:8080/FirstListener/?name=juedaiyuer
后台就会获取到name参数
域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器
ServletContext
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个
例子
购物网站来说,从数据库提取物品信息,如果采用session存储这些物品信息,每一个用户都需要访问一次数据库;采用上下文的话,每一个用户只需要访问上下文读入物品信息即可.
接口中定义的方法
属性的添加,替换,删除
在一个jsp页面传递参数值
request.setAttribute();
getAttribute和getParameter的区别
getParameter必须是url带参数形式
getAttribute获取参数的方式只有setAttribute设置参数的时候,才能够有效
package Listener;
import java.text.MessageFormat;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class MyServletContextAttributeListener implements
ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
String str = MessageFormat.format("ServletContext域对象中添加了属性:{0} 属性值:{1}",arg0.getName(),arg0.getValue());
System.out.println(str);
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
String str = MessageFormat.format("ServletContext域对象中删除了属性:{0} 属性值:{1}",arg0.getName(),arg0.getValue());
System.out.println(str);
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
// TODO Auto-generated method stub
String str = MessageFormat.format("ServletContext域对象中替换了属性:{0} ",arg0.getName());
System.out.println(str);
}
}
web.xml配置
Test.jsp添加测试片段
<%
application.setAttribute("name", "juedaiyuer");
application.setAttribute("name", "zhanhunyiran");
application.removeAttribute("name");
%>
<%
session.setAttribute("user", "user01");
session.setAttribute("user", "user02");
session.removeAttribute("user");
%>
<%
request.setAttribute("user", "user01");
request.setAttribute("user", "user02");
request.removeAttribute("user");
%>
Session钝化机制
session一般情况存储于内存,当用户达到一定数量级,会影响到服务器性能,采用的钝化机制.
本质在于把服务器中不经常使用的session对象暂时序列化到文件系统中或者是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成.
tomcat钝化管理器
session钝化机制由SessionManager管理
实际开发用到的并不是很多
org.apache.catalina.session.StandardManager
org.apache.catalina.session.Persistentmanager管理
接口
HttpSessionBindingListener
提供方法:
绑定:valueBound方法
解除绑定:valueUnbound方法
HttpSessionActivationListener
提供方法:
1. 钝化 sessionWillPassivate
2. 活化 sessionDidActivate
不需要在web.xml文件中注册
创建一个javabean
用myEclipse创建一个类实现HttpSessionBindingListener接口
package entity;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements HttpSessionBindingListener {
private String username;
private String password;
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("valueBound---name:"+arg0.getName());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("valueUnbound---name:"+arg0.getName());
}
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;
}
}
<%@page import="entity.User"%>
session.setAttribute("currentUser", new User());
session.removeAttribute("currentUser");
javabean
package entity;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class User2 implements HttpSessionActivationListener,Serializable {
private String name;
private static final long serialUID = 1;
public void sessionDidActivate(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("活化到硬盘,session的id:"+se.getSession().getId());
}
public void sessionWillPassivate(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("钝化到硬盘,session的id:"+se.getSession().getId());
}
public User2(String name)
{
this.name = name;
}
}
@WebListener
该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口
*Listener
无法定义监听器的顺序
统计在线人数
package manager;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class MySessionManger implements HttpSessionListener {
private int userNumber;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
userNumber++;
arg0.getSession().getServletContext().setAttribute("userNum", userNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
// TODO Auto-generated method stub
userNumber--;
arg0.getSession().getServletContext().setAttribute("userNum", userNumber);
}
}
将在线用户数保存在上下文
使用了EL表达式
当前用户在线人数${userNum}
统计在线用户
统计访问者的来源(ip),使用request对象
源代码