javaweb解决全站字符编码

首先创建一个javaweb的项目,在index.jsp里面修改如下代码.
<body>
    <a href="<c:url value='/AServlet?username=董老师你好呀!'/>">GET</a>
    <form action="<c:url value='/AServlet'/>" method="post">
    	用户名:<input type="text" name="username"/>
    	<input type="submit" name="提交"/>
    </form>
  </body>

在浏览器打开如图所示,点击提交按钮就是发送的post请求,点击GET是提交get请求.


然后创建一个AServlet实现doGet和doPost方法.

package cn.com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");    //获取username并打印
		response.getWriter().print("GET-->username: " + username);    
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String username = request.getParameter("username");
		response.getWriter().print("POST-->username: " + username);
	}
}

此时若去提交表单会出现字符编码的问题,会出现提交中文时出现乱码,打印出乱码.


然后我们创建一个CharSetFilter的过滤器,    /* 处理编码全部过滤.


CharSetFilter的代码实现.

package cn.com.servlet;

import java.io.IOException;
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;
/**
 * 处理全站编码问题
 */
public class CharSetFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");			//只处理了post请求
		response.setContentType("text/html;charset=utf-8");	//处理响应的编码
		
		chain.doFilter(req, response);    //放行
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}
}

至此post请求的编码解决了.



下面处理get的编码请求.


创建一个CharSetRequest的类并继承HttpServletRequest这个接口.


CharSetRequest类的代码如下,CharsetRequest继承HttpServletRequest接口的类创建好后代码会很多,我们修改它的接口,改成装饰者模式,就是继承一个HTTPServletRequestWrapper,从而实现装饰者模式,这个类会帮我们完成很多底层的方法,我们只需要给它传递一些参数即可.

然后通过增强getParameter来实现get的编码问题.

package cn.com.servlet;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpSession;

public class CharSetRequest extends HttpServletRequestWrapper {
	
	public CharSetRequest(HttpServletRequest request){
		super(request);	//调用父类的构造器,给父类传递底层对象
	}
	
	/*
	 * 增强getParameter()方法
	 * (non-Javadoc)
	 * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
	 */
	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);
		//判断当前的请求方式,如果为GET
		//需要回退,再重解 
		if (getMethod().equalsIgnoreCase("GET")) {
			try {
				value = new String(value.getBytes("iso-8859-1"),"utf-8");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return value;
	}
}

最后修改CharSetFilter的过滤器的代码,把request做为底层对象传过去,放行时调包处理.

//创建山寨版的request

通过CharSetRequest req = new CharSetRequest((HttpServletRequest)request);

package cn.com.servlet;

import java.io.IOException;
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;
/**
 * 处理全站编码问题
 */
public class CharSetFilter implements Filter {
	public void destroy() {

	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");			//只处理了post请求
		response.setContentType("text/html;charset=utf-8");	//处理响应的编码
		
		//用来处理get请求
		//创建山寨版的request
		CharSetRequest req = new CharSetRequest((HttpServletRequest)request);
		//放行时将request改为req,调包处理.
		chain.doFilter(req, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}
}

至此get的编码处理完成了.






猜你喜欢

转载自blog.csdn.net/superman___007/article/details/80713940
今日推荐