过滤器
一个过滤器可以附加到一个或者多个Servlet上,一个Servlet可以附加一个或者多个Filter。一个过滤器必须实现javax.servlet.Filter
接口并实现其中的三个方法。
-
init()方法:
这个方法在实例化过滤器时被调用,主要用于使过滤器为处理做准备。容器为这个方法传递一个
FilterConfig
对象,其中包含配置信息。 -
doFilter():
这个方法用于处理请求和相应。它接受3个输入参数:
ServletRequest
、ServletReponse
、FilterChain
对象。FilterChain
对于正确的过滤操作至关重要。doFilter()
方法必须调用FilterChain
的doFilter()
方法,除非该方法用来拦截以后的下游处理 -
destroy():
该方法由容器在销毁过滤器实例之前调用。
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配置:
<?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文件:
<%@ 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>