Filter
filter即过滤器,可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等
要实现一个filter,要实现Filter接口(javax.servlet.Filter)并重写三个方法
void init(FilterConfig filterConfig)
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
public void destroy()
程序启动会调用init(),结束调用destroy(),如果拦截到符合的请求会调用doFilter();
过滤器链
多个过滤器组成,可以用chain.doFilter(request, response)
将请求传递给下一个过滤器,如果没有下一个,就转发给指向的资源。
(request------>filterA------->filterB–…—>Servlet)
过滤器的顺序可以通过web.xml文件配置。(filter-mapping的先后顺序)
web.xml
<filter>
<display-name>MyFilterA</display-name>
<filter-name>MyFilterA</filter-name>
<filter-class>filter.MyFilterA</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilterA</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
<filter>
<display-name>MyFilterB</display-name>
<filter-name>MyFilterB</filter-name>
<filter-class>filter.MyFilterB</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilterB</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
Filter的配置和Servlet很像 (Servlet)
url-pattern拦截,name映射
filter的顺序是由mapping的先后顺序决定的
也可以在mapping中加上任意的dispatcher标签可以设置拦截的请求类型:
默认是 REQUEST
REQUEST :拦截HTTP请求 get post
FORWARD :拦截 请求转发方式
INCLUDE :拦截 request.getRequestDispatcher().include() 或者 jsp:include page=""方式
ERROR : 拦截 error-page方式
MyFilterA MyFilterB
TestA.jsp----->MyFilterA----->MyFilterB------->MyServlet
TestA.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="MyServlet">MyServlet</a>
</body>
</html>
MyServlet
/**
* Servlet implementation class Myservlet
*/
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("MyServlet启动");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
MyFilterA
/**
* Servlet Filter implementation class MyFilterA
*/
public class MyFilterA implements Filter {
/**
* Default constructor.
*/
public MyFilterA() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("FilterA拦截了请求");
// pass the request along the filter chain
chain.doFilter(request, response);
System.out.println("FilterA接受了响应");
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
MyFilterB
/**
* Servlet Filter implementation class MyFilterB
*/
public class MyFilterB implements Filter {
/**
* Default constructor.
*/
public MyFilterB() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("FilterB拦截了请求");
// pass the request along the filter chain
chain.doFilter(request, response);
System.out.println("FilterB接收了响应");
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
Listener
监听器就是监听某个对象的的状态变化的组件
被监听的对象:request session servletContext(application)
按监听的对象域和监听的内容可以分为
request域 | session域 | servletContext域 | |
---|---|---|---|
监听对象的创建和销毁 | ServletRequestListener | HttpSessionListener | ServetContextListener |
监听对象域的属性变更 | ServletRequestAttributeListener | HttpSessionAttributeListener | ServetContextAttributeListener |
web.xml
<listener>
<listener-class>listener.MyListener</listener-class>
</listener>
<listener>
<listener-class>listener.MyAttributeListener</listener-class>
</listener>
监听对象的创建和销毁
监听器要实现这几个对应的接口:
ServletRequestListener
HttpSessionListener
ServetContextListener
三个接口的方法都大同小异:
//监听创建
void contextInitialized(ServletContextEvent sce);
//监听销毁
void contextDestroyed(ServletContextEvent sce);
MyListener
TestA.jsp------>MyServlet(执行销毁session)
MyListener
public class MyListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
/**
* Default constructor.
*/
public MyListener() {
// TODO Auto-generated constructor stub
}
/**
* @see HttpSessionListener#sessionCreated(HttpSessionEvent)
*/
public void sessionCreated(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("监听到了session的创建");
}
/**
* @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
*/
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("监听到了request的销毁");
}
/**
* @see ServletRequestListener#requestInitialized(ServletRequestEvent)
*/
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
System.out.println("监听到了request的创建");
}
/**
* @see HttpSessionListener#sessionDestroyed(HttpSessionEvent)
*/
public void sessionDestroyed(HttpSessionEvent se) {
// TODO Auto-generated method stub
System.out.println("监听到了session的销毁");
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("监听到了servletContext的销毁");
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
System.out.println("监听到了servletContext的创建");
}
}
监听对象域的属性变化
要实现以下对应的接口
ServletRequestAttributeListener
HttpSessionAttributeListener
ServetContextAttributeListener
要实现三个方法:
//监听增加
void attributeAdded(ServletContextAttributeEvent scae);
//监听删除
void attributeRemoved(ServletContextAttributeEvent scae);
//监听修改
void attributeReplaced(ServletContextAttributeEvent scae);
//对应域中的属性名
String name = scab.getName();
//域中的属性值
String value = (String) scab.getValue();
System.out.println("添加属性" + name + " : " + value);
监听器简单实现网页累计访问
通过servletContext的属性域可以实现
每监听到一个request请求,就将servletContext的访问量+1.
TestA---->TesB(显示访问数)
TesA
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="TestB.jsp">TestB</a>
</body>
</html>
TestB
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int visit = (int)application.getAttribute("visit");
out.print("访问总次数:"+visit);
%>
</body>
</html>
MyListener
public class MyListener implements ServletContextListener, ServletRequestListener {
/**
* Default constructor.
*/
public MyListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletRequestListener#requestDestroyed(ServletRequestEvent)
*/
public void requestDestroyed(ServletRequestEvent sre) {
// TODO Auto-generated method stub
}
/**
* @see ServletRequestListener#requestInitialized(ServletRequestEvent)
*/
public void requestInitialized(ServletRequestEvent sre) {
// TODO Auto-generated method stub
//监听到请求就访问量+1
int visit = (int) sre.getServletContext().getAttribute("visit");
sre.getServletContext().setAttribute("visit", visit+1);
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
//ServletContext创建时创建访问量
sce.getServletContext().setAttribute("visit", 0);
}
}