日韩性视频-久久久蜜桃-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请求的乱码问题(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 日韩欧美黄色 | 欧美日韩极品 | 毛片的网站 | 一区二区三区啪啪啪 | 波多野结衣在线免费视频 | 91色爱| 黄色网址在线免费 | 91大奶| 日韩国产精品一区二区 | 新版红楼梦在线高清免费观看 | 网红日批视频 | 一区二区三区黄色片 | 成人爱爱网站 | 精品免费国产一区二区三区四区 | 精品久久二区 | 日本一区中文字幕 | 国产一区二区av在线 | 丝袜老师扒开让我了一夜漫画 | 野花中文免费观看6 | 午夜精品久久久 | 中文字幕8 | 国产美女激情 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 少妇高潮一69aⅹ | 日本一二三区在线 | av免费精品 | jizz处女| 在线一区二区三区四区五区 | 深夜激情影院 | 亚洲精品高清视频在线观看 | av免费资源| 白浆av| 婷婷6月天 | 精品国产乱码久久久久 | 欧美日韩一区二区三区视频 | 精品久久人人妻人人做人人 | 献给魔王伊伏洛基亚吧动漫在线观看 | 国产亚洲电影 | 不卡视频在线观看免费 | 老司机精品视频在线 | 黑人极品ⅴideos精品欧美棵 | 嫩草在线播放 | 公肉吊粗大爽色翁浪妇视频 | 第一色综合 | 日本午夜影院 | 美女黄18以下禁止观看 | 精品人妻人人做人人爽夜夜爽 | 中文字幕成人av | 亚洲免费高清视频 | aaaaa一级片| 日韩精品一区二区免费视频 | 天天操人人爽 | 91精品国产一区二区 | 欧美巨鞭大战丰满少妇 | feel性丰满白嫩嫩hd | 久久不卡影院 | 久草视频福利在线 | av毛片在线免费观看 | 国产综合区 | 深夜福利网站在线观看 | 日韩看片 | 一出一进一爽一粗一大视频 | 亚洲一级片 | 国产一区二区网站 | 天堂视频在线观看免费 | 91免费网| 久草三级| 日本a在线观看 | 欧美sese | 欧美精品一区二区三区在线播放 | 国产精品视频第一页 | 99热综合| 久久草网站 | 日韩精品在线一区二区 | 欧美一区二区三区视频在线 | 成人hd| 久在线 | 午夜在线观看一区 | 国产97在线观看 | 污片视频在线观看 | 午夜影院久久久 | 天天色综合影视 | 欧美巨大乳 | 毛片全黄 | 老地方在线观看免费动漫 | 免费h片网站 | 狠狠干一区二区 | 麻豆av电影在线 | 成人午夜在线播放 | 一区二区三区天堂 | 国产福利电影在线 | 欧美成人午夜电影 | 亚洲国产中文字幕在线观看 | 久久精品不卡 | 蜜桃av在线免费观看 | 激情综合一区二区三区 | 小泽玛利亚在线 | 亚洲丝袜在线观看 | 天堂久久av |