jsp servlet 编码问题

jsp servlet 中编码问题主要发生在——中文请求和响应过程出现编码、解码不一致而导致的乱码!

好纠结的一句话! = =!

不过真的要理清楚还是不容易的。

首先先看看jsp和servlet中那些地方设计到编码的设置,共有4个地方:

1.jsp中设置的pageEncoding="***"

2.jsp中设置的contentType="text/html; charset=***"

3.servlet或jsp中设置的request.setCharacterEncoding("***");

4.servlet或jsp中设置的response.setCharacterEncoding("***");

 

 

1是设置jsp转换到servlet的编码方式;

3是服务器接收数据的编码凡是;

其中2和4效果是一致的,是对服务器的响应的编码。

 

下面就举几个例子,逐步说明这个纠结的编码问题:

 

第一步:form以post方式提交中文,提交到自身页面进行响应。

说明:这里并未给出完整的代码,而是给出关键代码。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>

...

 <form action="servletEncoding/jsp2jsp.jsp" method="post">

//提交到自身页面
        param:<input type="text" name="p1">
        <br>
        <input type="submit" value="submit">
   </form>

...

 数据处理:
    <%
        String p1 = request.getParameter("p1");
    %>
    <%=p1 %>

运行,结果乱码!

 =.=!

为什么?应该是服务器默认接收参数的编码不是utf-8导致的,此处我们可以指定服务器接收参数的编码方式:

在所有的request.getParameter("***")之前加上一句

request.setCharacterEncoding("utf-8");就ok了!

 

总结:form以post方式提交参数,设置contentType和request.setCharacterEncoding相同的编码就好了!

 

第二步:form以get方式提交中文。

还是之前的代码,将form中的method改为post,再运行一次!

omg! = =! 乱码又出现了~

为什么?这是因为默认情况下tomcat等服务器是使用iso-8859-1对url或者get方式提交的数据进行编码的,即使设置了request.setCharacterEncoding也是无济于事的。

那么该怎么办?

<Connector port="8080" ... useBodyEncodingForURI="true" />
useBodyEncodingForURI 告诉服务器解码URL时候需要采用request指定的编码(即:request.setCharacterEncoding();)

 

总结:服务器接收参数一般就三种方式:url、get、post。post可以通过request.setCharacterEncoding即可,get和url通过修改tomcal的server.xml配置文件(useBodyEncodingForURI="true"),也可利用request.setCharacterEncoding()的方式指定接收参数的编码方式。

对于url和get方式提交参数还可以通过修改:URIEncoding属性。URIEncoding参数指定对所有GET方式请求(包括URL提交的数据和表单中GET方式提交的数据)进行统一的重新编码(解码)的编码。 URIEncoding和useBodyEncodingForURI区别是,URIEncoding是对所有GET方式的请求的数据进行统一的重新编码 (解码),而useBodyEncodingForURI则是根据响应该请求的页面的request.setCharacterEncoding参数对数 据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。所以对于URL提交的数据和表单中GET方式提交的数据,可以修改 URIEncoding参数为浏览器编码或者修改useBodyEncodingForURI为true,并且在获得数据的JSP页面中 request.setCharacterEncoding参数设置成浏览器编码。

这里个人喜欢将useBodyEncodingForURI设置成true,这样对于三种参数提交方式在编码上就得到了统一,都必须使用request.setCharacterEncoding。

 

好了~

网上还有总结的比较精辟的:

下面总结下,以Tomcat5.0为WEB服务器时(tomcat6.0也是一样的哇 = =!),如何防止中文乱码。

1、对于同一个应用,最好统一编码,推荐为UTF-8,当然GBK也可以。

2、正确设置JSP的pageEncoding参数

3、在所有的JSP/Servlet中设置contentType="text/html; charset=UTF-8"或response.setCharacterEncoding("UTF-8"),从而间接实现对浏览器编码的设置。

4、对于请求,可以使用过滤器或者在每个JSP/Servlet中设置 request.setCharacterEncoding("UTF-8")。同时,要修改Tomcat的默认配置,推荐将 useBodyEncodingForURI参数设置为true,也可以将URIEncoding参数设置为UTF-8(有可能影响其他应用,所以不推荐)。

 

 

 

 

 

你可能感兴趣的:(tomcat,jsp,servlet,浏览器,服务器,url)