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)); } }