1. 程式人生 > >通過裝飾者模式來增強request物件的getParameter()方法處理GET和POST的中文亂碼問題

通過裝飾者模式來增強request物件的getParameter()方法處理GET和POST的中文亂碼問題

在實際JAVA開發中會經常遇到中文亂碼,由於通過瀏覽器傳遞的引數是通過ISO8859-1進行編碼,在Controller接受之後,不處理直接輸出則顯示是亂碼。

  • 處理POST方式提交的中文 通過設定request物件的字符集來處理。
  • request.setCharacterEncoding("UTF-8");
  • 處理GET方式提交的中文
  • 由於GET提交方式通過傳參的方式提交資料,是不能通過設定字符集來出來,需要通過String物件來進行重新編碼,將ISO8859-1編碼進行解碼,再使用UTF-8進行編碼。
String value=super.getParameter(name);
value=new String(value.getBytes("ISO8859-1"),"UTF-8");

單個表單表單,我們可以通過這種直接的方式來出來,如果多個表單如何處理呢?難道一個一個在Servlet中去進行處理,這麼工作量也太大了。

解決思路

通過Filter類過濾器來進行來處理

第一步:新建一個增強類MyHttpServletReuqest 目的:用來增強HttpServletRequest類中的Request物件。 程式碼如下: 由於JAVA中已經內建了HttpServletRequest的裝飾類HttpServletRequestWrapper,我們只需要通過繼承方式來獲得裝飾類HttpServletRequestWrapper的方法,然後進行方式重寫。

public class MyHttpServletReuqest extends HttpServletRequestWrapper {
	//將HttpServletRequest 定義為MyHttpServletReuqest 的屬性request
	private HttpServletRequest request;
	public MyHttpServletReuqest(HttpServletRequest request){
		super(request);
		this.request=request;
	}

	@Override
	public String getParameter(String name) {
		//獲得請求方法
		String method=request.getMethod();
		if("GET".equalsIgnoreCase(method)){
			String value=super.getParameter(name);
				try {
					value=new String(value.getBytes("ISO8859-1"),"UTF-8");
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				return value;
			
		}else if("POST".equalsIgnoreCase(method)){
			try {
				//設定request的字符集
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
			}
		}
		return super.getParameter(name);
	}
}

第二步:新建一個通用的字符集編碼過濾器

public class GenericEncodingFilter implements Filter{

	@Override
	public void destroy() {
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		//在過濾器中增強Request物件,將request作為引數傳給增強類
		HttpServletRequest reqs=(HttpServletRequest) req;
		MyHttpServletReuqest request=new MyHttpServletReuqest(reqs);
		chain.doFilter(request, resp);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}

}

第三步:在工程配置檔案web.xml中配置字符集編碼過濾器GenericEncodingFilter

  <filter>
    <filter-name>GenericEncodingFilter</filter-name>
    <!--這是GenericEncodingFilter類的全路徑-->
    <filter-class>Filter.GenericEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GenericEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

第四步:在控制器中新建一個PostGetmethod類 該類用來接收表單遞交的。

public class PostGetmethod extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username=request.getParameter("username");
		System.out.println(username);
		request.getRequestDispatcher("/Filter/demo4.jsp").forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

第五步:在工程配置檔案(web.xml)中配置PostGetmethod類

  <servlet>
    <description></description>
    <servlet-name>PostGetmethod</servlet-name>
    <!--這裡是類PostGetmethod的路徑-->
    <servlet-class>FrontController.PostGetmethod</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PostGetmethod</servlet-name>
    <url-pattern>/PostGetmethod</url-pattern>
  </servlet-mapping>

第六步:新建一個測試檔案demo.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>
	<div>
		<h2>Get方式提交表單</h2>
		<form action="${pageContext.request.contextPath}/PostGetmethod" method="get">
			<label>使用者名稱:</label><input name="username" value="" /><br />
			<button type="submit">提交</button>
		</form>
	</div>
	<div>
		<h2>POST提交表單</h2>
		<form action="${pageContext.request.contextPath}/PostGetmethod" method="post">
			<label>使用者名稱:</label><input name="username" value="" /><br />
			<button type="submit">提交</button>
		</form>
	</div>
</body>
</html>

測試結果: 在這裡插入圖片描述 執行結果: 在這裡插入圖片描述

整個過程的工作原理是: 在這裡插入圖片描述