`
wangyanlong0107
  • 浏览: 480480 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】JSP中request.getParameter()乱码问题

 
阅读更多

第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。

从.java->.class过程是,先编写.java文件并按莫种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。

从.jsp->.java->.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java->.class过程。

第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,这也是eclipse的聪明之处。

第三,
pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。
contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码,相当于 
response.setContentType("text/html;charset=UTF-8");。例如:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>test</title>
</head>
<body>
我是个好人
</body>
</html>
会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。

至此,页面应为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>中文问题</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</html>

第四,
request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式,
本质是加的http报头

第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(
tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5以后get提交方法用此语句无效)。
1,post提交的数据: 
程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器. 
<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
<init-param> 
<param-name>encoding</param-name> 
<param-value>UTF8</param-value> 
</init-param> 
<init-param> 
<param-name>forceEncoding</param-name> 
<param-value>true</param-value> 
</init-param> 
</filter> 

<filter-mapping> 
<filter-name>encodingFilter</filter-name> 
<url-pattern>*.html</url-pattern> 
</filter-mapping> 
<filter-mapping> 
<filter-name>encodingFilter</filter-name> 
<url-pattern>*.jsp</url-pattern> 
</filter-mapping> 

因为
规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8. 

特别注意: 
a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding); 
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放. 
b,
在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过. 

如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal([url]http://www.ethereal.com/[/url]

2,get提交的数据: 
两种情况: 
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用 
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 
取出 
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的 
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中: 
<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --> 
<Connector port="8080" 
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
enableLookups="false" redirectPort="8443" acceptCount="100" 
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true" 
disableUploadTimeout="true" /> 

加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容. 
如果content="text/html; charset=GBK",需用 
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK") 
取出,其他情况类似. 

总结: 
1,所有页面使用utf8编码, 
2,服务器加上过滤器, 
3,server.xml中不要使用 
<Valve className="org.apache.catalina.valves.RequestDumperValve"/> 
4,server.xml文件加上useBodyEncodingForURI="true" 
这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求 
从这里输入.

第六,连接数据库 

1、mysql配置文件:
修改mysql在windows\my.ini里default-character-set=utf-8

2、mysql里数据库和表也都设为utf8_unicode_ci

3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,关键就在于此:此句中间是'&'不是'&'这是因为数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中需要用&

对于Web容器来说,如果你不设置,默认是ISO8859-1
String des = new String(s.getBytes("iso8859-1"),"UTF-8");都可以使用这个 不论哪里,有乱码就是用。

====================================================================

最近在准备考试系统的开发,碰到了 request.getParameter乱码的问题。跟林彬讨论了一下,还是觉得用老方法管用。

如果是post的话,可以通过设置filter的方法来解决

如果是get或者是超链接的话,以前是通过设置tomcat的配置文件server.xml来解决的,但这样不好,并不是所有的项目,我们都可以修改到服务器的tomcat的配置文件。具体代码如下:

   1: Connector port="8080" maxHttpHeaderSize="8192"
   2:                maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
   3:                enableLookups="false" redirectPort="8443" acceptCount="100"
   4:                connectionTimeout="20000" disableUploadTimeout="true" uRIEncoding="gbk"/>
还是觉得老方法管用,只是有点麻烦:

 

     1: String id=new String(request.getParameter("id").getBytes("ISO8859-1"),"UTF-8");

   2: String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");

 

分享到:
评论

相关推荐

    JSP用过滤器解决request getParameter中文乱码问题.docx

    JSP用过滤器解决request getParameter中文乱码问题.docx

    数据库测试test.sql

    request.getRequestDispatcher("/admin/register.jsp").forward(request,response); return; } //2.调用业务层完成注册操作并返回结果 User user = new User(userId,realName,pwd,age, Arrays.toString...

    JSP用过滤器解决request getParameter中文乱码问题

    (2)用过滤器解决request中文乱码问题。 (3)代码如下: package my; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ChineseFilter implements Filter { //定义了一个...

    多文件上传例子(解决中文乱码)

    多文件上传例子,彻底解决中文乱码问题了。...4、适当的时候,在jsp里用java.net.URLDecoder.decode(request.getParameter("str"),"UTF-8")。 5、最容易忽略的是使用"":value="&lt;%=paraFiles%&gt;",一定要有引号。

    jsp解析

    jsp指令:...解决中午乱码问题: request.setCharacterEncoding("utf-8"); 获取页面数据: String name=request.getParameter(""); String[] names=request.getParameterValues(""); 转发,可以保留值:

    jspSmartUpload

    jsp SmartUpload 组件,经过测试,保证解决上传中文文件名乱码的问题。里面有六个.java文件(ServletUpload.java;SmartFile.java;SmartFiles.java;SmartRequest.java;SmartUpload.java;SmartUploadException.java) ...

    JSP利用过滤器解决request中文乱码问题

    本文为大家分享了JSP用过滤器解决request中文乱码问题,具体内容如下 (1)客户端的数据一般是通过HTTP GET/POST方式提交给服务器,在服务器端用request.getParameter() 读取参数时,很容易出现中文乱码现象。 (2...

    Jsp中request的3个基础实践

    本文包含request内置对象的使用、乱码处理的两种方法、使用request.getParamter()方法获取表单提交的数据、采用request对象通过getParameter()方法和getParameterValues()方法获取表单请求数据、使用request内置对象...

    jsp九大内置对象

     当Request对象获取客户提交的汉字字符时,会出现乱码问题,必须进行特殊处理。首先,将获取的  字符串用ISO-8859-1进行编码,并将编码存发岛一个字节数组中,然后再将这个数组转化为字符串对象  即可。如下:...

    1234阿塞企业网站系统

    sql = "insert department values('" + request.getParameter("depName") + "')"; if (stmt.executeUpdate(sql) &gt; 0) { response.sendRedirect("DepList.jsp"); //response对象见第四章,连接到memCenter.jsp页面 ...

    escape函数解决js中ajax传递中文出现乱码问题

    8859-1字符集进行url编码的,那样通过 request.getparameter()是能直接获取到请求参数的,但后来的javascript将escape()换成了unicode字符集编 码,如此一来,在jsp教程和servlet中就没法直接拿到请求参数了,具体...

    jsp中 ajax的get请求的中文乱码问题的解决方法

    一般Tocant 的url编码是iso-8859-1(查看tocat/conf/server.xml 中的Connector 节点没有写URIEncoding=”xxxxxx”) 如下...如果我们在servlet 中写如下的代码 代码如下: String username = request.getParameter(“name

    office在线查看

    String getFilePath = request.getParameter("recFileName"); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %&gt; &lt;!DOCTYPE ...

    fckedit编辑器

    编辑器 FCKeditor2.4 使用说明 ...问题三: 上传时新建的中文目录全部乱码 虽然上传到服务器上的文件名正常,但在JSP页面点下载链接时文件名乱码导致不能正常下载 查找资料:TOMCAT 链接参数有中文时,乱码解决方法 ...

Global site tag (gtag.js) - Google Analytics