当前位置: 首页 > Java > 正文

jsp 乱码解决案例

关键字:
1 星2 星3 星4 星5 星 (暂无评分)
Loading ... Loading ...
baidu_share

当时情况是这样的,jsp表单提交到spring 的controller,打印参数(中文)是乱码。但你调试的时候,用鼠标移到变量,正常显示中文。

当时,我就懵了,这是咋了,遇到人品问题了?,关闭eclipse,重新进入问题依旧。当时我的jsp页面是UTF8编码,服务端也是UTF8编码,也用spring做了编码过滤。post提交。项目用maven创建,服务器为jetty。

        <filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

页面用jquery ajax方法提交,怀疑是不是jquery的问题,导致乱码,折腾了一番,问题依旧。

于是查了一些资料,用System.getProperty(“file.encoding”)得到结果为GBK。用此方法在服务端和jsp页面得到结果都为GBK。

当时就郁闷了,服务端和jsp都是UTF-8编码,能出啥问题呢。换用tomcat做服务器,用System.getProperty(“file.encoding”)得到结果为UTF8,看来问题出在jetty服务器了。

当时用的maven-jetty-plugin版本为6.1.20(该版本一直做开发调试,未出现过问题),怀疑版本太低了,升级到高版本。pom.xml配置:

<plugin>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>9.0.4.v20130625</version>
				<configuration>
					<scanIntervalSeconds>10</scanIntervalSeconds>					
					<webAppSourceDirectory>${basedir}/webapp</webAppSourceDirectory>					
					<webApp>						
						<contextPath>/manager</contextPath>						
						<descriptor>${basedir}/webapp/WEB-INF/web.xml</descriptor>
						<!--  设置默认webdefault.xml,这个主要是为了禁止jetty启动之后,锁定文件.需要修改webdefault.xml里面的useFileMappedBuffer属性为false-->
						<defaultsDescriptor>src/test/resources/webdefault.xml</defaultsDescriptor>
					</webApp>
					<httpConnector>
						<port>8080</port>
					</httpConnector>
				</configuration>
			</plugin>

升级到高版本问题,依旧。最后终于找到答案,在eclipse 配置jetty 启动时,在MAVEN_OPTS值域添加-Dfile.encoding=UTF-8。这样就可以让jetty 服务器按UTF8编码了。

-Dfile.encoding=UTF-8 -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=4000,server=y,suspend=n

jetty服务器默认编码是操作系统编码,所以就为GBK了。

关于eclipse下maven jetty调试,可以参考以前的文章:
eclipse maven jetty js调试
eclipse maven jetty运行程序配置

备注:spring CharacterEncodingFilter只能对post提交做UTF8过滤,而对get方法无能为力。因为get方法是通过http header传递过去的。post方法是通过http body传递。

org.springframework.web.filter.CharacterEncodingFilter源码:

request.setCharacterEncoding(this.encoding);

而该方法的说明:
Overrides the name of the character encoding used in the body of this request. This method must be called prior to reading request parameters or reading input using getReader().

get方法带中文提交,可以先用js的encodeURI(中文)或者encodeURIComponent(中文),再提交,服务端decode。或者在服务端用编码转换得到中文。

                try{
			String s=new String(para.getBytes("ISO-8859-1"),"utf8") ;
			System.out.print(s);
		}catch(Exception e){
 
		}

本文固定链接: http://www.chepoo.com/jsp-garbled-solve-cases.html | IT技术精华网

jsp 乱码解决案例:等您坐沙发呢!

发表评论