前言
记得很多框架都使用了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生命周期事件来管理数据库的连接,这个监听器有如下的功能。- 这个监听器监视着程序的启动
- 这个应用程序写入日志到数据库中并且把连接对象存储在Context中
- Servlet使用连接对象来执行SQL
- 监听器监听应用程序的关闭
- 在关闭应用程序之前,先关闭连接对象
各类事件对应的监听器接口
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容器
管理Servlet对象
创建相关对象:
- HttpServletRequest,
- HttpServletResponse
- ServletConfig
Tomcat的webapps目录下
可以是目录形式
Web.xml
- <servlet><servlet-mapping>
- <filter><filter-mapping>
- <listener>
- 其它