一个过滤器能够附加到一个或者多个Servlet上,一个Servlet能够附加一个或者多个Filter。一个过滤器必须实现javax.servlet.Filter
接口并实现其中的三个方法。html
init()方法:java
这个方法在实例化过滤器时被调用,主要用于使过滤器为处理作准备。容器为这个方法传递一个FilterConfig
对象,其中包含配置信息。web
doFilter():bash
这个方法用于处理请求和相应。它接受3个输入参数:ServletRequest
、ServletReponse
、FilterChain
对象。FilterChain
对于正确的过滤操做相当重要。doFilter()
方法必须调用FilterChain
的doFilter()
方法,除非该方法用来拦截之后的下游处理session
destroy():app
该方法由容器在销毁过滤器实例以前调用。jsp
package com.tz.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class EncodingFilter implements Filter{
String encoding = null;
FilterConfig config = null;
@Override
public void destroy() {
// TODO Auto-generated method stub
this.config=null;
this.encoding=null;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if(encoding!=null){
//对请求进行编码设置
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
this.config = config;
this.encoding = config.getInitParameter("encoding");
}
}
复制代码
web.xml配置:ide
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>test</display-name>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>com.tz.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
复制代码
Jsp文件:post
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>编码过滤器测试</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<form action="process.jsp" name="form1" method="post">
姓名:<input type="text" name="userName" />
<input type="submit" value="提交" name="submit">
</form>
</body>
</html>
复制代码
process.jsp:测试
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>编码过滤器测试</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<p><%=request.getParameter("userName") %>,你好!</p>
<%=request.getCharacterEncoding() %>
</body>
</html>
复制代码
在定义监听器类时,只须要实现相应的监听器接口便可。如实现了 ServletContextListener
和ServletContextAttributeListener
的类就能够监听到ServletContext
对象的生命周期变化状况和ServletContext
对象中属性的变化状况。实现了HttpSessionListener
和HttpServletAttributeListener
接口的类就能够监听到HttpSession
对象的生命周期变化和HttpSession
对象中的属性变化。
package com.tz.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListenerTest implements ServletContextListener,ServletContextAttributeListener{
//当应用被移除到容器时触发
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("监听到应用被移除。。。。。。");
}
//当应用在容器中启动时触发
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("监听到应用被启动。。。。。。");
}
//ServletContext中新增属性时执行此方法
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("监听到新增了一个叫"+event.getName()+"的属性!");
}
@Override
public void attributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("removed......");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("replaced......");
}
}
复制代码
package com.tz.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListenerTest implements HttpSessionListener,HttpSessionAttributeListener{
//在线人数统计
int count = 0;
//当产生一个新的HttpSession对象时(新用户上线)执行此方法
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().getServletContext().setAttribute("count",++count);
System.out.println("监听到新用户"+event.getSession().getId()+"上线了!");
}
//当一个HttpSession销毁(用户下线)时执行此方法
@Override
public void sessionDestroyed(HttpSessionEvent event) {
event.getSession().getServletContext().setAttribute("count",--count);
System.out.println("监听到新用户"+event.getSession().getId()+"下线了!");
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("监听到"+ event.getName()+"属性新增了,属性值是"+event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("监听到"+ event.getName()+"属性被删除了");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
// TODO Auto-generated method stub
System.out.println("监听到"+ event.getName()+"属性被修改了");
}
}
复制代码
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>test</display-name>
<listener>
<listener-class>com.tz.listener.ContextListenerTest</listener-class>
</listener>
<listener>
<listener-class>com.tz.listener.SessionListenerTest</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
复制代码
jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>编码过滤器测试</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h2>Listener应用实例测试</h2>
<%
application.setAttribute("admin", "liubin");
application.setAttribute("admin", "xiaohuang");
application.removeAttribute("admin");
session.setAttribute("now", new Date());
session.setAttribute("now", "2016-05-09");
session.removeAttribute("now");
%>
目前在线人数:<%=application.getAttribute("count") %>人!
<a href="logout.jsp" style="list-style: none">注销</a>
</body>
</html>
复制代码
logout.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>Listener应用实例</title>
<meta http-equiv="content-type" content="utf-8">
</head>
<body>
<h2>Listener应用实例</h2>
<%
//销毁session对象
session.invalidate();
%>
恭喜你注销成功!目前在线人数:<%=application.getAttribute("count") %>
</body>
</html>
复制代码