JavaWeb监听器
Posted xjs1874704478
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb监听器相关的知识,希望对你有一定的参考价值。
三大组件:
Servlet
Listener
Filter
Listener:监听器
* 它是一个接口,内容由我们来实现;
* 它需要注册,例如注册在按钮上!
* 监听器中的方法,会在特殊事件发生时被调用!
观察者:
* 事件源
>小偷
* 事件
>偷东西
* 监听器
>警察
>监听器中的方法:抓捕
JavaWeb中的监听器
* 事件源:三大域!
>ServletContext
<生命周期监听:ServletContextListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
<>void contextInitialized(ServletContextEvent sce):创建ServletContext时
<>void contextDestroyed(ServletContextEvent sce):销毁ServletContext时
<属性监听:ServletContextAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;
<> void attributeAdded(ServletContextAttributeEvent event):添加属性时
<> void attributeReplaced(ServletContextAttributeEvent event):替换属性时
<> void attributeRemoved(ServletContextAttributeEvent event):移除属性时
>HttpSession
<生命周期监听:HttpSessionListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
<>void sessionCreated(HttpSessionEvent se):创建session时
<>void sessionDestroyed(HttpSessionEvent se):销毁session时
<属性监听:HttpSessionAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;
<> void attributeAdded(HttpSessionBindingEvent event):添加属性时
<> void attributeReplaced(HttpSessionBindingEvent event):替换属性时
<> void attributeRemoved(HttpSessionBindingEvent event):移除属性时
>ServletRequest
<生命周期监听:ServletRequestListener,它有两个方法,一个在出生时调用,一个在死亡时调用;
<>void requestInitialized(ServletRequestEvent sre):创建request时
<>void requesDestroyed(ServletRequestEvent sre):销毁request时
<属性监听:ServletRequestAttributeListener,它有三个方法,一个在添加属性时调用,一个在替换属性时调用,最后一个是在移除属性时调用;
<> void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
<> void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
<> void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时
JavaWeb中完成编写监听器:
* 写一个监听器类:要求必须实现某个监听器接口;
package com.xjs.web.listener; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * ServletContext生死监听 * @author hp * *可以在这个监听器存放一些在Tomcat启动时就要完成的代码! */ public class AListener implements ServletContextListener @Override public void contextDestroyed(ServletContextEvent arg0) System.out.println("哇,我要挂也!"); @Override public void contextInitialized(ServletContextEvent arg0) System.out.println("哇,我来也!");
* 注册,是在web.xml中配置来完成注册!
<listener> <listener-class>com.xjs.web.listener.AListener</listener-class> </listener>
事件对象:
* ServletContextEvent:其方法ServletContext getServletContext()
* HttpSessionEvent:其方法HttpSession getSession()
* ServletRequestEvent:两个方法1.ServletRequest getServletRequest() 2.ServletContext getServletContext()
监听器之属性监听器示例:
写一个BListener实现ServletContextAttributeListener接口:
package com.xjs.web.listener; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; import javax.servlet.annotation.WebListener; public class BListener implements ServletContextAttributeListener public void attributeAdded(ServletContextAttributeEvent scab) System.out.println("您向application中添加了一个名为"+scab.getName()+",值为:"+scab.getValue()+"的属性" ); public void attributeReplaced(ServletContextAttributeEvent scab) //返回的是旧值 System.out.println(scab.getName()+"="+scab.getValue()); //返回的新值 System.out.println(scab.getServletContext().getAttribute("金泰妍")); public void attributeRemoved(ServletContextAttributeEvent scab) //最后一次相见 System.out.println(scab.getName()+"="+scab.getValue());
index.jsp:向application域中保存----可以在BListener这个属性监听器中获取其键值。
<% application.setAttribute("金泰妍", "taeyeon"); %>
replace.jsp:替换原有属性
<% application.setAttribute("金泰妍", "抽抽"); %>
remove.jsp:移除原有属性
<% application.removeAttribute("金泰妍"); %>
感知监听(都与HttpSession相关)
* 它是用来添加到Javabean上,而不是添加到三大域上!
HttpSessionBindingListener:添加到JavaBean上,JavaBean就知道自己是否添加到session中了。
session的序列化(关闭服务器后,再次开启,还有获取到session中的值)
如果在程序中向session中保存了东西,在stop了Tomcat后,会在Tomcat的目录下的work目录下对应的项目中会生成一个SESSIONS.ser文件(是保存的session)。当再次run服务器时,会加载此文件,然后该项目下的SESSIONS.ser文件消失。-------这样就会产生了session的死而复生。
比如:某些用户在某网站上正在浏览信息,突然该网站的服务器关闭,重启。用户短暂掉线,服务器端会把用户的信息保存到session中,然后保存在该项目下的文件中,服务器正常工作后,加载这些文件,不至于登录的用户信息丢失。
注:在Tomcat的目录下的conf目录的context.xml文件中
加上这句话可以废掉session序列化
<!--
废掉session序列化的
<Manager pathname="" />
-->
session的钝化和活化
钝化session:Tomcat会把长时间不被使用的session,钝化session对象。就是把session通过序列化的方式保存到硬盘文件中。
活化session:当用户在使用session时,Tomcat会把钝化的对象在活化session。就是把硬盘文件中的session在反序列化回内存。
当session被Tomcat钝化时,session中存储的对象也被钝化,当session被活化时,也会把session中存储的对象活化。
比如:在网上,用户过于太多,导致session个数猛增,客户没有下线,session增多,从而导致内存压力,服务器会把长时间没人访问的session放在硬盘上,当你在访问该session时,在从硬盘上读取到内存中,然后使用。
配置:
1. 把这个写到Tomcat的web.xml中,所有的项目都生效。2.把它写到具体的项目中,只对该项目生效。
<!-- PersistentManager:持久的管理
maxIdleSwap:最大的空闲时间(分钟)
-->
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mysession"/>
</Manager>
</Context>
已钝化的session
访问该session时,该session活化,加载到内存,该文件也不会消失,它会一直保存在硬盘上。
HttpSessionActivationListener(监听器)和Serializable接口
已经设置了session的最大不活动时间为1分钟。
创建User类实现这两个接口:
package com.xjs; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; public class User implements HttpSessionActivationListener,Serializable /** * 钝化时调用 */ @Override public void sessionWillPassivate(HttpSessionEvent arg0) System.out.println("我同session钝化了,从内存到硬盘"); /** * 活化时调用 */ @Override public void sessionDidActivate(HttpSessionEvent arg0) System.out.println("我同session活化了,从硬盘到内存");
a.jsp:向session中保存一个User对象
<body> <% session.setAttribute("xxx", new User()); %> </body>
b.jsp:从session中取出User对象
<body> <% out.print(session.getAttribute("xxx")); %> </body>
先访问a.jsp后,向session保存User;等一分钟,User对象同session一同钝化。再访问b.jsp,可以得到User对象。
网页的国际化
以上是关于JavaWeb监听器的主要内容,如果未能解决你的问题,请参考以下文章
05-JavaWeb的三大组件:小程序Servlet+过滤器Filter+监听器Listener