Servlet学习之Filtering概述

前言

记得很多框架都使用了Filter,其实追根究底还是以Servlet中的Filter为基础的

大纲

  • 过滤器(Filter)概述
  • Filter的基本思想
  • Filter的配置
  • Filter开发的步骤
  • 监听器概述
  • ServletContext监听器详解
  • HttpSession监听器详解
  • ServletRequest监听器详解
  • 监听器的作用
  • 监听器的开发步骤

Filtering概述

Filtering是Servlet2.3以上版本的特性
主要内容:

  • Filtering的基本思想
  • Filtering API
  • Filtering的实现

Filtering的基本思想:将jsp,servlet,html看作资源,容器用来处理这些资源,并为资源提供服务因此,可以在处理这些资源之前或之后,通过过滤器增加一些通用功能;比如:
拦截请求头:安全认证,日志
数据转换:加密,解密
抢占特殊资源的服务:缓存
而且这些过滤器可以形成一个链


filtering API



  • 接口:javax.servlet.Filter所有起到过滤器功能的类要实现此接口
    Filter接口
    
    public void init(FilterConfig config)throws ServletException
    
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)throws IOException, ServletException
    
    public void destroy()
    

  • 接口:javax.servlet.FilterChain将各个过滤器连接起来组成过滤器链
    public void doFilter(ServletRequest request,
                         ServletResponse response)
                  throws java.io.IOException,
                         ServletException
    

  • 接口:javax.servlet.FilterConfig处理过滤器配置相关信息
    public java.lang.String getFilterName() 
    public ServletContext getServletContext()
    public java.lang.String getInitParameter(java.lang.String name)  
    public java.util.Enumeration getInitParameterNames() 
    

    Filtering配置

Web.xml中文件的配置
Filter定义:名字, Filter类
Filter映射:要处理哪类资源
<filter>
    <filter-name>charencode</filter-name>
    <filter-class>servlet.CharEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>charencode</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

CharEncodingFilter
public class CharEncodingFilter  implements Filter {
    private FilterConfig filterConfig;
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain filterChain) throws IOException,ServletException {
        System.out.println("in filter");
        request.setCharacterEncoding("gb2312");
        response.setCharacterEncoding("gb2312");
        response.setLocale(Locale.SIMPLIFIED_CHINESE);
        filterChain.doFilter(request, response);
        System.out.println("in filter");
    }
    public void destroy() {
        this.filterConfig = null;
    }
}

Servlet生命周期事件及监听器

是Servlet2.3版本后新增功能能够在不修改原有Servlet基础上,监听程序中Servlet各个对象:ServletContext、HttpSession、HttpServletRequest对象中存取数据的变化。
可以监听客户端的请求,服务器端的操作,主要包括:事件模型和监听器两部分组成


事件模型

事件是java中的一个重要的概念,指某个代码运行过程中的一个状态,如:HttpSession创建,属性值的改变等都可以用事件来描述。
事件:java.util.EventObject
getSource()-Object
事件侦听程序:
(标志)接口:java.util.EventListener
实现listener接口
事件源:

注册侦听程序
触发事件侦听程序
  • 生成事件对象
  • 调用已注册的侦听程序,处理事件

典型的时间监听过程

创建一个Context生命周期事件来管理数据库的连接,这个监听器有如下的功能。
  1. 这个监听器监视着程序的启动
  2. 这个应用程序写入日志到数据库中并且把连接对象存储在Context中
  3. Servlet使用连接对象来执行SQL
  4. 监听器监听应用程序的关闭
  5. 在关闭应用程序之前,先关闭连接对象

各类事件对应的监听器接口




HttpSessionListener

事件(类):HttpSessionEvent
getSession
侦听器(接口):HttpSessionListener
sessionCreated(HttpSessionEvent se) 
sessionDestroyed(HttpSessionEvent se)

示例
实现接口HttpSessionListener
注册侦听

在web.xml中注册侦听程序
<listener> 
        <listener-class> 
            servlet.OnlineCounterListener 
        </listener-class> 
</listener>

示例:利用HttpSessionListener实现网站在线人数统计功能

public class OnlineCounter {
  private static long online = 0;
  public static long getOnline() { return online; }
  public static void raise() { online++; }
  public static void reduce() { online--;}
}

public class OnlineCounterListener implements HttpSessionListener { 
    public void sessionCreated(HttpSessionEvent hse) { 
        System.out.println("in session create");
        OnlineCounter.raise(); 
    } 
    public void sessionDestroyed(HttpSessionEvent hse) { 
        OnlineCounter.reduce(); 
    } 
}

<%
    out.println("onlineCount:"+OnlineCounter.getOnline());
%>


Servlet其它事件及侦听器

ServletContextEvent,ServletContextListener
contextDestroyed(ServletContextEvent sce) 
contextInitialized(ServletContextEvent sce)
ServletContextAttributeEvent, ServletContextAttributeListener
attributeAdded(ServletContextAttributeEvent scab) 
attributeRemoved(ServletContextAttributeEvent scab) 
attributeReplaced(ServletContextAttributeEvent scab) 
ServletRequestEvent,ServletReuestListener
ServletRequestAttributeEvent,ServletReuestAttributeListener

总结

Web应用目录结构

根(WebRoot)
WEB-INF
  • web.xml
  • classes
  • lib
Web应用发布:.war文件拷贝到容器的相关目录

Web容器
管理Servlet对象
创建相关对象:
  • HttpServletRequest,
  • HttpServletResponse
  • ServletConfig
发布目录
Tomcat的webapps目录下
可以是目录形式
Web.xml
  • <servlet><servlet-mapping>
  • <filter><filter-mapping>
  • <listener>
  • 其它




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值