jsp中EL表示式顯示時中文亂碼和過濾器解決請求中文亂碼
阿新 • • 發佈:2018-12-31
一,jsp中EL表示式顯示時中文亂碼
我是通過url請求將一個jsp的值傳到另一個jsp,結果在另一個jsp顯示時出現中文亂碼。
分析問題:由於URL請求沒有設定編碼格式所以解析響應時會出現中文亂碼
解決方法:在Tomcat的conf資料夾中的server.xml檔案中修改:
<Connector port="8088" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
將編碼格式改成utf-8,則URL傳遞的值就是utf-8格式的,就不會出現亂碼。我的專案都是用的utf-8編碼,所以我這邊也用utf-8,如果你的專案是gbk編碼,則改成gbk編碼,保持與專案編碼一致。
二,過濾器解決請求中文亂碼
首先要在配置檔案裡面新增過濾器如下圖
一下程式碼可以作為工具類使用
package cn.itcast.web.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; 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; /** * 統一編碼 * @author Administrator * */ public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { //1.強轉 HttpServletRequest request=(HttpServletRequest) req; HttpServletResponse response=(HttpServletResponse) resp; //2.放行 chain.doFilter(new MyRequest(request), response); } @Override public void destroy() { // TODO Auto-generated method stub } } class MyRequest extends HttpServletRequestWrapper{ private HttpServletRequest request; private boolean flag=true; public MyRequest(HttpServletRequest request) { super(request); this.request=request; } @Override public String getParameter(String name) { if(name==null || name.trim().length()==0){ return null; } String[] values = getParameterValues(name); if(values==null || values.length==0){ return null; } return values[0]; } @Override /** * hobby=[eat,drink] */ public String[] getParameterValues(String name) { if(name==null || name.trim().length()==0){ return null; } Map<String, String[]> map = getParameterMap(); if(map==null || map.size()==0){ return null; } return map.get(name); } @Override /** * map{ username=[tom],password=[123],hobby=[eat,drink]} */ public Map<String,String[]> getParameterMap() { /** * 首先判斷請求方式 * 若為post request.setchar...(utf-8) * 若為get 將map中的值遍歷編碼就可以了 */ String method = request.getMethod(); if("post".equalsIgnoreCase(method)){ try { request.setCharacterEncoding("utf-8"); return request.getParameterMap(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else if("get".equalsIgnoreCase(method)){ Map<String,String[]> map = request.getParameterMap(); if(flag){ for (String key:map.keySet()) { String[] arr = map.get(key); //繼續遍歷陣列 for(int i=0;i<arr.length;i++){ //編碼 try { arr[i]=new String(arr[i].getBytes("iso8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag=false; } //需要遍歷map 修改value的每一個數據的編碼 return map; } return super.getParameterMap(); } }