(四)Decorator设计模式解决GET/POST请求的乱码问题(转)
生活随笔
收集整理的這篇文章主要介紹了
(四)Decorator设计模式解决GET/POST请求的乱码问题(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、Decorator設(shè)計模式
?
1.1、Decorator設(shè)計模式介紹
- 當(dāng)某個對象的方法不適應(yīng)業(yè)務(wù)需求時,通常有2種方式可以對方法進(jìn)行增強:
- 裝飾(Decorator)模式:裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關(guān)系的一個替代方案。裝飾模式是在不必改變原類文件和使用繼承的情況下,動態(tài)的擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。
?
- 那么在實際應(yīng)用中遇到需增強對象的方法時,到底選用哪種方式比較好呢?這個沒有具體的定式,只能是根據(jù)具體的需求來采用具體的方式,不過有一種情況下,必須使用Decorator設(shè)計模式:即被增強的對象,開發(fā)人員只能得到它的對象,無法得到它的class文件。比如request、response對象,開發(fā)人員之所以在servlet中能通過sun公司定義的HttpServletRequest\response接口去操作這些對象,是因為Tomcat服務(wù)器廠商編寫了request、response接口的實現(xiàn)類。web服務(wù)器在調(diào)用servlet時,會用這些接口的實現(xiàn)類創(chuàng)建出對象,然后傳遞給servlet程序。此種情況下,由于開發(fā)人員根本不知道服務(wù)器廠商編寫的request、response接口的實現(xiàn)類是哪個?在程序中只能拿到服務(wù)器廠商提供的對象,因此就只能采用Decorator設(shè)計模式對這些對象進(jìn)行增強。
?
1.2、Decorator設(shè)計模式的實現(xiàn)
1.首先看需要被增強對象繼承了什么接口或父類,編寫一個類也去繼承這些接口或父類。 2.在類中定義一個變量,變量類型即需增強對象的類型。 3.在類中定義一個構(gòu)造函數(shù),接收需增強的對象。 4.覆蓋需增強的方法,編寫增強的代碼。
?
二、使用Decorator設(shè)計模式增強request對象
- Servlet API 中提供了一個request對象的Decorator設(shè)計模式的默認(rèn)實現(xiàn)類HttpServletRequestWrapper,HttpServletRequestWrapper 類實現(xiàn)了HttpServletRequest接口中的所有方法,但這些方法的內(nèi)部實現(xiàn)都是僅僅調(diào)用了一下所包裝的的 HttpServletRequest對象的對應(yīng)方法,以避免用戶在對request對象進(jìn)行增強時需要實現(xiàn)request接口中的所有方法。
- HttpServletRequestWrapper 關(guān)系圖如下,可見HttpServletRequestWrapper實現(xiàn)了HttpServletRequest接口繼承了ServletRequestWrapper類,而HttpServletRequest接口繼承了ServletRequest所有的方法,其中包括getParameter()相關(guān)方法。HttpServletRequestWrapper中的getParameter方法內(nèi)部僅僅調(diào)用了所包裝的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/>密 碼:<input type="password" name="passWd"/><br/>愛 好:<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/>密 碼:<input type="password" name="passWd"/><br/>愛 好:<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() {}/*** 要解決亂碼問題首先區(qū)別對待POST方法和GET方法,* 1.如果是POST方法,則用request.setCharacterEncoding("UTF-8"); 即可* 2.如果是GET方法,則麻煩一些,需要用decorator設(shè)計模式包裝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方法進(jìn)行覆蓋。*/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設(shè)計模式的默認(rèn)實現(xiàn)類HttpServletRequestWrapper,* (HttpServletRequestWrapper類實現(xiàn)了request接口中的所有方法,但這些方法的內(nèi)部實現(xiàn)都是僅僅調(diào)用了一下所包裝的的* request對象的對應(yīng)方法) 以避免用戶在對request對象進(jìn)行增強時需要實現(xiàn)request接口中的所有方法。* 所以當(dāng)需要增強request對象時,只需要寫一個類繼承HttpServletRequestWrapper類,然后在重寫需要增強的方法即可* 具體步驟:*1.實現(xiàn)與被增強對象相同的接口 *2、定義一個變量記住被增強對象*3、定義一個構(gòu)造函數(shù),接收被增強對象 4、覆蓋需要增強的方法 5、對于不想增強的方法,直接調(diào)用被增強對象(目標(biāo)對象)的方法*/@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用戶參數(shù)為String[] 中文亂碼問題
*
*/
@Overridepublic 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.? 編碼過濾器應(yīng)該作為web.xml中的第一個過濾器。
2. request.getMethod();得到的GET和POST是大寫的。
3. GET請求把數(shù)據(jù)放在網(wǎng)址中,例如:http://www.abc.com/index.php?a=1&b=2 其中?a=1&b=2就是get數(shù)據(jù),并且連http://www.abc.com/index.php長度限制在1024個字。而post請求則是把數(shù)據(jù)放到http請求中,例如還是傳輸a=1&b=2,可是網(wǎng)址還是http://www.abc.com/index.php,比如表單的post提交,在網(wǎng)址上我們是看不到用戶輸入的數(shù)據(jù)的。
- 解析:當(dāng)提交表單的時候,request請求被EncodingFilter過濾器攔截,在這個過濾器中,首先判斷request請求是get還是post請求,如果是post請求,則直接
?
轉(zhuǎn)載于:https://www.cnblogs.com/shyroke/p/6547442.html
總結(jié)
以上是生活随笔為你收集整理的(四)Decorator设计模式解决GET/POST请求的乱码问题(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小明学习Linux运维课后习题实战A
- 下一篇: 解决QT出现XXXX.dll不能加载问题