标签:
之前学习了很多涉及servlet的内容,本小结我们说一下监听器,说起监听器,编过桌面程序和手机App的都不陌生,常见的套路都是拖一个控件,然后给它绑定一个监听器,即可以对该对象的事件进行监听以便发生响应,从本质上来说这些都是观察者模式的具体实现,在web程序中的监听器也不例外。
在Java Web程序中使用监听器可以通过以下两种方法:
@WebListener public class CustomListener implements Listener { }
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
在Java Web程序中,主要是对ServletContext、HttpSession和ServletRequest三个对象提供支持。
@WebListener public class MyServletListener implements ServletContextListener, ServletContextAttributeListener { public void contextInitialized(ServletContextEvent sce) { System.out.println("ServletContextEvent source: " + sce.getSource()); System.out.println("context created"); } public void contextDestroyed(ServletContextEvent sce) { System.out.println("ServletContextEvent source: " + sce.getSource()); System.out.println("context destroyed"); } public void attributeAdded(ServletContextAttributeEvent event) { System.out.println("ServletContextAttributeEvent source: " + event.getSource()); System.out.println("attribute added: " + event.getName() + "--" + event.getValue()); } public void attributeRemoved(ServletContextAttributeEvent event) { System.out.println("ServletContextAttributeEvent source: " + event.getSource()); System.out.println("attribute removed: "+ event.getName() + "--" + event.getValue()); } public void attributeReplaced(ServletContextAttributeEvent event) { System.out.println("ServletContextAttributeEvent source: " + event.getSource()); System.out.println("attribute replaced: "+ event.getName() + "--" + event.getValue()); } }
ServletContext context = req.getServletContext(); context.setAttribute("country", "zn"); context.setAttribute("country", "en"); context.removeAttribute("country");
@WebListener public class MyHttpSessionListener implements HttpSessionListener, HttpSessionAttributeListener { private Long startTime; public void attributeAdded(HttpSessionBindingEvent event) { startTime = (Long) event.getSession().getAttribute("startTime"); System.out.println("HttpSessionBindingEvent source: " + event.getSource()); System.out.println("add attribute: " + event.getName() + "--" + event.getValue()); } public void attributeRemoved(HttpSessionBindingEvent event) { System.out.println("HttpSessionBindingEvent source: " + event.getSource()); System.out.println("remove attribute: " + event.getName() + "--" + event.getValue()); } public void attributeReplaced(HttpSessionBindingEvent event) { System.out.println("HttpSessionBindingEvent source: " + event.getSource()); System.out.println("replace attribute: " + event.getName() + "--" + event.getValue()); } public void sessionCreated(HttpSessionEvent se) { System.out.println("HttpSessionEvent source: " + se.getSource()); System.out.println("session id: " + se.getSession().getId()); System.out.println("session create"); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println("HttpSessionEvent source: " + se.getSource()); System.out.println("session id: " + se.getSession().getId()); System.out.println("active time: " + (System.nanoTime() - startTime)); System.out.println("session destroy"); } }
@WebServlet(name="myHttpSessionServlet", urlPatterns="/myHttpSessionServlet", loadOnStartup=1) public class MyHttpSessionServlet extends HttpServlet { private static final long serialVersionUID = 5687825632187950599L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.setAttribute("startTime", System.nanoTime()); session.setAttribute("visitTimes", 0); session.setAttribute("visitTimes", 1); session.removeAttribute("visitTimes"); session.setMaxInactiveInterval(10); resp.getWriter().write("session listene demo"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
HttpSession session = req.getSession(); session.setAttribute("startTime", System.nanoTime()); session.setAttribute("visitTimes", 0); session.setAttribute("visitTimes", 1); session.removeAttribute("visitTimes"); ObjectOutputStream output =new ObjectOutputStream(new FileOutputStream("C:\\demo")); output.writeObject(session);上述是错误的使用办法,不能序列化HttpSession,此处的序列化只是将Session实例中的信息转换成能在网络中传输的数据形式即可,含义范围要大于Java中的序列化概念,一般的理解是将对象转化成字符串。
public class Person implements Serializable, HttpSessionBindingListener{ private static final long serialVersionUID = -4972586177179694554L; private String name; private Integer age; public Person(){} public Person(String name, Integer age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } public void valueBound(HttpSessionBindingEvent event) { System.out.println("person bound"); } public void valueUnbound(HttpSessionBindingEvent event) { System.out.println("person unbound"); }向doGet()方法中的Session中添加属性:
session.setAttribute("person", new Person("lmy", 23)); session.setMaxInactiveInterval(10);发出请求之后,输出如下:
HttpSessionBindingEvent source: org.apache.catalina.session.StandardSessionFacade@fdfaab5 person bound10秒之后Session失效,输出:
HttpSessionBindingEvent source: org.apache.catalina.session.StandardSessionFacade@fdfaab5 person unbound
@WebListener public class MyServletRequestListener implements ServletRequestListener, ServletRequestAttributeListener { public void attributeAdded(ServletRequestAttributeEvent srae) { System.out.println("ServletRequestAttributeEvent source: " + srae.getSource()); System.out.println("request attribute added: " + srae.getName() + "--" + srae.getValue()); } public void attributeRemoved(ServletRequestAttributeEvent srae) { System.out.println("ServletRequestAttributeEvent source: " + srae.getSource()); System.out.println("request attribute removed: " + srae.getName() + "--" + srae.getValue()); } public void attributeReplaced(ServletRequestAttributeEvent srae) { System.out.println("ServletRequestAttributeEvent source: " + srae.getSource()); System.out.println("request attribute replaced: " + srae.getName() + "--" + srae.getValue()); } public void requestDestroyed(ServletRequestEvent sre) { System.out.println("ServletRequestEvent source: " + sre.getSource()); System.out.println("request destroy"); } public void requestInitialized(ServletRequestEvent sre) { System.out.println("ServletRequestEvent source: " + sre.getSource()); System.out.println("request init"); } }
</pre><pre name="code" class="java">@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("MyHttpServlet1 request work"); <span style="white-space:pre"> </span>System.out.println("current thread :" + Thread.currentThread().getName()); }
</pre><div>MyHttpServlet类接受请求代码:</div><pre name="code" class="java"><pre name="code" class="java">@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("MyHttpServlet request work"); <span style="white-space:pre"> </span>System.out.println("current thread :" + Thread.currentThread().getName()); }向MyHttpServlet发送一个请求输出如下:
req.setAttribute("area", "zh"); req.setAttribute("area", "ts"); req.removeAttribute("area");输出如下:
Java Web基础知识之Listener:监控Servlet的每个动作
标签:
原文地址:http://blog.csdn.net/lmy86263/article/details/51187318