1.监听器
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发 生上述事件后,监听器某个方法将立即被执行。用于监听Web容器的有效期事件,因此它是由容器管理的。
2.监听器的实现:
步骤一:定义监听器实现类,实现监听器接口的所有方法;
public class TestListener implements ServletContextListener{
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
String sever=context.getServerInfo();
String pro=context.getServletContextName();
System.out.println("----应用--监听--被启动-------------"+sever+",应用名"+pro);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("----应用--监听--被销毁-------------");
}
}
步骤二:通过Annotation或在web.xml文件中声明Listener
web.xml配置
<listener><listener-class>lesson7.TestListener</listener-class></listener>
注解配置
@WebListener
举例:在线用户统计
@WebListener
public class SessionListenerTest implements HttpSessionListener {
private int count;
public SessionListenerTest() {
System.out.println("----SessionListenerTest--构造器--------------");
count=0;
}
public void sessionCreated(HttpSessionEvent se) {
System.out.println("----session--创建---------");
HttpSession sess=se.getSession();
count++;
sess.setAttribute("count", count);
System.out.println("上线了"+count);
}
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("----session--销毁---------");
count--;
se.getSession().setAttribute("count", count);
System.out.println("下线了"+count);
}
}
index.jsp
<p>当前在线人数为:${count}</p>
<a href="logout.jsp">退出</a>
logout.jsp
<% session.invalidate(); %>
<jsp:forward page="index2.jsp"></jsp:forward>
练习:
@WebListener
public class TestPractice implements ServletContextListener {
/**
* Default constructor.
*/
public TestPractice() {
// TODO Auto-generated constructor stub
}
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc=sce.getServletContext();
Enumeration<String> em=sc.getInitParameterNames();
while(em.hasMoreElements()){
String name=em.nextElement();
String val=sc.getInitParameter(name);
System.out.println("属性名"+name+",值:"+val);
}
}
}
3.请求:一次请求
@WebListener
public class RequestListenerTest implements ServletRequestListener {
public RequestListenerTest() {
// TODO Auto-generated constructor stub
}
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("请求销毁了");
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("请求来了");
}
}
4.域属性监听
接口如下:
ServletContextAttributeListener,
HttpSessionAttributeListener,
ServletRequestAttributeListener
@WebListener
public class AttributeTestListener implements ServletContextAttributeListener, HttpSessionAttributeListener, ServletRequestAttributeListener {
public AttributeTestListener() {
// TODO Auto-generated constructor stub
}
public void attributeAdded(ServletContextAttributeEvent scae) {
//application setAttribute()会调用
}
public void attributeRemoved(ServletContextAttributeEvent scae) {
// application removeAttribute()会调用
}
public void attributeRemoved(ServletRequestAttributeEvent srae) {
//request removeAttribute()会调用
}
public void attributeAdded(ServletRequestAttributeEvent srae) {
// request setAttribute()会调用
}
public void attributeReplaced(ServletRequestAttributeEvent srae) {
// request getAttribute()会调用 tom --tom11 setAttribute()会调用
}
public void attributeAdded(HttpSessionBindingEvent se) {
// session setAttribute()会调用
}
public void attributeRemoved(HttpSessionBindingEvent se) {
// session removeAttribute()会调用
}
public void attributeReplaced(HttpSessionBindingEvent se) {
// session getAttribute()会调用 tom --tom11 setAttribute()会调用
}
public void attributeReplaced(ServletContextAttributeEvent scae) {
// application getAttribute()会调用 tom --tom11 setAttribute()会调用
}
}