Servlet
1) 客户端发送请求至服务器端;2) 服务器将请求信息发送至 Servlet;3) Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;4) 服务器将响应返回给客户端。在 Web 应用程序中,一个 Servlet 在一个时刻可能被多个用户同时访问。这时 Web 容器将为每个用户创建一个线程来执行 Servlet。如果 Servlet 不涉及共享资源的问题,不必关心多线程问题。但如果 Servlet 需要共享资源,需要保证 Servlet 是线程安全的。最新版本3.1,为了简化开发流程,Servlet 3.0 引入了注解(annotation),这使得 web 部署描述符 web.xml 不再是必须的选择。
Filter
Filter实现了javax.servlet.Filter接口,因此一定要实现javax.servlet包的Filter接口的三个方法init()、doFilter()、destroy(),空实现也行。
在启动服务器时加载。随你的web应用启动而启动的,只初始化一次,只有当你的web应用停止或重新部署的时候才销毁。
不像Servlet,它不能产生请求或者响应,它只是修改 对某一资源的请求,或者修改对某一资源的响应。或者成为请求的预处理,响应的后处理
Listenner
输入url,先经过过滤器,然后是servlet。
Servlet,Filter都是针对url之类的,而Listener是针对对象的操作的
Listenner 也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
web.xml 的加载顺序是:context-param -> listener -> filter -> servlet
下面是一个日志过滤器的实现
public class LogFilter implements Filter { //FilterConfig可用于访问Filter的配置信息 private FilterConfig config; //实现初始化方法 public void init(FilterConfig config) { this.config = config; } //实现销毁方法 public void destroy() { this.config = null; } //执行过滤的核心方法 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)throws IOException,ServletException { //---------下面代码用于对用户请求执行预处理--------- //获取ServletContext对象,用于记录日志 ServletContext context = this.config.getServletContext(); long before = System.currentTimeMillis(); System.out.println("开始过滤..."); //将请求转换成HttpServletRequest请求 HttpServletRequest hrequest = (HttpServletRequest)request; //记录日志 context.log("Filter已经截获到用户的请求地址: " + hrequest.getServletPath()); //Filter只是链式处理,请求依然放行到目的地址 chain.doFilter(request, response); //---------下面代码用于对服务器响应执行后处理--------- long after = System.currentTimeMillis(); //记录日志 context.log("过滤结束"); //再次记录日志 context.log("请求被定位到" + hrequest.getRequestURI() + "所花的时间为: " + (after - before)); } }