java 過慮器(封裝設計模式)

來源:互聯網
上載者:User

過慮器簡介:

                 過慮器能對客戶的請求進行預先處理,然後再將請求轉寄給其他web組件。
                 過慮器是在Servlet2.3規範中定義的,它可以對Web組件的,ServletRequest和ServletResponse進行檢查和修改。
                 過慮器本身並不產生ServletRequest對象和ServletResponse對象,它只對web組件提供以下過慮功能:
                 在web組件調用之前檢查request,並修改要求標頭和請求本文。
                 過慮器能夠在web組件被調用之後檢查response對像,修改回應標頭和響應本文。

       

                自訂的過慮器必須實現:javax.servlet.Filter介面。此介面定義了以下三個方法:
                          Init(FilterConfig conf) – 過慮器的初始化方法。-初始化工作執行一次(啟動時)。
                          doFilter(ServletRequest,ServletResponse,FilterChain) – 此方法完成實際的過慮操作。只要是配置的url匹配此過慮器的配置,即執行此方法。
                          destroy()-Servlet視窗在銷毀過慮器時執行此方法。-銷毀工作也只執行一次。


記性不好,簡單記錄一個demo


web.xml 配置

<filter>  <filter-name>zfx</filter-name>  <filter-class>cn.zfx.filter.ZFXFilter</filter-class>  <init-param>  <param-name>encoding</param-name>  <param-value>UTF-8</param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name>zfx</filter-name>  <url-pattern>/*</url-pattern>  <dispatcher>REQUEST</dispatcher><!-- 預設 -->  </filter-mapping>

/** * 過濾器 */public class ZFXFilter implements Filter{private String encoding ;@Overridepublic void destroy() {System.out.println("掛了。。。。。。。。。");}@Overridepublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {System.out.println("過濾了。。。。。。。" + encoding);req.setCharacterEncoding(encoding);chain.doFilter(req, resp);System.out.println("後處理過濾了。。。。。。。" + encoding);}/** *   可以讀取初始化資訊 */@Overridepublic void init(FilterConfig config) throws ServletException {this.encoding = config.getInitParameter("encoding");}}

過濾器可以做很多事情,如:字元集過濾、設定jsp頁面不緩衝、驗證使用者是否登入、驗證非法字元,其中 request.setCharacterEncoding (“UTF-8”);只可以解決post方式的亂碼,不能解決get方式。所以這裡可以用封裝器模式,封裝request,對request增強,java中IO基本都是用的封裝設計模式


封裝設計模式:

      對一個類的增強,一般採取三種式
               1、繼承被增強類,即實現一個子類。
               2、使用動態代理處理需要增強方法。
               3、使用封裝設計模式。(Java中的IO基本上都是封裝設計模式)
     以下是使用封裝設計模式增強一個類的步驟:
               1、繼承需要增強類。
               2、聲明需要增強類為自己的成員變數。
               3、書寫一個構造方法接收需要增強類。
               4、實現需要增強方法。
               5、實現可擴充的其他方法。
封裝設計模式是指:
              假定A類是B類的封裝類,那麼類A與類B有同樣的介面,並且類A擁有類B的的執行個體,類A藉助類B的執行個體來實現介面。


/** * 自訂的HttpServletRequest * 通過實現HttpServletRequestWrapper類 * 實現封裝模式 * 用自訂的request實現亂碼的解決方案 * 包括get和post * @author wangjianme */public class MyHttpServletRequest extends HttpServletRequestWrapper{private HttpServletRequest request;public MyHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {System.err.println("擷取參數。。。。");String param = request.getParameter(name);if(param==null){//如果為空白則直接返回return null;}//注意大小寫問題if(request.getMethod().equalsIgnoreCase("GET")){System.err.println("進行轉碼");//如果是get才進行轉碼,從request中取出編碼模式try {param = new String(param.getBytes("ISO-8859-1"),request.getCharacterEncoding());} catch (UnsupportedEncodingException e) {throw new RuntimeException(e.getMessage(),e);}return param;}else{return param;}}}

/** * 解決亂碼的Filter * @author wangjianme */public class CharacterFilter implements Filter{public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.err.println("開始過慮。。。。");request.setCharacterEncoding("UTF-8");//注意建立自己的requestMyHttpServletRequest req = new MyHttpServletRequest((HttpServletRequest) request);//注意一下面,一定要傳遞自己的req對像,否則不好用的chain.doFilter(req,response);//以下是沒有使用自己的request的,則處理get時必定會出現亂碼//chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {}}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.