监听器

今天学习了新的知识 监听器
监听器就是监听某个对象的的状态变化的组件,是基于观察者模式设计的
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 ());
}
}
<listener>
<listener-class> com.yan.listeners.MyListener </listener-class>
</listener>
session . invalidate ();
@WebListener
public class MyListener implements HttpSessionListener {
2 contextDestroyed(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) 等价于 <servlet - name> , 如果没有显式指定,则为类的全限定名
value(String[]) 该属性等价于 urlPatterm 属性。两个属性不能同时使用
urlPatterns(String[]) 等价于 <urlpattern> 标签
loadOnStartup(int) 指定 Servlet 的加载顺序,等价于 <load - on - startup> 标签
initParams(WebInitParam[]) 指定一组 Servlet 初始化参数,等价于 <init - param> 标签
asyncSupported(boolean) 声明 Servlet 是否支持异步操作模式,等价于 <async - suppored> 标签
description(String) Servlet 的描述信息,等价于 <description> 标签
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 属性,等价于 <filter - name>
value(String[]) 该属性等价于 urlPatterns 属性。但是两者不应该同时使用
urlPattemns(String[]) 指定一组过滤器的 URL 匹配模式。等价于 <url - patterm> 标签
servletNames(String[]) 指定过滤器将应用于哪些 Servlet
initParams(WebInitParam]) 指定一组过滤器初始化参数,等价于 <init - param> 标签
asyncSupported(Boolean) 声明过滤器是否支持异步操作模式,等价于 <async - supported> 标签
description(String) 该过滤器的描述信息,等价于 <description> 标签
@WebListener 用于声明监听器,还可以用于充当给定 Web 应用上下文中各种 Web 应用事件的监听器的类。可以使用 @WebListener 来标注一个实现 ServletContextListener
ServletContextAttributeListener ServletRequestListener ServletRequestAttributeListener
HttpSessionListener HttpSessionAttributeListener 的类。 @WebListener 注释有一个 value 的属
性,该属性为可选属性,用于描述监听器信息。使用该注释就不需要在 web.xml 文件中配置标签了。
@WebInitParam 注解等价于 web.xml 文件中的和的子标签该注解通常不单独使用,而是配合
@WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数。
@MultipartConfig 注解主要是为了从 request 对象中获取 Part 文件对象。一般用于文件上传的 Servlet上。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值