web开发事件编程
web开发事件编程三要素:
事件源: ServletContext 、ServletRequest、HttpSession
事件:
(监听以上三个对象的 创建,销毁和 操作属性的行为,来触发方法)
对象创建或销毁:ServletContextEvent、ServletRequestEvent、 HttpSessionEvent
操作属性: ServletContextAttributeEvent、ServletRequestAttributeEvent、 HttpSessionBindingEvent
事件监听器: ServletContextListener 、 ServletRequestListener......
web开发监听器: 开发者在web开发的过程中,会频繁使用到三个对象。ServletContext、ServletRequest、HttpSession。在创建或销毁这些对象时,或者对这些对象进行属性操作时,触发一些事件,就可以使用web监听器去监听这些事件。
事件源 | web事件对象 | web事件监听器 |
ServletContext对象 | ServletContextEvent 创建或销毁对象时触发 | ServletContextListener |
ServletContext属性 | ServletContextAttributeEvent 属性操作(增加属性,修改属性,删除属性) | ServletContextAttributeListener |
ServletRequest对象 | ServletRequestEvent 创建或销毁对象时触发 | ServletRequestListener |
ServletRequest属性 | ServletRequestAttributeEvent 属性操作(增加属性,修改属性,删除属性) | ServletRequestAttributeListener |
HttpSession对象 | HttpSessionEvent 创建或销毁对象时触发 | HttpSessionListener |
HttpSession属性 | HttpSessionBindingEvent 属性操作(增加属性,修改属性,删除属性) | HttpSessionAttributeLisener |
ServletContextListener
ServletContextListener主要用于监听ServetContext对象的创建和销毁。
ServletContext对象:代表整个web应用。
创建:web应用加载
销毁:web应用重新加载或web服务停止。
步骤:
1)创建java类,实现ServletContextListener接口,实现其中的方法
2)监听器要交给tomcat服务器运行。
需要在web.xml文件中进行配置
<!-- 注册监听器 -->
<listener>
<!-- 监听器程序全名 -->
<listener-class>com.joinlabs.a_context.MyContextListener</listener-class>
</listener>
ServletContextAttributeListener
ServletContextAttributeListener用于监听ServletContext对象的属性操作(增加属性,修改属性,删除属性)
增加属性: setAttribute(name,Object); 第一次就是增加属性
修改属性: setAttribute(name,Object); 如果前面有增加了同名的属性,则修改。
删除属性: removeAttribute(name);
/**
* ServletContext对象
* 应用: 项目需要初始化工作和清理工作
* 需求: 在项目启动时,创建学生表;项目停止时,把学生表删除。
*
*/
public class MyContextListener implements ServletContextListener,ServletContextAttributeListener{
StudentDao stuDao = new StudentDao();
/**
* 用于监听ServletContext对象的创建。ServletContext对象创建时调用次方法
*/
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象创建了");
//创建学生表
stuDao.initTable();
System.out.println("表创建成功!");
}
/**
* 用于监听ServletContext对象的销毁。ServletContext对象销毁时调用次方法
*/
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象销毁了");
//删除学生表
stuDao.dropTable();
System.out.println("表删除成功!");
}
/******************属性相关的**********************/ /**
* 属性添加
*/
public void attributeAdded(ServletContextAttributeEvent scab) {
//1.得到属性名称
String name = scab.getName();
//2.得到属性值
Object value = scab.getValue();
System.out.println("属性添加:"+name+"="+value);
}
/**
* 属性修改
*/
public void attributeReplaced(ServletContextAttributeEvent scab) {
//1.得到属性名称
String name = scab.getName();
//2.得到修改前的属性值
//Object value = scab.getValue();
//2.得到修改后的属性值
ServletContext context = scab.getServletContext();
Object value = context.getAttribute(name);
System.out.println("属性修改:"+name+"="+value);
}
/**
* 属性删除
*/
public void attributeRemoved(ServletContextAttributeEvent scab) {
//1.得到属性名称
String name = scab.getName();
//2.得到属性值
Object value = scab.getValue();
System.out.println("属性删除:"+name+"="+value);
}
}
ServletRequestListener
ServletRequestListener用于监听ServletRequest对象的创建和销毁。
ServletRequest对象:封装请求信息
创建:每次发出请求时
销毁:请求完毕后
ServletRequestAttributeListener
ServletRequestAttributeListener用于监听ServletRequest属性操作
增加属性: setAttribute(name,Object); 第一次就是增加属性
修改属性: setAttribute(name,Object); 如果前面有增加了同名的属性,则修改。
删除属性: removeAttribute(name);
/**
* ServletRequest对象
* 应用: 得到请求相关信息
*/
public class MyRequestListener implements ServletRequestListener,ServletRequestAttributeListener{
/**
* 用于监听ServletRequest对象的创建。ServletRequest对象创建时调用次方法
*/
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request对象创建了"+sre.getServletRequest());
//得到客户的IP地址
HttpServletRequest request = (HttpServletRequest)sre.getServletRequest();
String ip = request.getRemoteHost();
//把ip地址放入到session域中
HttpSession session = request.getSession();
session.setAttribute("ip", ip);
}
*
* /**
* 用于监听ServletRequest对象的销毁。ServletRequest对象销毁时调用次方法
*/
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("request对象销毁了"+sre.getServletRequest());
}
/************属性相关的*****************/
/**
* 属性添加
*/
public void attributeAdded(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object value = srae.getValue();
System.out.println("属性增加: "+name+"="+value);
}
/**
* 属性修改
*/
public void attributeReplaced(ServletRequestAttributeEvent srae) {
String name = srae.getName();
//修改后的值
ServletRequest request = srae.getServletRequest();
Object value = request.getAttribute(name);
System.out.println("属性修改: "+name+"="+value);
}
/**
* 属性删除
*/
public void attributeRemoved(ServletRequestAttributeEvent srae) {
String name = srae.getName();
Object value = srae.getValue();
System.out.println("属性删除: "+name+"="+value);
}
}
HttpSessionListener
HttpSessionListener用于监听HttpSession对象的创建和销毁
HttpSession对象:
创建:调用request.getSession()方法
销毁:
1)默认情况下,30分钟服务器自动回收
2)设置有效时长: setMaxActiveInterval(秒);
3)web.xml配置全局的过期时间
<session-config>
<session-timeout>分钟</session-timeout>
</session-config>
4)手动销毁: invalidate()方法
案例: 粗略统计在线访客人数
/**
* HttpSession对象
*/
public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{
int count = 0;
/**
* 监听HttpSession对象的创建。
*/
public void sessionCreated(HttpSessionEvent se) {
System.out.println("session对象创建了"+se.getSession());
/**
* 使用代码锁避免线程并发问题
*/
synchronized (MySessionListener.class) {
/**
* 访客人数+1
*/
count++;
System.out.println("当前访客人数:"+count);
//保存到context域中
ServletContext context = se.getSession().getServletContext();
context.setAttribute("visit", count);
}
}
/**
* 监听HttpSession对象的销毁
*/
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("session对象销毁了"+se.getSession());
synchronized (MySessionListener.class) {
/**
* 访客人数-1
*/
count--;
//保存到context域中
ServletContext context = se.getSession().getServletContext();
context.setAttribute("visit", count);
}
}
/**************属性相关的******************/
/**
* 属性添加
*/
public void attributeAdded(HttpSessionBindingEvent se) {
String name = se.getName();
Object value = se.getValue();
System.out.println("属性增加: "+name+"="+value);
}
/**
* 属性修改
*/
public void attributeReplaced(HttpSessionBindingEvent se) {
String name = se.getName();
//得到修改后的值
HttpSession session = se.getSession();
Object value = session.getAttribute(name);
System.out.println("属性修改: "+name+"="+value);
}
/**
* 属性删除
*/
public void attributeRemoved(HttpSessionBindingEvent se) {
String name = se.getName();
Object value = se.getValue();
System.out.println("属性删除: "+name+"="+value);
}
}
HttpSessionAttributeLisener
HttpSessionAttributeLisener用于监听HttpSession的属性操作
增加属性: setAttribute(name,Object); 第一次就是增加属性
修改属性: setAttribute(name,Object); 如果前面有增加了同名的属性,则修改。
删除属性: removeAttribute(name);
案例:显示当前网站的登录用户信息
需求:
1)提供用户登录的功能,提供注销功能。
2)显示当前网站的所有登录用户信息
3)管理员可以踢除指定的登录用