在我之前的中文處理方式中是根據傳輸的本質對GET和POST方式進行不同處理,
今天學到了一個高級的處理方式,可以同時處理GET和POST方式
使用 設計模式中的裝飾設計模式 加 過濾器 進行處理,至於 裝飾設計模式和過濾器是什麼,可以自行百度,可能以後我會進行解析
在這裏簡單說 過濾器 就是在執行Servlet 之前先執行的一段代碼,請先明白過濾器是怎麼回事
以下就是使用裝飾設計模式解決亂碼問題,但是隻能解決請求亂碼,解決響應亂碼還是 response.setContextType("text/html;charset=utf-8");
根據之前我講的get請求的解決亂碼方式,請看我之前寫的亂碼原理講解
請求亂碼就是我們使用 request.getParameter(String name); 這個方法獲取值的時候,出現了錯誤,在這裏我用解決GET亂碼的方式一起解決GET和POST
自己對Request對象進行封裝,改變編碼
class MyRequest extends HttpServletRequestWrapper{
public MyRequest(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if(value==null){
return null;//在這裏需要進行空指針,不然在下面進行編碼轉換時會出現空指針異常
}
try {
byte[] buffer = value.getBytes("iso-8859-1");//這裏還是採用之前解決GET方式亂碼的思路
value = new String(buffer, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return value;
}
}
過濾器:攔截請求,改變編碼
public class CheckLoginFilter implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response,FilterChain chain) throws IOException, ServletException {
MyRequest request = new MyRequest((HttpServletRequest)req); //使用自定義的request 解決請求亂碼
response.setContentType("text/html;charset=utf-8");//原來的方式解決響應亂碼
chain.doFilter(request, response);//將自定義的request 傳到 Servlet 中,這時在Servlet中獲取的request就是我們自己處理過亂碼的
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}