日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

(四)Decorator设计模式解决GET/POST请求的乱码问题(转)

發布時間:2025/5/22 asp.net 184 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (四)Decorator设计模式解决GET/POST请求的乱码问题(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Decorator設計模式

?

  1.1、Decorator設計模式介紹

  •   當某個對象的方法不適應業務需求時,通常有2種方式可以對方法進行增強:
  • 編寫子類,覆蓋需增強的方法。
  • 使用Decorator設計模式對方法進行增強。
    • 裝飾(Decorator)模式:裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案。裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

    ?

    • 那么在實際應用中遇到需增強對象的方法時,到底選用哪種方式比較好呢?這個沒有具體的定式,只能是根據具體的需求來采用具體的方式,不過有一種情況下,必須使用Decorator設計模式:即被增強的對象,開發人員只能得到它的對象,無法得到它的class文件。比如request、response對象,開發人員之所以在servlet中能通過sun公司定義的HttpServletRequest\response接口去操作這些對象,是因為Tomcat服務器廠商編寫了request、response接口的實現類。web服務器在調用servlet時,會用這些接口的實現類創建出對象,然后傳遞給servlet程序。此種情況下,由于開發人員根本不知道服務器廠商編寫的request、response接口的實現類是哪個?在程序中只能拿到服務器廠商提供的對象,因此就只能采用Decorator設計模式對這些對象進行增強。

    ?

    1.2、Decorator設計模式的實現

      1.首先看需要被增強對象繼承了什么接口或父類,編寫一個類也去繼承這些接口或父類。   2.在類中定義一個變量,變量類型即需增強對象的類型。   3.在類中定義一個構造函數,接收需增強的對象。   4.覆蓋需增強的方法,編寫增強的代碼。

    ?

    二、使用Decorator設計模式增強request對象

    •   Servlet API 中提供了一個request對象的Decorator設計模式的默認實現類HttpServletRequestWrapper,HttpServletRequestWrapper 類實現了HttpServletRequest接口中的所有方法但這些方法的內部實現都是僅僅調用了一下所包裝的的 HttpServletRequest對象的對應方法,以避免用戶在對request對象進行增強時需要實現request接口中的所有方法。
    • HttpServletRequestWrapper 關系圖如下,可見HttpServletRequestWrapper實現了HttpServletRequest接口繼承了ServletRequestWrapper類,而HttpServletRequest接口繼承了ServletRequest所有的方法,其中包括getParameter()相關方法。HttpServletRequestWrapper中的getParameter方法內部僅僅調用了所包裝的HttpServletResquest對象的getParameter方法。

    ?

    ?2.1、使用Decorator模式包裝request對象解決get和post請求方式下的中文亂碼問題(一)

    ?

    index.jsp: <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body>以get請求提交的表單<form action="request/getpost!get" method="get" >用戶名:<input type="text" name="userName" /> <br/>&nbsp;碼:<input type="password" name="passWd"/><br/>&nbsp;好:<input type="checkbox" name="like" value="籃球"/>籃球<input type="checkbox" name="like" value="足球"/>足球<input type="submit" /></form><br/><br/>以post請求提交的表單<form action="request/getpost!post" method="post" >用戶名:<input type="text" name="userName" /> <br/>&nbsp;碼:<input type="password" name="passWd"/><br/>&nbsp;好:<input type="checkbox" name="like" value="籃球"/>籃球<input type="checkbox" name="like" value="足球"/>足球<input type="submit" /></form></body> </html>

    界面:

    struts.xml:

    <struts><constant name="struts.enable.DynamicMethodInvocation" value="true" /><constant name="struts.devMode" value="true" /><package name="default" namespace="/request" extends="struts-default"><action name="getpost" class="action.ActionGetPost"></action></package> </struts>

    ?

    ActionGetPost.java package action;public class ActionGetPost extends BaseAction{public String execute(){System.out.println("execute方法");return null;}/*** 處理get請求* @return*/public String get(){System.out.println("這是get請求");String userName=request.getParameter("userName");String passWd=request.getParameter("passWd");String[] likes=request.getParameterValues("like");for(String like:likes){System.out.println(like);}System.out.println("userName="+userName);System.out.println("password="+passWd);return null;}/*** 處理post請求* @return*/public String post(){System.out.println("這是POST請求");
    ?? ??? ?String userName=request.getParameter("userName");
    ?? ??? ?String passWd=request.getParameter("passWd");
    ?? ??? ?String[] likes=request.getParameterValues("like");
    ?? ??? ?
    ?? ??? ?for(String like:likes){
    ?? ??? ??? ?System.out.println(like);
    ?? ??? ?}?? ? ??? ?
    ?? ??? ?System.out.println("userName="+userName);
    ?? ??? ?System.out.println("password="+passWd);
    ?? ??? ?return null;} }
    過濾器EncodingFilter.java package filter;import java.io.IOException; import java.io.UnsupportedEncodingException;import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse;/*** 此過濾器用于解決get和post請求中問亂碼的問題。*/ public class EncodingFilter implements Filter {public EncodingFilter() {}public void destroy() {}/*** 要解決亂碼問題首先區別對待POST方法和GET方法,* 1.如果是POST方法,則用request.setCharacterEncoding("UTF-8"); 即可* 2.如果是GET方法,則麻煩一些,需要用decorator設計模式包裝request對象來解決*/public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletRequest request=(HttpServletRequest)req;HttpServletResponse response=(HttpServletResponse)res;//獲取request請求是get還是postString method=request.getMethod();if(method.equals("GET") || method.equals("get")){ //注意大小寫都要判斷,一般來說是大寫的GET/*** request請求為get請求,則用包裝類對request對象的getParameter方法進行覆蓋。*/response.setContentType("text/html;charset=UTF-8");MyGetHttpServletRequestWrapper requestWrapper=new MyGetHttpServletRequestWrapper(request);chain.doFilter(requestWrapper, response); }else{//post請求response.setContentType("text/html;charset=UTF-8");request.setCharacterEncoding("UTF-8");chain.doFilter(request, response); }}public void init(FilterConfig fConfig) throws ServletException {}}class MyGetHttpServletRequestWrapper extends HttpServletRequestWrapper{HttpServletRequest request;public MyGetHttpServletRequestWrapper(HttpServletRequest request) {super(request);this.request=request;}/*** servlet API中提供了一個request對象的Decorator設計模式的默認實現類HttpServletRequestWrapper,* (HttpServletRequestWrapper類實現了request接口中的所有方法,但這些方法的內部實現都是僅僅調用了一下所包裝的的* request對象的對應方法) 以避免用戶在對request對象進行增強時需要實現request接口中的所有方法。* 所以當需要增強request對象時,只需要寫一個類繼承HttpServletRequestWrapper類,然后在重寫需要增強的方法即可* 具體步驟:*1.實現與被增強對象相同的接口 *2、定義一個變量記住被增強對象*3、定義一個構造函數,接收被增強對象 4、覆蓋需要增強的方法 5、對于不想增強的方法,直接調用被增強對象(目標對象)的方法*/@Overridepublic String getParameter(String name) {String old_value=super.getParameter(name);String new_value=null;if(old_value!=null && !old_value.equals("")){try {new_value=new String(old_value.getBytes("ISO-8859-1"),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return new_value;}
    /**
    *解決request用戶參數為String[] 中文亂碼問題
    *
    */

    @Override
    public String[] getParameterValues(String name) {String[] old_value=request.getParameterValues(name);String[] new_value=new String[old_value.length];if(old_value!=null && !old_value.equals("")){String temp_value=null;for(int i=0;i<old_value.length;i++){try {temp_value=new String(old_value[i].getBytes("ISO-8859-1"),"UTF-8");new_value[i]=temp_value;} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}return new_value;}}
    • 注意:1.? 編碼過濾器應該作為web.xml中的第一個過濾器。

          2.  request.getMethod();得到的GET和POST是大寫的。

          3.  GET請求把數據放在網址中,例如:http://www.abc.com/index.php?a=1&b=2 其中?a=1&b=2就是get數據,并且連http://www.abc.com/index.php長度限制在1024個字。而post請求則是把數據放到http請求中,例如還是傳輸a=1&b=2,可是網址還是http://www.abc.com/index.php,比如表單的post提交,在網址上我們是看不到用戶輸入的數據的。

    •    解析:當提交表單的時候,request請求被EncodingFilter過濾器攔截,在這個過濾器中,首先判斷request請求是get還是post請求,如果是post請求,則直接
    request.setCharacterEncoding("UTF-8");設置編碼;如果是get請求,則用包裝類對request對象的getParameter方法重寫,然后把request請求傳到下一個過濾器( chain.doFilter(requestWrapper, response)), 這樣ActionGetPost.java中request對象的getParameter方法就是我們重寫后的方法了。

    ?

    轉載于:https://www.cnblogs.com/shyroke/p/6547442.html

    總結

    以上是生活随笔為你收集整理的(四)Decorator设计模式解决GET/POST请求的乱码问题(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲av无码一区二区三区性色 | 人人爱人人插 | 久久亚洲av午夜福利精品一区 | 色婷婷av一区二区三区之e本道 | 免费看欧美黑人毛片 | 男人的天堂avav | 波多野结衣视频观看 | 国产精品毛片久久久久久 | 午夜大片 | 久久久看 | 超碰在线免费97 | 国产视频a| 欧美老女人性视频 | 国产黄色大片 | 国久久久 | 黄色一级视频免费看 | 最近免费中文字幕 | 欧美少妇毛茸茸 | 一级欧美黄色片 | 综合亚洲视频 | 国产一级啪啪 | 天堂av一区| 手机av中文字幕 | 91午夜精品 | 九九九精品视频 | 色狠| 中文婷婷 | 久热欧美| 伊人久久大香线蕉综合网站 | 久久久a级片 | 自拍偷拍欧美亚洲 | 国产精品久久久久久久一区探花 | 美女黄页在线观看 | 精品一区二三区 | 日韩精品亚洲一区 | 久久99在线| 国产片网址 | 蜜桃av一区 | 国产丝袜美女 | 古装做爰无遮挡三级视频 | 亚洲精品成人无码熟妇在线 | 欧美日韩一区在线播放 | 玖玖玖在线观看 | 福利在线一区二区 | 欧美视频免费在线 | 久久久久无码国产精品一区李宗瑞 | 国产精品呻吟久久 | 国产午夜福利一区二区 | 亚洲成人偷拍 | 热热色原网址 | 国产欧美亚洲一区二区 | japan粗暴video蹂躏 | 久艹在线播放 | 99免费精品视频 | 琪琪电影午夜理论片八戒八戒 | 欧美性大战久久久久xxx | 亚洲成人免费看 | 99热在线这里只有精品 | 欧美三级在线视频 | 黄色私人影院 | 亚洲精品二区三区 | 免费在线观看黄色片 | 在线播放黄色av | 伊人影院在线播放 | 三年中文免费观看大全动漫 | 欧美精品一区二区三区在线播放 | 国产aⅴ爽av久久久久成人 | 色哟哟在线观看视频 | 久久久久久国产精品三区 | 国产乱人乱偷精品视频 | 欧美日韩亚洲国产精品 | 强辱丰满人妻hd中文字幕 | 污污网站免费在线观看 | 亚洲精品网址 | 欧美重口另类 | av一级大片| 欧美黑人精品一区二区 | 国产一级久久 | 黄色小视频免费网站 | 亚洲激情婷婷 | 性一交一乱一色一免费无遮挡 | 男男巨肉啪啪动漫3d | 91蝌蚪视频在线观看 | 高潮av| 特级黄色网 | 日韩一本在线 | 凹凸福利视频 | 一区二区福利视频 | 亚欧在线观看 | 亚洲女同女同女同女同女同69 | 色女综合 | 夜夜成人 | 精品一区二区三区免费看 | 国产精品久久久久不卡 | 卡一卡二在线视频 | 特级毛片在线 | 毛片免费一区二区三区 | 青青草精品视频 | 亚洲一区二区免费 |