1. 程式人生 > >jsp中EL表示式顯示時中文亂碼和過濾器解決請求中文亂碼

jsp中EL表示式顯示時中文亂碼和過濾器解決請求中文亂碼

一,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();
	}
	
}