程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 用過濾器和裝飾者設計模式(靜態代理)解決getParameter亂碼問題,getparameter中文亂碼

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

編輯:JAVA綜合教程

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


post的亂碼問題比較好解決,這裡主要是對get請求的亂碼做處理

 

解決思路:增強request對象的getParameter方法,使之 getParameter  直接獲取到的就是解決亂碼後的數據

 

有四種方式,

  1、繼承 :(下下策)
      ①明確知道全類名
        可以打印request實現類,可以知道實現類的全類名

      ②就是可以在子類中 new 父類
        你能確定request實現類,一定可以new麼?

        確定自己寫出的是通用方法。tomcat,weblogic,jboss......


       缺點:
          ①很難實現,幾乎沒有擴展性
          ②會占用寶貴的extends位

  2、裝飾設計模式【靜態代理】
  優點:
       ①不用知道實現類,可以用接口。  代碼擴展性極強
       ②不用占用寶貴的extends位


  步驟:
      ①增強類  必須實現  被增強類 實現的所有接口
      ②增強類  必須能夠獲得  被增強類  引用

  缺點:
    如果接口中的無關方法過多,浪費大量實現實現這些無關方法。

  解決方案:
    1、用動態代理
    2、去找包裝類,只需要繼承包裝類,子包裝/子增強類
    HttpServletRequestWrapper

  3、動態代理(暫時先不說)
  4、字節碼增強(暫時先不說)

 

具體代碼實現:

  

  解決方式:使用裝飾者設計模式(靜態代理)對getParameter進行功能增強

 

 

 

  1、自己的類繼承HttpServletRequestWrapper,對其中的getParameter方法進行重寫  

1、自己寫的增強類

 

  
 1 package com.itheim.utils;
 2 import java.io.UnsupportedEncodingException;
 3 import javax.servlet.http.HttpServletRequest;
 4 import javax.servlet.http.HttpServletRequestWrapper;
 5 public class MyHttpRequest extends HttpServletRequestWrapper {
 6     HttpServletRequest req;
 7     public MyHttpRequest(HttpServletRequest old) {
 8         super(old);
 9         // TODO Auto-generated constructor stub
10         this.req=old;
11     }
12     @Override
13     public String getParameter(String name) {
14         String method = req.getMethod();
15         if("get".equalsIgnoreCase(method)){
16             String par = req.getParameter(name);
17             if(par!=null){
18                 String result = null;
19                 try {
20                     result=new String(par.getBytes("iso8859-1"), "utf-8");
21                 } catch (UnsupportedEncodingException e) {
22                     // TODO Auto-generated catch block
23                     throw new RuntimeException(e);
24                 }
25                 return result;
26             }
27             
28         }
29         
30         return req.getParameter(name);
31     }
32 }

 2、過濾器中的代碼實現

1 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
2         //解決post亂碼
3         request.setCharacterEncoding("utf-8");
4         //解決get亂碼
5         HttpServletRequest httpServletRequest=(HttpServletRequest) request;
6         MyHttpRequest request2=new MyHttpRequest(httpServletRequest);
7         chain.doFilter(request2, response);
8     }

 

 

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