今天学习了新的知识
监听器
监听器就是监听某个对象的的状态变化的组件,是基于观察者模式设计的
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
{
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)
等价于
-
name>
,
如果没有显式指定,则为类的全限定名
value(String[])
该属性等价于
urlPatterm
属性。两个属性不能同时使用
urlPatterns(String[])
等价于
标签
loadOnStartup(int)
指定
Servlet
的加载顺序,等价于
-
on
-
startup>
标签
initParams(WebInitParam[])
指定一组
Servlet
初始化参数,等价于
-
param>
标签
asyncSupported(boolean)
声明
Servlet
是否支持异步操作模式,等价于
-
suppored>
标签
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
属性,等价于
-
name>
value(String[])
该属性等价于
urlPatterns
属性。但是两者不应该同时使用
urlPattemns(String[])
指定一组过滤器的
URL
匹配模式。等价于
-
patterm>
标签
servletNames(String[])
指定过滤器将应用于哪些
Servlet
initParams(WebInitParam])
指定一组过滤器初始化参数,等价于
-
param>
标签
asyncSupported(Boolean)
声明过滤器是否支持异步操作模式,等价于
-
supported>
标签
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上。