做过Swing或者AWT图像界面Java程序开发的话,应该对Listener与Event非常熟悉。Swing或者AWT中通过Listener与Event来处理事件,如鼠标事件、键盘事件等。先实现一个Listener接口,然后通过addListener()方法把Listener绑定到某个控件上,单机按钮时就会调用Listener的相应方法,并传回一个Event对象。
JavaWeb程序也一样,使用Listener与Event完成相应事件的处理。使用Listener不需要关注该类事件是怎样触发的或者怎么调用相应的Listener,只要记住该类事件触发时一定会调用相应的Listener。遵循Servlet规范的服务器完成了相应的工作。开发者只要在Listener里编写相关代码就OK了。
ServletRequestListener用于监听Request的创建与销毁。用户每次请求Request都会执行requestInitialized()方法,Request处理完毕自动销毁前执行requestDestroyed()方法。
需要注意的是如果一个页面内含有多个图片等元素,则请求一次页面可能会触发多次Request事件。
HttpSessionListener用于监听Session的创建与销毁。创建Session时执行sessionCreated()方法,销毁Session或Session超时时执行sessionDestroyed()方法。该Listener可用于收集在线者信息。
ServletContextListener用于监听ServletContext的创建与销毁。服务器启动或者部署Web应用程序时执行contextInitialized()方法,服务器关闭或关闭Web应用程序时执行contextDestroyed()方法。该Listener可用于启动时获取web.xml文件中配置的初始化参数。
package app.java.listener1;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* 用于测试HttpSessionListener监听器.
* * 实现HttpSessionListener接口.
* * 重写该接口提供的所有方法.
* @author JYL
*/
public class HttpSessionListenerTest implements HttpSessionListener,ServletRequestListener,ServletContextListener {
/**
* sessionCreated(HttpSessionEvent arg0)
* * 该方法用于监听Session对象的创建.
* * 问题:应该是在Session对象创建之前还是之后被调用?后.
* * 作用:可以实现必要的初始化工作.
*/
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("我的Session对象终于被创建啦。。。");
/*
*
* HttpSessionEvent事件对象:
* * 获取对应的Request对象.
* * 获取对应的ServletContext对象.
*/
}
/**
* sessionDestroyed(HttpSessionEvent arg0)
* * 该方法用于监听Session对象的销毁.
* * 问题:应该是在Session对象销毁之前还是之后被调用?前.
* * 作用:可以实现必要的资源释放工作.
*/
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("我的Session对象离我而去啦。。。");
}
public void contextDestroyed(ServletContextEvent arg0) {
}
public void contextInitialized(ServletContextEvent arg0) {
}
public void requestDestroyed(ServletRequestEvent arg0) {
}
public void requestInitialized(ServletRequestEvent arg0) {
}
}
Test:jsp:csdf
<%
HttpSession mysession = request.getSession();
mysession.invalidate();
%>
在web.xml中配置listener:
3.创建JavaBean,用于绑定到Session中.
package app.java.listener4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//往session中防止内容
public class SessionServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
User user = new User();
user.setId(1);
user.setName("zhangwuji");
user.setJob("jiaozhu");
//1 获取或创建Session对象
HttpSession session = request.getSession();
//2 向Session对象设置属性内容
session.setAttribute("user", user);
//3 将session中的内容响应到页面中
response.setContentType("text/html;charset=utf-8");
response.getWriter().println("成功地向Session放置了内容.");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package app.java.listener4;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//将session中的内容取出来
public class GetSessionServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User)session.getAttribute("user");
System.out.println(user);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
User.java:
package app.java.listener4;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
/**
* 定义一个User的JavaBean.
*
* @author JYL
*/
public class User implements HttpSessionActivationListener,Serializable {
private int id;
private String name;
private String job;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", job=" + job + "]";
}
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("Session成功地从火星回来啦。。。");
}
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("Session成功地逃离地球啦。。。");
}
}
xml: