1. 程式人生 > >JavaWeb中使用Filter以及裝飾者設計模式解決全域性編碼格式問題

JavaWeb中使用Filter以及裝飾者設計模式解決全域性編碼格式問題

裝飾者設計模式簡介

  • 定義:動態給物件新增一個額外的職責,擴充其功能,使用裝飾者設計模式相比生成的子類顯得更為靈活。
  • 設計初衷:Java中通常使用繼承來達到擴充功能的目的,如果需要實現的功能種類繁多,勢必會擴充出很多子類,這增加了系統的複雜性,而且如果要使用繼承來擴充功能,那麼這些功能在編譯時候就已經確定了,我們必須預見這些功能,是靜態的。

亂碼問題分析

  • 在從前端表單提交資料時,採用GET方法和POST方法在後端進行的解決亂碼的方式有所區別。Tomcat內部傳輸資料是預設使用的編碼方式為ISO-8859-1,不支援中文。
  • 假如是GET方法提交,則要在後臺先進行先編碼再解碼的方式,解決亂碼問題。parameter=new String(parameter.getBytes("iso8859-1"),"UTF-8");
    ,用String物件的getBytes()方法,先將獲取到的資料進行ISO-8859-1編碼,然後再用UTF-8進行解碼,來獲取中文。
  • 假如是POST方法提交,在後臺中只需要request.setCharacterEncoding("UTF-8"); ,這句程式碼就有可以解決POST方法提交表單時產生的中文亂碼問題。

Filter的引入

  • 假如我們一個專案要定義很多的Servlet,在每個業務中都要根據表單的提交方式來用響應的程式碼解決亂碼問題,從軟體工程的角度來講,我們的專案中就產生了大量的重複的程式碼。這個時候我們就需要用Filter過濾器來實現全域性編碼的過濾。在我們的Web應用伺服器中,訪問資源的流程一般為(假如配置了全域性的過濾器),前端的request請求先經過實現的Filter類,然後經過doFilter()方法放行後在找到相應的servlet進行資源的訪問。我們就可以在個全域性的Filter中對前端傳送過來的資料進行編碼處理,以結局亂碼問題,這樣就減少了大量的重複的程式碼。
  • Filter的實現過程一般為這樣,實現一個Java類,實現Filter藉口,並實現其中的doFilter()方法,doFilter()方法中有三個引數,public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    request和response是前端傳來的請求和響應,由於是ServletRequest所以在使用時要進行強制型別轉換,轉換成HttpRequest型別,第三個引數chain負責過濾完畢後執行doFilter()方法,實現類之後要在web.xml中配置,配置規則一般如下,
    <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.web.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    配置完成後就實現了全域性編碼的功能。
    在過濾類的內部實現細節中,用到了裝飾著設計模式,
