程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 像GenericServlet實現Servlet接口的方式去實現Filter接口,實現servlet接口

像GenericServlet實現Servlet接口的方式去實現Filter接口,實現servlet接口

編輯:JAVA綜合教程

像GenericServlet實現Servlet接口的方式去實現Filter接口,實現servlet接口


編寫Filter的時候,我們需要實現Filter接口,需要去實現init(FilterConfig arg0),doFilter(ServletRequest request, ServletResponse response, FilterChain chain),destroy()等方法,有時候我們並不需要去實現init與destory方法,但又必須在代碼裡面寫上這兩個方法.如果我們不想多寫這個兩個方法,我們可以用一個類去實現Filter接口,在我們開發的時候直接繼承這個類,實現doFilter方法即可.

代碼如下:

 1 package com.zhx.http.filter;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.Filter;
 6 import javax.servlet.FilterChain;
 7 import javax.servlet.FilterConfig;
 8 import javax.servlet.ServletException;
 9 import javax.servlet.ServletRequest;
10 import javax.servlet.ServletResponse;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13 
14 /**
15  * 
16  * @author zhaoxin
17  * 自定義的HttpFilter,實現Filter接口,參考自GenericServlet的實現方式
18  */
19 public abstract class HttpFilter implements Filter,java.io.Serializable {
20     
21     private static final long serialVersionUID = 1L;
22     
23     private FilterConfig filterConfig;
24 
25     /**
26      * 該方法由servlet容器進行調用,有且只調用一次
27      * 不建議子類直接重寫該方法
28      */
29     @Override
30     public void init(FilterConfig arg0) throws ServletException {
31         this.filterConfig = arg0;
32         this.init();
33     }
34     
35     /**
36      * 供子類重寫的初始化方法,在子類中可以在init()方法中調用getFilterConfig()方法來獲取FilterConfig對象,來獲取初始化參數
37      * @throws ServletException
38      */
39     protected void init() throws ServletException {
40         //TODO Auto-generated method stub
41     }
42     
43     /**
44      * 供子類調用,來獲取FilterConfig對象
45      * @return
46      */
47     public FilterConfig getFilterConfig() {
48         return filterConfig;
49     }
50     
51     /**
52      * 該方法由servlet容器調用,不建議之類直接進行重寫
53      */
54     @Override
55     public void doFilter(ServletRequest req, ServletResponse res,
56             FilterChain fc) throws IOException, ServletException {
57         
58         HttpServletRequest request;
59         HttpServletResponse response;
60         
61         try {
62             request = (HttpServletRequest)req;
63             response = (HttpServletResponse)res;
64         } catch (Exception e) {
65              throw new ServletException("non-HTTP request or response");
66         }
67         doFilter(request, response, fc);
68     }
69     
70     /**
71      * 該方法由子類必須重寫的過濾方法
72      * @param request
73      * @param response
74      * @param filterChain
75      * @throws IOException
76      * @throws ServletException
77      */
78     public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
79             FilterChain filterChain) throws IOException, ServletException;
80 
81     /**
82      * 由servlet容器進行調用
83      */
84     @Override
85     public void destroy() {
86         // TODO Auto-generated method stub
87 
88     }
89 
90 }

開發的時候我們只需新建一個類,然後去繼承HttpFilter即可.如果有初始化的需要,建議重寫無參的init()方法,如果想在該方法內使用FilterConfig對象,通過調用this.getFilterConfig()方法即可獲得.編寫過濾方法時建議重寫doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain).該方法的好處是可以直接使用HttpServletRequest,HttpServletResponse,不用自己再去將ServletRequest,ServletResponse對象強制轉換為HttpServletRequest,HttpServletResponse對象.如果有釋放資源等操作的時候,直接重寫destory()方法即可,沒有的話就不用重寫.可以讓代碼看上去更美觀.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved