20、Listener和Filter

http://localhost:8080/listener/  <== > http://localhost:8080/listener/index.jsp,默认访问index.jsp
session的钝化与活化:就是说服务器被很多的session访问,内存不足,为了更好的运行,只好把一部分比较长时间没有变动的session从内存中放到了硬盘,等该session的用户重新使用的时候,那么该session就会自动的被调用到内存中,用户在整个过程中发觉不出来session又被调动的影响。
 

一、Listener监听器(用的少

Javaweb开发中的监听器,是用于监听web常见对象(HttpServletRequest HttpSession ServletContext )
(1)监听它们的创建与销毁
(2)属性变化(set/get)
(3)session绑定javaBean

1、监听机制

(1)事件 就是一个事情
(2)事件源 产生这个事情的源头
(3)监听器 用于监听指定的事件的对象
注册监听 要想让监听器可以监听到事件产生,必须对其进行注册。

2、Javaweb开发中常见监听器

2.1、监听域对象的创建与销毁
(1) 监听HttpServletRequest创建与销毁 ServletRequestListener
(2)监听HttpSession创建与销毁 HttpSessionListener
(3)监听ServletContext创建与销毁 ServletContextListener
 
2.2、监听域对象的属性变化
(1)监听ServletContext属性变化 ServletContextAttributeListener
(2)监听HttpSession属性变化 HttpSessionAttributeListener
(3)监听HttpServletRequest属性变化 ServletRequestAttributeListener
 
2.3、监听session绑定javaBean
(1)用于监听javaBean对象是否绑定到了session域 HttpSessionBindingListener
(2)用于监听javaBean对象的活化与钝化(服务器会做) HttpSessionActivationListener
 

3、监听器的使用

创建监听器:

1.创建一个类,实现指定的监听器接口
2.重写接口中的方法
3.在web.xml文件中对监听器进行注册
1 <listener>
2 <listener-class>cn.guojie.listener.MyServletRequestListener</listener-class>  // 全类名
3 </listener>

3.1域对象创建与销毁

1.ServletContext对象的创建与销毁
这个对象是在服务器启动时创建的,在服务器关闭时销毁的。
 
2.HttpSession对象的创建与销毁
直接访问一个jsp页面时,会创建session,因为我们默认情况下是可以在jsp页面中直接使用session内置对象的。
HttpSession session = request.getSession();
Session销毁
(1)默认超时 30分钟
(2)关闭服务器
(3)invalidate()方法
(4)setMaxInactiveInterval(int interval) 可以设置超时时间
 
3.HttpServletRequest创建与销毁
Request对象是发送请求服务器就会创建它,当响应产生时,request对象就会销毁。
 

3.2 Request域对象中属性变化

在java的监听机制中,它的监听器中的方法都是有参数的,参数就是事件对象,而我们可以通过事件对象直接获取事件源。

3.3session绑定javaBean

1.javaBean对象自动感知被绑定到session中.
HttpSessionBindingListener 这个接口是由javaBean实现的,并且不需要在web.xml文件中注册.
 
2.javabean对象可以活化或钝化到session中。
HttpSessionActivationListener如果javaBean实现了这个接口,那么当我们正常关闭服务器时,session中的javaBean对象就会被钝化到我们指定的文件中。
当下一次在启动服务器,因为我们已经将对象写入到文件中,这时就会自动将javaBean对象活化到session中
需要序列化,实现序列化接口
我们还需要个context.xml文件来配置钝化时存储的文件
在meta-inf目录下创建一个context.xml文件
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>
 

二、Filter过滤器(重要)

Javaweb中的过滤器可以拦截所有访问web资源的请求或响应操作。

1、Filter的使用

1.1、使用步骤
(1)创建一个类实现Filter接口
(2)重写接口中方法  doFilter方法是真正过滤的。
(3)在web.xml文件中配置
注意:在Filter的doFilter方法内如果没有执行 chain.doFilter(request,response)(放行)
那么资源是不会被访问到的。
web.xml中<url-pattern>/*<url-pattern>拦截所有
 
1.2 FilterChain
FilterChain 是 servlet 容器为开发人员提供的对象,它提供了对某一资源的已过滤请求调用链的视图。过滤器使用 FilterChain 调用链中的下一个过滤器,如果调用的过滤器是链中的最后一个过滤器,则调用链末尾的资源。
 
只要多个Filter对同一个资源进行拦截就可以形成Filter链
Filter的执行顺序由<filter-mapping>来确定
 1 public class MyFilter implements Filter {
 2 
 3     public void init(FilterConfig filterConfig) throws ServletException {
 4         
 5     }
 6     
 7     public void doFilter(ServletRequest request, ServletResponse response,
 8             FilterChain chain) throws IOException, ServletException {
 9         // TODO Auto-generated method stub
10         System.out.println("开始拦截");
11         chain.doFilter(request, response);  // 放行
12         System.out.println("拦截结束");
13     }
14 
15     public void destroy() {
16 
17     }
18 }
1 <filter>
2     <filter-name>MyFilter</filter-name>
3     <filter-class>cn.guojie.filter.MyFilter</filter-class>
4 </filter>
5 
6 <filter-mapping>
7     <filter-name>MyFilter</filter-name>
8     <url-pattern>/*</url-pattern>  <!-- 全部拦截 -->
9 </filter-mapping>

 

1.3 Filter生命周期(与Servlet一样)
Servlet生命周期:
实例化 --> 初始化 --> 服务 --> 销毁
(1)当服务器启动就会创建Filter对象,并调用init方法,只调用一次.
(2)当访问资源时,路径与Filter的拦截路径匹配,会执行Filter中的doFilter方法,这个方法是真正拦截操作的方法.
(3)当服务器关闭时,会调用Filter的destroy方法来进行销毁操作
 
1.4 FilterConfig
在Filter的init方法上有一个参数,类型就是FilterConfig.
FilterConfig它是Filter的配置对象,它可以完成下列功能
(1)获取Filtr名称
(2)获取Filter初始化参数
(3)获取ServletContext对象。
1 getFilterName();
2 getInitParameter(String name);  // 获取初始化参数
3 getInitParameterNames();
4 getServletContext();

 

 

 
 
 
 
 
 
posted @ 2016-12-12 23:29  十年英雄梦  阅读(209)  评论(0编辑  收藏  举报