public class EncodingFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        // TODO Auto-generated method stub
        arg0.setCharacterEncoding("UTF-8");




        //在傳遞request之前對request的getparameter方法進行增強

        /*
         * 裝飾著模式(包裝)
         * 1.增強類與被增強的類要實現同一個介面
         * 2.在增強類中傳入被增強的類
         * 3.需要增強的方法重寫,不需要增強的方法呼叫父類
         * */


        //被增強的物件
        HttpServletRequest request=(HttpServletRequest)arg0;
        //增強的物件
        EnhanceRequest enhanrequest=new EnhanceRequest(request);
        arg2.doFilter(enhanrequest, arg1);
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }   

}
class EnhanceRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;
    public EnhanceRequest(HttpServletRequest request) {
        super(request);
        this.request=request;
    }
    //重寫getparameter
    @Override
    public String getParameter(String name) {
        String parameter = request.getParameter(name);//亂碼
        try {
            parameter=new String(parameter.getBytes("iso8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return parameter;
    }
}

在使用裝飾著設計模式中有三個必須注意的地方:1.實現一個增強類,增強類和被增強類要實現同一個介面2.在增強類中要傳入被增強的類3.對需要的方法進行重寫,對不需要增強的方法直接呼叫父類的方法。
這樣我們就解決了全域性編碼的亂碼問題。

相關推薦

JavaWeb使用Filter以及裝飾設計模式解決全域性編碼格式問題

裝飾者設計模式簡介 定義:動態給物件新增一個額外的職責,擴充其功能,使用裝飾者設計模式相比生成的子類顯得更為靈活。 設計初衷:Java中通常使用繼承來達到擴充功能的目的,如果需要實現的功能種類繁多,勢必會擴充出很多子類,這增加了系統的複雜性,而且如果要使用繼

java裝飾設計模式

裝飾者設計模式 : 增強一個類的功能,而且可以讓這些類互相裝飾。 裝飾者設計模式的步驟 : 在裝飾類的內部維護一個被裝飾的引用 讓裝飾類有一個共同的父類或者是父介面 繼承實現的增強類和裝飾模式實現的增強類的區別 : 繼承實現的

Java——裝飾設計模式

結合了一些百度百科的概念然後使用程式碼進行理解~ 裝飾者模式: 指的是在不必改變原類檔案和使用繼承的情況下,動態地擴充套件一個物件的功能。它是通過建立一個包裝物件,也就是裝飾來包裹真實的物件。 使用場景: ​​​​​​​需要擴充套件一個類的功能,或給一個類新增附加

裝飾設計模式

裝飾者模式具有的一些特徵 1,裝飾者(decorator)和被裝飾(擴充套件)的物件有著相同的超類(supertype)。 2,我們可以用多個裝飾者去裝飾一個物件。 3,我們可以用裝飾過的物件替換程式碼中的原物件,而不會出問題(因為他們有相同的超類)。 4,裝飾者可以

42、Java裝飾設計模式

設計模式簡介 什麼是設計模式?設計模式是可以重複利用的解決方案。軟體開發的先驅或者前輩們將之前在開發中遇到的問題進行總結並給出瞭解決方案,後輩在遇到這些問題之後直接使用這些方案即可解決問題。比如蓋高樓,都是先挖地基,然後再蓋,如果先蓋樓後挖地基,可能蓋不了幾層,樓就倒了。 裝飾者設計模式 使用場景:給某

JavaWeb開發技巧之裝飾設計模式

  假設我們遇到這樣一種情況:在頁面輸出<%= request.getParameter("content")%前,要在過濾器MyFilter要對顯示內容進行敏感詞彙進行過濾處理。那麼問題來了,由於request(即HttpRequest物件)沒有setParamete

通過連線池操作 理解裝飾設計模式 自我理解

裝飾者設計模式:用於資料庫連線中close方法的增強 自我理解:裝飾者設計模式的方法增強,就是自定義一個類去實現我們需要增強的方法的介面,並定義一個成員變數物件去儲存我們之前的物件, 那麼這個成員變數所有呼叫的方法就是我們原來介面中的方法,因為成員變數物件 是我們原來物件的

簡單Java程式碼例項助你通俗易懂的理解什麼是裝飾()設計模式 (Decorator)

首先拋開到處都有的文字概念。來看下面的例子。 現在以:人吃飯。這個需求為例。來講解這個設計模式。 1.0:想當年,人們都比較樸實。吃飯就是簡簡單單的吃飯。 那麼PersonBefore類裡面一個簡單的

用過濾器和裝飾設計模式(靜態代理)解決getParameter亂碼問題

post的亂碼問題比較好解決,這裡主要是對get請求的亂碼做處理 解決思路:增強request物件的getParameter方法,使之 getParameter  直接獲取到的就是解決亂碼後的資料 有四種方式,   1、繼承 :(下下策)      ①明確知道全類名 

分享JavaWebfilter過濾器的案例妙用 - 髒話過濾/編碼過濾/程式碼過濾

  案例1. 利用Servlet的過濾器Filter進行完成髒話過濾 package cn.javabs.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servle

設計模式(七):Java的觀察設計模式

介紹 觀察者模式是行為設計模式之一。當您對物件的狀態感興趣並希望在有任何更改時收到通知時,觀察者設計模式非常有用。在觀察者模式中,監視另一個物件狀態的物件稱為Observer,正在被監視的物件稱為Subject。 根據GoF,觀察者設計模式的意圖是; 定義物件之間的一對多依賴關係,以便當一個物件更改狀態時

Android與設計模式——裝飾(Decorator)模式

在閻巨集博士的《JAVA與模式》一書中開頭是這樣描述裝飾(Decorator)模式的:   裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替

java的監聽機制——觀察設計模式詳解

好久沒有做筆記了,我發現研究過一個東西后忘的很快,等下次遇到後還得重新查資料學,倒不如寫篇筆記記錄一下下次遇到相同的問題後查查筆記瞬間就知道了,從而節省了好多時間,今天心血來潮哈哈,寫一篇簡單的筆記

Java代理和裝飾模式的區別

裝飾模式:以對客戶端透明的方式擴充套件物件的功能,是繼承關係的一個替代方案; 代理模式:給一個物件提供一個代理物件,並有代理物件來控制對原有物件的引用; 裝飾模式為所裝飾的物件增強功能;代理模式對代理的物件施加控制,並不提供物件本身的增強功能 簡而言之,裝飾者是指的是自身,對功能的增強,而另一種是呼叫介面,實

觀察設計模式

實現 per 合並 一個 num ride blog 通知 elf 1.觀察者接口及實現類 //一個Observer接口: 1.public interface Observer { 2. public void update(); 3.} //兩個實

設計模式: 自己手動實現一個觀察設計模式

package rgs name gree 觀察者設計模式 forecast server 它的 upd 觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。 在觀察者模式中,會

iOS都有什麽設計模式?各個設計模式的作用?

關閉 單例設計 重載 family phone 代碼結構 案例 nco ror 一 iOS中都有什麽設計模式? 1.代理模式 2.觀察者模式 3.MVC模式 4.單例模式 5.策略模式 6.工廠模式 二 各個設計模式的作用? (一)代理模式 在觀察者模式中,一個對象

Spring的用到的設計模式大全

fig com out 調用 IT學習 ceo 來看 系列 如果 spring中常用的設計模式達到九種,我們舉例說明: 第一種:簡單工廠又叫做靜態工廠方法(StaticFactory Method)模式,但不屬於23種GOF設計模式之一。 簡單工廠模式的實質是由一個工廠類根

Java事件監聽機制與觀察設計模式

idea demo1 script 操作 alt face ner over 方法 一. Java事件監聽機制 1. 事件監聽三要素: 事件源,事件對象,事件監聽器 2. 三要素之間的關系:事件源註冊事件監聽器後,當事件源上發生某個動作時,事件源就會調用事件監聽的一個方法,

C# 通過 Observer觀察 設計模式 來理解 抽象類 和 介面 應用在什麼地方

什麼時候用抽象類?什麼時候用介面?怎麼理解抽象類?怎麼理解介面? 一、百度解釋抽象類和介面的區別 總而言之就是一句話:抽象類可以包含具體實現,介面只能包含定義。 實現介面時必須實現介面定義的方法等,抽象類中如果給方法加上了“abstract”,那麼這個方法也需要在繼承後實現這個