三大组件:
Servlet
Listener
Filter
Listener:监听器
* 它是一个接口,内容由我们来实现;
* 它需要注册,例如注册在按钮上!
* 监听器中的方法,会在特殊事件发生时被调用!
观察者:
* 事件源
>小偷
* 事件
>偷东西
* 监听器
>警察
>监听器中的方法:抓捕
JavaWeb中的监听器
* 事件源:三大域!
>ServletContext
<>void contextInitialized(ServletContextEvent sce):创建ServletContext时
<>void contextDestroyed(ServletContextEvent sce):销毁ServletContext时
<> void attributeAdded(ServletContextAttributeEvent event):添加属性时
<> void attributeReplaced(ServletContextAttributeEvent event):替换属性时
<> void attributeRemoved(ServletContextAttributeEvent event):移除属性时
>HttpSession
<>void sessionCreated(HttpSessionEvent se):创建session时
<>void sessionDestroyed(HttpSessionEvent se):销毁session时
<> void attributeAdded(HttpSessionBindingEvent event):添加属性时
<> void attributeReplaced(HttpSessionBindingEvent event):替换属性时
<> void attributeRemoved(HttpSessionBindingEvent event):移除属性时
>ServletRequest
<>void requestInitialized(ServletRequestEvent sre):创建request时
<>void requesDestroyed(ServletRequestEvent sre):销毁request时
<> void attributeAdded(ServletRequestAttributeEvent srae):添加属性时
<> void attributeReplaced(ServletRequestAttributeEvent srae):替换属性时
<> void attributeRemoved(ServletRequestAttributeEvent srae):移除属性时
JavaWeb中完成编写监听器:
* 写一个监听器类:要求必须实现某个监听器接口;
packagecom.xjs.web.listener;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;/*** ServletContext生死监听
*@authorhp
*
*可以在这个监听器存放一些在Tomcat启动时就要完成的代码!*/
public class AListener implementsServletContextListener {
@Overridepublic voidcontextDestroyed(ServletContextEvent arg0) {
System.out.println("哇,我要挂也!");
}
@Overridepublic voidcontextInitialized(ServletContextEvent arg0) {
System.out.println("哇,我来也!");
}
}
* 注册,是在web.xml中配置来完成注册!
com.xjs.web.listener.AListener
事件对象:
* ServletContextEvent:其方法ServletContext getServletContext()
* HttpSessionEvent:其方法HttpSession getSession()
* ServletRequestEvent:两个方法1.ServletRequest getServletRequest() 2.ServletContext getServletContext()
监听器之属性监听器示例:
写一个BListener实现ServletContextAttributeListener接口:
packagecom.xjs.web.listener;importjavax.servlet.ServletContextAttributeEvent;importjavax.servlet.ServletContextAttributeListener;importjavax.servlet.annotation.WebListener;public class BListener implementsServletContextAttributeListener {public voidattributeAdded(ServletContextAttributeEvent scab) {
System.out.println("您向application中添加了一个名为"+scab.getName()+",值为:"+scab.getValue()+"的属性");
}public voidattributeReplaced(ServletContextAttributeEvent scab) {//返回的是旧值
System.out.println(scab.getName()+"="+scab.getValue());//返回的新值
System.out.println(scab.getServletContext().getAttribute("金泰妍"));
}public voidattributeRemoved(ServletContextAttributeEvent scab) {//最后一次相见
System.out.println(scab.getName()+"="+scab.getValue());
}
}
index.jsp:向application域中保存----可以在BListener这个属性监听器中获取其键值。
replace.jsp:替换原有属性
remove.jsp:移除原有属性
感知监听(都与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的钝化和活化
钝化session:Tomcat会把长时间不被使用的session,钝化session对象。就是把session通过序列化的方式保存到硬盘文件中。
活化session:当用户在使用session时,Tomcat会把钝化的对象在活化session。就是把硬盘文件中的session在反序列化回内存。
当session被Tomcat钝化时,session中存储的对象也被钝化,当session被活化时,也会把session中存储的对象活化。
比如:在网上,用户过于太多,导致session个数猛增,客户没有下线,session增多,从而导致内存压力,服务器会把长时间没人访问的session放在硬盘上,当你在访问该session时,在从硬盘上读取到内存中,然后使用。
配置:
1. 把这个写到Tomcat的web.xml中,所有的项目都生效。2.把它写到具体的项目中,只对该项目生效。
已钝化的session
访问该session时,该session活化,加载到内存,该文件也不会消失,它会一直保存在硬盘上。
HttpSessionActivationListener(监听器)和Serializable接口
已经设置了session的最大不活动时间为1分钟。
创建User类实现这两个接口:
packagecom.xjs;importjava.io.Serializable;importjavax.servlet.http.HttpSessionActivationListener;importjavax.servlet.http.HttpSessionEvent;public class User implementsHttpSessionActivationListener,Serializable{/*** 钝化时调用*/@Overridepublic voidsessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("我同session钝化了,从内存到硬盘");
}/*** 活化时调用*/@Overridepublic voidsessionDidActivate(HttpSessionEvent arg0) {
System.out.println("我同session活化了,从硬盘到内存");
}
}
a.jsp:向session中保存一个User对象
b.jsp:从session中取出User对象
先访问a.jsp后,向session保存User;等一分钟,User对象同session一同钝化。再访问b.jsp,可以得到User对象。
网页的国际化