通過裝飾者模式來增強request物件的getParameter()方法處理GET和POST的中文亂碼問題
阿新 • • 發佈:2018-12-18
在實際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>
測試結果: 執行結果:
整個過程的工作原理是: