javaWeb的三大组件:Servlet、Filter和Listener
过滤器
介绍
- 过滤器(Filter)也称为拦截器,它是Servlet技术中非常实用的技术,
- Web开发人员通过Filter技术,可以在用户访问某个Web资源(JSP、Servlet、HTML、图片、CSS等)之前,对访问的请求和响应进行拦截,从而实现一些特殊功能。
- 例如:验证用户访问权限、记录用户操作、对请求进行重新编码、压缩响应信息等。
运行原理
- 当用户的请求到达指定的网页之前,可以借助过滤器来改变这些请求的内容,此过程也称为“预处理”;
- 当执行结果要响应到用户之前,可经过过滤器修改响应输出的内容,此过程称为“后处理”。
- 运行过程
- Web容器判断接收的请求资源是否有与之匹配的过滤器,如果有,容器将请求交给相应过滤器进行处理;
- 在过滤器预处理过程中,可以改变请求的内容,或者重新设置请求的报头信息,然后将请求发给目标资源;
- 目标资源对请求进行处理后作出响应;
- 容器将响应转发回过滤器;
- 在过滤器后处理过程中,可以根据需求对响应的内容进行修改;
- Web容器将响应发送回客户端。
过滤器链:在一个Web应用中,也可以部署多个过滤器,这些过滤器组成了一个过滤器链。
例题1:创建一个过滤器,实现网站访问计数器的功能,并配置网站访问量的初始值设置为6000。
package cn.sdut.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
@WebFilter(
urlPatterns= {"/index.jsp"},
initParams = {@WebInitParam(name = "count",value="60000")}
)
public class CounterFilter implements Filter {
private int count;
public CounterFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
count++;//访问数量自增
//将ServletRequest转换成HttpServletRequest
HttpServletRequest req = (HttpServletRequest) request;
//获取ServletContext
ServletContext context = req.getSession().getServletContext();
context.setAttribute("count", count);//将来访数量放到ServletContext中
chain.doFilter(request, response);//向下传递过滤器
}
public void init(FilterConfig fConfig) throws ServletException {
String param = fConfig.getInitParameter("count");//获取初始化参数
count = Integer.valueOf(param);
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<title>主界面</title>
</head>
<body>
<h2>
欢迎光临,<br/>
您是本站的第【
<%=application.getAttribute("count") %>
】位访客!
</h2>
</body>
</html>
监听器
什么是监听器?
监听器就是一个实现特定接口的普通的java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器的某个方法将立即被执行。
Web容器运行过程中,有哪些关键点事件?
Web应用被启动、用户会话开始、用户会话结束、用户请求到达等。
监听器监听的事件源有几种?
三种。ServletContext、HttpSession和ServletRequest三种域对象。
针对以上三种对象,又把这多种类型的监听器划分为三种类型:
- 监听三个域对象创建和销毁的事件监听器
- 监听域对象中属性的增加和删除的事件监听器
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
Listener接口 | Event类 |
---|---|
ServletContextList | ServletContextEvent |
ServletContextAttributeListener | ServletContextAttributeEvent |
HttpSessionListener | HttpSessionEvent |
HttpSessionActivationListener | |
HttpSessionAttributeListener | HttpSessionBindingEvent |
HttpSessionBindingListener | |
ServletRequestListener | ServletRequestEvent |
ServletRequestAttributeListener | ServletRequestAttributeEvent |
监听器的实现步骤
1、写一个类,实现监听器接口的所有方法
2、使用注解或者web.xml中进行监听器的配置
注解配置 @WebListener
web.xml中配置
<listener>
<listener-class>全限定类名</listener-class>
</listener>
示例:
package cn.sdut.listener;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener
public class OnlineNumberListenerr implements HttpSessionListener {
int count=0;
public void sessionCreated(HttpSessionEvent arg0) {
//session会话创建时,web容器自动调用此方法
count++;
ServletContext context = arg0.getSession().getServletContext();
context.setAttribute("onlineNum", count);
}
public void sessionDestroyed(HttpSessionEvent arg0) {
//session会话销毁时,web容器自动调用此方法
count--;
ServletContext context = arg0.getSession().getServletContext();
context.setAttribute("onlineNum", count);
}
}
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>主界面</title>
</head>
<body>
欢迎你,<%
String name = (String)session.getAttribute("name");
out.print(name);
%>
<br>
<p>当前在线人数: ${onlineNum }</p>
<br>
<a href="LogoutServlet">退出登录</a>
</body>
</html>