servlet的xx方式传值中文乱码

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //POST提交解决乱码的方式   与GET方式不同的是请求new String(nameParam.getBytes("iso8859-1"), "UTF-8");   响应是相同的
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        String nameParam = req.getParameter("name");//很奇怪  form表单获取的数据 乱码
        //一般情况下,服务器默认的编码是“iso8859-1”,所以我们需要数据还原,然后再转换成UTF-8的形式
        //不允许我去转呀  报错---解决:修改tomcat的server.xml文件  添加  URIEncoding="UTF-8" useBodyEncodingForURI="true"  哈哈 完美解决 好累
        //nameParam = new String(nameParam.getBytes("iso8859-1"), "UTF-8");

        System.out.println("找到了:"+ nameParam);//第一次进来null  输入店员姓名 点击查询 输出???é??

具体三种方式解决:------------第三种完美解决 也正是大家不太熟悉的方法   不知看到此文后你的问题有没有解决哪?

方法一: get方式提交的参数编码,只支持iso8859-1编码。因此,如果里面有中文。在后台就需要转换编码,如下 
      String bname = request.getParameter("bname"); 
      bname = new String(bname .getBytes("iso8859-1"),"utf-8"); 
      前提是你页面编码就是utf-8,如果是gbk,那上面那句代码后面就改成gbk。 
      But修改后我的问题仍没解决,继续。。。

方法二:在客户端使用 URLEncoder.encode(“中文”,”UTF-8”)对中文参数进行编码,在服务器端需要进行解码this.setName(java.net.URLDecoder.decode(name, “UTF-8”)); 
比较麻烦!

方法三:修改tomcat的server.xml文件: 

       <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />

    在其中添加URIEncoding="UTF-8" useBodyEncodingForURI="true"这一句。我使用的tomcat8,之前没有添加useBodyEncodingForURI="true",所以还是乱码,添加后问题解决!

 

当然 每次Servlet中总会有各种各样的中文请求,为了避免在每个Servlet种都添加request.setCharacterEncoding(“utf-8”)或者response.setCharacterEncoding(“utf-8”),为此可以考虑添加一个中文过滤器  具体代码如下:

1.web.xml

    <filter>
        <filter-name>CharsetEncodingFilter</filter-name>
        <filter-class>com.pers.hoobey.filter.CharsetEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <!-- 指定字符编码为UTF-8 -->
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharsetEncodingFilter</filter-name>
        <!-- 过滤所有的jsp页面的请求 -->
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

2.CharsetEncodingFilter

//采用filter统一处理字符集
public class CharsetEncodingFilter implements Filter {
    private String encodeString;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从init-param中获取param-name为encoding参数的值
        encodeString = filterConfig.getInitParameter("encoding");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("begin");
        // 设置字符集
        request.setCharacterEncoding(encodeString);
        // 继续向下执行,如果还有其他filter继续调用其他filter,没有的话将消息发送给服务器或客户端
        chain.doFilter(request, response);
        System.out.println("end");
    }

    @Override
    public void destroy() {
    }
}

 

posted @ 2017-12-14 10:11  starskyhu  阅读(294)  评论(0编辑  收藏  举报