-
@监听器分类: 1.按监听器的对象划分: a 用户监听应用程序环境对象(ServletContext)的事件监听器 b 用于监听用户会话对象(HttpSession)的事件监听器 c 用于监听请求消息对象(ServletRequest)的事件监听器 2.按事件划分 a 监听域对象自身的创建和销毁的事件监听器 b 监听域对象中的属性的增加和删除的事件监听器 c 监听绑定到HttpSession域中的某个对象的状态的事件监听器。对ServletContext的监听:ServletContextListener<br> 有两个方法:初始化方法和销毁方法<br> 用途:定时器 加载全局属性
@FirstListener.java public class FirstListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { System.out.println("contextDestroyed"); } public void contextInitialized(ServletContextEvent arg0) { String user = arg0.getServletContext().getInitParameter("user"); System.out.println("contextInitialized:" + user); } } @web.xml <context-param> <param-name>user</param-name> <param-value>admin</param-value> </context-param>
查看全部 -
有多个监听器的时候,按web.xml中注册顺序启动 监听器>过滤器>servlet的启动顺序
查看全部 -
@FirstListener.java public class FirstListener implements ServletContextListener { public void contextDestroyed(ServletContextEvent arg0) { System.out.println("contextDestroyed"); } public void contextInitialized(ServletContextEvent arg0) { System.out.println("contextInitialized"); } } @web.xml <listener> <listener-class>com.imooc.listener.FirstListener</listener-class> </listener> @输出: //Tomcat启动 contextInitialized //Tomcat关闭 contextDestroyed
查看全部 -
Web监听器由Servlet规范提供的,可以监听客户端的请求以及服务端的操作,即监听ServletContext、HttpSession、ServletRequest对象.(这三个对象称为域对象).监听事件分为这三个对象的创建、销毁事件以及这三个对象属性的变化事件.与监听绑定到HttpSession域中的某个对象的状态的时间,分别要实现不同的监听器接口. ServletContext-->对应jsp的application对象. HttpSession-->对应jsp的session对象. ServletRequest-->对应jsp的request对象.
application:是上下文对象,由容器创建并初始化的。范围整个web应用,只会有一个存在,服务器关闭时销毁。 session:保存上下文的机制,针对每一个会话,放在服务器端通过sessionId区分的,浏览器和服务器关闭后,销毁。 request:当客户 发送请求时,容器创建对象,用来封装请求数据,同时会创建ServletResponse对象来封装响应数据。访问结束请求时销毁。 监听器是servlet定义的一种特殊类。监听域对象的创建销毁以及属性变化的事件。
查看全部 -
查看全部
-
查看全部
-
监听器总结:
一、监听器分类
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为SerlvetConext,HttpSession和ServletRequest这三个域对象。
Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:
1>监听三个域对象创建和销毁的事件监听器
2>监听域对象中属性的增加和删除的事件监听器
3>监听绑定到HttpSession域中的某个对象的状态的时间监听器。
a、如三个域对象的创建与销毁方法签名:
ServletRequestListener有以下两个方法
void requestDestroyed(ServletRequestEvent sre)
void requestInitialized(ServletRequestEvent sre)
HttpSessionListener有以下两个方法
void sessionCreated(HttpSessionEvent se)
void sessionDestroyed(HttpSessionEvent se)
ServletContextListener
void contextDestroyed(ServletContextEvent sce)
void contextInitialized(ServletContextEvent sce)
b、三个类型对象域中属性增、删、改的监听器(3个)
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
c、感知型监听器(2个):监听自己何时被帮到session上,何时解绑;何时被钝化,何时被活化(序列化到某个存储设置中)。
注意:这种监听器不需要注册。某个javabean实现这些接口后就可以监听何时被绑定、解绑或被激活或钝化。
HttpSessionBindingListener:实现该接口的类,能检测自己何时被Httpsession绑定和解绑
HttpSessionActivationListener:实现该接口的类(要求些javabean必须是实现了Serializable接口的),能监测自己何时随着HttpSession一起激活和钝化。查看全部 -
@统计在线用户及人数——(下)
@MyServletRequestListener.java
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
private ArrayList<User> userList;//在线用户List
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
userList = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");
if(userList==null)
userList = new ArrayList<User>();
HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
String sessionIdString = request.getSession().getId();
if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){
User user = new User();
user.setSessionIdString(sessionIdString);
user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
user.setIpString(request.getRemoteAddr());
userList.add(user);
}
arg0.getServletContext().setAttribute("userList", userList);
}
}查看全部 -
@统计在线用户及人数——(中)
@MyHttpSessionListener.java
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
private int userNumber = 0;
@Override
public void sessionCreated(HttpSessionEvent arg0) {
userNumber++;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
userNumber--;
arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
ArrayList<User> userList = null;//在线用户List
userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");
if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){
userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));
}
}
}查看全部 -
@统计在线用户及人数——(上)
@index.jsp
当前在线用户人数:${userNumber}
<hr>
<%
ArrayList<User> userList = (ArrayList<User>) request.getServletContext().getAttribute("userList");
if (userList != null) {
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
%>
IP:<%=user.getIpString()%>
<hr>
FirstTime:<%=user.getFirstTimeString()%>
<hr>
SessionId:<%=user.getSessionIdString()%>
<hr>
<%
}
}
%>
@SessionUtil.java
public class SessionUtil {
public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {
for (int i = 0; i < userList.size(); i++) {
User user = userList.get(i);
if (user.getSessionIdString().equals(sessionIdString)) {
return user;
}
}
return null;
}
}
@User.java
public class User {
private String sessionIdString;
private String ipString;
private String firstTimeString;
//setter、getter...
}
Ps:session是没有获取IP地址方法,但request有。查看全部 -
2、监听绑定到HttpSession域中的某个对象的状态的事件监听器<br>
钝化:1,由Session.StandardManager:Tocat服务器关闭或Web应用程序被重新加载时把当前内存中的Session序列化到文件或数据库中。<br>
2,由Session.Persistentmanager:除了1,中的两种,第3种可以将不常用的Session序列化到文件或数据库中。<br>
(默认Tocat两种钝化驱动:org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore)<br>
活化:服务器启动是把钝化的Seesion反序列化到服务器上
前提:先绑定session<br> 绑定就是session.setAttribute()把属性保存到Session对象当中,解除绑定:session.getAttribute()
(1)HttpSession【Binding】Listener //绑定、解除绑定<br>
a) 创建一个javabean类,实现接口【HttpSessionBindingListener,】无需到Web.xml注册<br>
b) 2个方法<br>
1) void valueBound 绑定 JSP: request.getsession.setattribute("ab",new javabean全名);<br>
2) void valueUnbound 解除绑定 JSP: request.getsession().removeAttribute("ab")<br>
(2)HttpSessionActivationListener //钝化(持久化到存储设备时)、活化(从存储设备恢复)<br>
a) 在已经创建的javabean类,实现接口HttpSessionActivationListener无需到Web.xml注册<br>
b) 2个方法<br>
1) void sessionWillPassivate 钝化 JSP: 无需写,前提javabean进行绑定了<br>
2) void sessionDidActivate 活化 JSP:request.getSession.getAttribute("ab");<br>
需要【活化必须】再继承一个接口:【Serializable】public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("valueBound:" + arg0.getName());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("valueUnbound:" + arg0.getName());
}
// 活化
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("sessionDidActivate:" + se.getSource());
}
// 钝化
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("sessionWillPassivate:" + se.getSource());
}
要想实现钝化和活化,除了需实现HttpSessionActivationListener接口还需要实现Serializable接口。查看全部 -
还好查看全部
-
servet 3.0 下监听器的用法
查看全部 -
1
查看全部 -
2
查看全部
举报