今天学习了新的知识
监听器
监听器就是监听某个对象的的状态变化的组件,是基于观察者模式设计的
Listener监听器是Servlet中一种比较特殊的类,能帮助监听web中的特定事件,如ServletContext、
HttpSession、ServletRequest 的创建和销毁;变量的创建、销毁和修改等;也可以在某些动作前后增 加处理,实现监控。servlet2.5规范中共有 8 种Listener
监听器的相关概念:
事件源:被监听的对象 ----- 三个域对象 request session servletContext
监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器
注册监听器:将监听器与事件源进行绑定
响应行为:监听器监听到事件源的状态变化时 所涉及的功能代码 ---- 程序员编写代 码
基础编程
需要监听session的创建和销毁
监听什么操作使用对应的接口
while(w!=-1){
sb.append(instr.substring(0,w));
sb.append(newstr);
instr=instr.substring(w+oldstr.length());
w=instr.indexOf(oldstr);
}
sb.append(instr);
return sb.toString().getBytes();
}
}
在web.xml中配置监听器
session对象的销毁操作
注解开发方式
监听器原理
Listener监听器就是一个实现特定接口的普通Java程序,这个程序专门用于监听一个java对象的方法调用 或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。
被监听对象A中,关联着B对象。事件源A类对外提供一个方法,用于设置监听器对象B到A类的某一实例变量中。在需要监听事件源的方法中,方法体的某一处先构造创建一个Event对象,将this即B与相关的动作封装进Event对象中,然后调用监听器B对象的doXXXX(event)方法,将事件对象传入方法实参中。
对应接口
1、ServletContextListener完成 Servlet 上下文整体监听
contextInitialized(ServletContextEvent event)监听application上下文初始化。
public class MyListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) { //session对象创建时回调
的方法
System.out.println("创建session,对应的时间对象为"+se+",对应的事件
源"+se.getSession());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) { //session对象销毁时回
调的方法
System.out.println("销毁session,对应的时间对象为"+se+",对应的事件
源"+se.getSession());
}
}
com.yan.listeners.MyListener
session.invalidate();
@WebListener
public class MyListener implements HttpSessionListener {
2contextDestroyed(ServletContextEvent event)监听application上下文关闭。
2、ServletContextAttibuteListener完成 Servlet 上下文内容监听
attibuteAdded(ServletContettributeEevent event)监听对象加入application的范围时。
atributeReplaced(ServetContexttributeEvent event)监听在application范围对象取代另一个对象
时
atributeRemoved(erleCotettributcEvent event)监听对象从 application 的范围移除时。
3、HttpSessionListener完成session整体监听
sessionCreated(HttpSessionEvent event)监听 session 初始化。
sessionDetoyed(HtpSessionEvent event)监听 session 销毁。
4、HttpSessionActivationListener完成session激活钝化状态监听
sessionDidActivate(HtpSessionEvent event)监听 session 变为有效状态。
sessionWillPassivae(HttpSessionEvent event)监听 session 变为无效状态。
5、HttpSessionAttributeListener完成session内容监听
attributeAdded(HttpSessionBindingEvent event)监听对象加入 session 中
attributeReplaced(HttpSessionBindingEvent event)监听 session 中有对象取代另一个对象时
attributeRemoved(HttpSessionBindingEvent event)监听对象从 session 中移除时。
6、HttpSessionBindingListener完成session绑定监听
valueBound(HttpSessionBindingEvent event)监听对象加入 session 中
valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。
7、ServletRequestListener完成 ServletRequest 监听
requestInitalized(ServletRequestEvent event)监听 ServletRequest 已经被初始化
requestDestroyed(ServletRequestEvent event)监听 ServletRequest 已经被销毁
8、ServletRequestAttributeListener完成 ServletRequest 内容监听
attributeAdded(ServletRequestAttributeEvent event)监听对象加入 request 中
attributeReplaced(ServletRequestAttributeEvent event)监听 request 中有对象取代另一个对象
attributeRemoved(ServletRequestAttributeEvent event)监听对象从 request 中移除时。
监听request
ServletRequestListener是用户响应监听器,用于对Request请求进行监听,包括创建和销毁
简单使用servletRequestListener来实现web浏览量的变化 在servletRequest对象被建立的时候调用初始化方法,从内存中读取servletContext对象的count属性, 而后输出历史访问量。 同时在此基础上加一重新设置servletContext对象的count属性的内容,当 servletRequest对象被销毁的时候调用销毁时的方法打印出当前浏览量,这样就简单的实现了web浏览的量的累加计数
public class ListenerTest implements ServletRequestListener {
@Override
请求监听
监听客户端请求,本地机无许登陆
特殊:绑定监听
HttpSessionBindingListener完成session绑定监听
valueBound(HttpSessionBindingEvent event)监听对象加入 session 中
valueUnBound(HttpSessionBindingEvent event)监听对象从 session 中移除。
前者为数据绑定。所谓对session进行数据绑定,就是调用session.setAttribute()把
HttpSessionBindingListener保存进session中。
后者为取消绑定
valueUnbound的触发条件是以下三种情况:
1. 执行session.invalidate()时。
2. session超时,自动销毁时。
3. 执行session.setAttribute(“onlineUserListener”, “其他对象”);或
session.removeAttribute(“onlineUserListener”);将listener从session中删除时。
因此,只要不将listener从session中删除,就可以监听到session的销毁。)
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("requestDestroyed" + "," + new Date());
System.out.println("当前访问次数:" +
arg0.getServletContext().getAttribute("count"));
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("requestInitialized" + "," + new Date());
Object count = arg0.getServletContext().getAttribute("count");
Integer cInteger = 0;
if (count != null) {
cInteger = Integer.valueOf(count.toString());
}
System.out.println("历史访问次数::" + count);
cInteger++;
arg0.getServletContext().setAttribute("count", cInteger);
}
}
public class LoginListener implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent arg0) {
}
public void requestInitialized(ServletRequestEvent arg0) {
ServletRequest req=arg0.getServletRequest();
if(req.getRemoteAddr().startsWith("127"))
req.setAttribute("isLog", new Boolean(true));
}
}
public class OnlineUserBindingListener implements HttpSessionBindingListener
{
总结
监听器Listener就是在application、session、request三个对象创建、销毁或者往其中添加修改删
除属性时自动执行代码的功能组件
Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等
Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的
启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工
作、设置一些基本的内容、比如一些参数或者是一些固定的对象等
注解开发
Servlet3之前的版本都是在web.xml中配置的,而Servlet3之后的版本则使用更为便捷的注解方式来配置。此外,不同版本的Servlet所需的Java/JDK版本也不相同,Servlet3要求JDK1.6,对应Tomcat7
@WebServlet注解定义在 Servlet 的类声明之前,用于定义 Servlet 组件。使用该注解,就无须在
web.xml 文件中对 Servlet 进行配置
name(String) 等价于
,如果没有显式指定,则为类的全限定名
value(String[]) 该属性等价于urlPatterm属性。两个属性不能同时使用
urlPatterns(String[]) 等价于 标签
loadOnStartup(int) 指定Servlet的加载顺序,等价于 标签
initParams(WebInitParam[]) 指定一组Servlet初始化参数,等价于 标签
asyncSupported(boolean) 声明Servlet是否支持异步操作模式,等价于 标签
description(String) 该Servlet的描述信息,等价于 标签
String username;
public OnlineUserBindingListener(String username){
this.username=username;
}
public void valueBound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 把用户名放入在线列表
List onlineUserList = (List)
application.getAttribute("onlineUserList");
// 第一次使用前,需要初始化
if (onlineUserList == null) {
onlineUserList = new ArrayList();
application.setAttribute("onlineUserList", onlineUserList);
}
onlineUserList.add(this.username);
}
public void valueUnbound(HttpSessionBindingEvent event) {
HttpSession session = event.getSession();
ServletContext application = session.getServletContext();
// 从在线列表中删除用户名
List onlineUserList = (List)
application.getAttribute("onlineUserList");
onlineUserList.remove(this.username);
System.out.println(this.username + "退出。");
}
}
@WebFilter注解用于声明过滤器,该注解将会在部署时被容器处理,容器根据具体的属性配置将相应的
类部署为过滤器。
filterName(String)指定过滤器的name属性,等价于
value(String[])该属性等价于urlPatterns属性。但是两者不应该同时使用
urlPattemns(String[]) 指定一组过滤器的URL匹配模式。等价于 标签
servletNames(String[]) 指定过滤器将应用于哪些 Servlet
initParams(WebInitParam]) 指定一组过滤器初始化参数,等价于 标签
asyncSupported(Boolean) 声明过滤器是否支持异步操作模式,等价于 标签
description(String) 该过滤器的描述信息,等价于 标签
@WebListener用于声明监听器,还可以用于充当给定 Web 应用上下文中各种 Web 应用事件的监听器的类。可以使用 @WebListener 来标注一个实现ServletContextListener、
ServletContextAttributeListener、ServletRequestListener、ServletRequestAttributeListener、
HttpSessionListener和HttpSessionAttributeListener 的类。@WebListener 注释有一个 value 的属
性,该属性为可选属性,用于描述监听器信息。使用该注释就不需要在 web.xml 文件中配置标签了。
@WebInitParam注解等价于 web.xml 文件中的和的子标签该注解通常不单独使用,而是配合
@WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数。
@MultipartConfig注解主要是为了从 request 对象中获取 Part 文件对象。一般用于文件上传的 Servlet上。