木其工作室代写程序 [原]java web项目各种乱码的解决方案
作者: 永恒の_☆ 地址: http://blog.csdn.net/chenghui0317/article/details/10299103
一、前言
目前web项目中,很多乱码情况没有得到统一解决,或多或少影响开发效率和延长开发时间, 所以总结一下关于java web项目各种乱码情况的解决方案。
二、准备条件
1、一个普通的web项目 webProject;
2、一个web服务器 Tomcat。
三、分析各种乱码的情况
1、项目的编码格式和页面文件的编码格式不一样是否有冲突?
答:webProject项目的编码格式是“GBK” ,项目下的页面中的编码格式是“UTF-8”,实践发现,项目的编码格式和页面的编码格式不一样不会有任何问题,显示的中文没有乱码。
查看项目的编码格式可以在 项目-->右键-->Properties--> Text file encoding 框内显示的具体值就是项目编码格式。
查看页面文件的编码格式可以在 页面-->右键-->Properties--> Text file encoding 框内显示的具体值就是页面文件的编码格式。
2、页面的文件编码格式和页面内容的编码格式不一样是否有冲突?
答:<1>将页面文件编码格式改为“UTF-8”,页面的内容的编码格式改为“GBK”,具体如下:
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
测试中文是否乱码!@#!@#
</body>
</html>
结果发现 乱码了,具体效果如下:
所以页面的文件的编码格式必须和页面内容的编码格式一样,否则显示肯定乱码。
<2>另外,如果页面中格式在eclipse显示 是好的,这个时候改变文件的编码格式也会乱码,如果非要改变文件编码的格式,可以这样: 先将显示正确的内容复制一份 然后修改文件的编码格式,这个时候文件内显示的是乱码,然后将复制的内容直接覆盖在这个页面中就好了。
<3>如果给将上面代码的pageEncoding改为"UTF-8"了发现显示正常了,所以可不可以这么说,页面显示是否乱码与charset指定的值无关?
<4>但是如果将上面代码的pageEncoding="UTF-8“这个属性直接去掉,然后显示效果,发现乱码了。 如果把contentType属性的值改为 contentType="text/html; charset=UTF-8" 试试效果,具体如下:
所以可以这么理解:在没有指定pageEncoding属性的时候, charset 将会被忽略,如果没有指定pageEncoding属性,那么页面就会按照charset的编码值来显示具体效果。
<5>如果charset指定的值是GBK ,这个时候由于没有pageEncoding 所以页面内容按照GBk编码显示,但是与文件编码格式不符合 ,索引导致乱码。具体效果如下:
<6>现在又有另外一种情况,如果pageEncoding指定了UTF-8 ,但是charset指定的是 GBK ,GB2312 这个时候页面显示不会乱码。
<7>但是如果charset指定的是iso-8859-1,这个时候页面显示就是乱码了,具体效果如下:
<8>但是如果charset指定的是big5,这个是页面显示只是部分乱码,具体效果如下:
所以BIG5只会会繁体或者没有繁体格式的文字敏感。
<9>现在再实验一下,把contentType属相也去掉,指定meta标签中content属性中的charset=UTF-8 ,具体效果如下:
一种另外格式的乱码显示出来了。。。
综上所述:在jsp中如果要显示正确的内容,并且保证其显示不乱码,必须要指定contentType 或者 pageEncoding 的属性与文件编码格式一致。并且如果他们都存在,那么pageEncoding必须与文件编码格式一致,contentType必须是中文编码格式才行。
3、通过URL传递中文参数的时候接收的乱码怎么解决?
答:<1>新建一个servlet 名叫encodeServlet,在encode.jsp中添加超链接传递一个参数 跳转到该serlvet。
超链接如下:
<a href="servlet/encodeServlet?param=中文">go to servlet</a>
servlet接收参数,具体get方法处理方式如下:
/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String param = request.getParameter("param");request.getRequestDispatcher("../encode.jsp?param="+param).forward(request, response);}
调试之后发现,参数乱码了:
<2>这是因为参数通过url传递的时候是以http超文本协议传递的,它的格式是 iso-8859-1 ,所以可以设置tomcat服务器全局URL请求的格式,这样子所有的请求都会按照这个编码格式传递参数了。具体如下:
在tomcat安装目录的conf/server.xml中找到protocol="HTTP/1.1"的属性配置的连接器,在里面添加URIEncoding属性,具体如下:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
URIEncoding ,顾名思义,它只针对 URL传递的请求,即get请求。。
<3>并且如果这么设置之后就不能再使用 param = new String(param.getBytes("iso-8859-1"),"UTF-8");转码了 这样反而又变乱码了。
<4>另外还可以在接收到参数之后,重新指定编码也可以,具体如下:
String param = request.getParameter("param");param = new String(param.getBytes("iso-8859-1"),"UTF-8");
调试页面,发现并没有成功,具体效果如下:
没有效果,,,为什么,?因为页面的内容编码是UTF-8的,但是URL它传递的时候只能传递iso-8859-1 的编码,如果直接传递UTF-8编码的内容,那么无论后台怎么转换都没有效果。 即使在servlet中重新指定charset 也无济于事。
<5>但是如果直接在地址栏输入: http://localhost:8080/webProject/servlet/encodeServlet?param=中文
并且修改一些代码,具体修改如下:
response.setContentType("text/html;charset=UTF-8");String param = request.getParameter("param");param = new String(param.getBytes("iso-8859-1"),"UTF-8");
然后运行效果如下:
这样子是没问题的。。
<6>但是如果非要使用new String()重新编码来实现接收中文怎么办呢?,可以修改源码,具体如下:
request.setCharacterEncoding("UTF-8");String param = request.getParameter("param");param = new String(param.getBytes("iso-8859-1"),"UTF-8");
设置字符编码格式 即可,具体效果如下:
实践证明,不管是超链接 跳转到servlet 还是直接在url输入中文跳转到servlet 只使用request.setCharacterEncoding("UTF-8"); 统一编码格式 都可以实现接收正确的参数。。
最开始一直以为request.setCharacterEncoding("UTF-8"); 只能处理post请求的参数,get请求的一样可以。
<7>既然这么有效果,那么为了避免重复的使用这行代码或者忘记使用而导致乱码,可以使用一个过滤器 统一处理任何请求的编码格式。一劳永逸。
具体FIlter代码如下:
package com.struts2.util;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 org.apache.log4j.Logger;public class CharacterFilter implements Filter {private Logger logger = Logger.getLogger(this.getClass());String encoding = null;@Overridepublic void destroy() {logger.info("***************the CharacterFilter class' destroy() is invoking .***************");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);filterChain.doFilter(request, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {logger.info("***************the CharacterFilter class' init() is invoking .***************");encoding = filterConfig.getInitParameter("encoding");}}
然后web.xml的配置如下:
<filter><filter-name>characterFitler</filter-name><filter-class>com.struts2.util.CharacterFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterFitler</filter-name><url-pattern>/*</url-pattern></filter-mapping>
<8>但是但是,实际开发中,上面的配置在处理get请求的时候 有些时候可以指定编码成功,有的时候指定编码失败, 成功率大概60-70%之间,至今不知道为何会这样。。。
解决方案:
使用js函数编码之后,然后后台解码即可,具体前台代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
测试中文是否乱码!@#!@#<br/>
<a href="javascript:goTo()">go to servlet</a>
<script>
function goTo(){var param = encodeURI(encodeURI("中文")); //这里编码必须调用两次,因为传递后台后java程序会解码一次,然后自己还要解码一次,location.href="<%=request.getContextPath()%>/servlet/encodeServlet?param="+param;
}
</script>
</body>
</html>
后台解码代码如下:
//request.setCharacterEncoding("UTF-8");//response.setContentType("text/html;charset=UTF-8");String param = request.getParameter("param");//param = new String(param.getBytes("iso-8859-1"),"UTF-8");//这个用于直接处理转换get请求的编码//param = URLEncoder.encode(param);//这个是用于编码的方法param = URLDecoder.decode(param);//这个是用于解码的方法
ok ,这样子解决了js函数请求后台出现乱码的情况。
<9>另外在利用PrintWriter输出的时候 出现乱码了,具体代码如下:
PrintWriter out = response.getWriter();out.print("接收的参数是:"+param);out.close();
具体效果如下所示:
这里可以在servlet请求的顶部加上response.setContentType("text/html;charset=UTF-8"); 设置内容编码格式 即可输出正确的效果,具体如下图:
综上所述:
(1)在参数的时候出现乱码,如果是get请求可以统一设置tomcat的uri编码处理格式,这样所有的url发送的请求都是以指定格式发送。
(2)request.setCharacterEncoding("UTF-8");主要用户 get/post请求中设置整个servlet的编码格式,好处是防止传递的中文参数乱码。
(3)response.setContentType("text/html;charset=UTF-8"); 主要用于指定当前请求中的内容格式,好处是防止输出内容的时候防止中文乱码。
(4)如果在处理中文乱码中以上方法都解决不了,那就要使用js前段编码两次,后台解码的方式处理。
4、是否有其他框架的配置直接解决中文乱码情况?
<1>如果项目中使用了struts2 ,可以在sturts.xml中配置一个常量,指定所有post请求的编码,具体如下:
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<2>如果在项目中使用了spring,可以在web.xml中配置一个过滤器也可以解决编码乱码的问题,具体如下:
<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><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
转载于:https://www.cnblogs.com/sourcecode2014/p/3295410.html
木其工作室代写程序 [原]java web项目各种乱码的解决方案相关推荐
- 木其工作室代写程序 [原]Oracle常用sql语法
淘宝网上专业IT程序代写 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.ne ...
- 基于Docker里的运行的tomcat容器进行部署Java Web项目详解
引言:在centos-7环境装了docker后,通过docker创建一个tomcat容器,想部署Java web项目,结果就是找不到tomcat 容器的的webapps目录,导致部署不了项目,不过后来 ...
- Java Web项目运行一直提示ClassNotFoundException
初学JSP+Servlet,今天在写一个小项目的时候,启动tomcat后,在网页输入地址一直显示ClassNotFoundException 而控制台一直输出java.sql.SQLException ...
- 木其工作室(专业程序代写服务)[转]学写块设备驱动(三)----踢开IO调度器,自己处理bio(下)...
优质代写程序 代写Assignment程序 定制软件 设计程序 专业代写IT 大学生程序代写 踢开IO调度器很容易,即不使用__make_request 这个系统指定的强力函数,如何不使用?其实我们从 ...
- 用php web编程作业,代做CSE2ISD作业、代做Web,php程序作业、代写Java/web编程作业、代写C/C++/Java留学生作业...
代做CSE2ISD作业.代做Web,php程序作业.代写Java/web编程作业.代写C/C++/Java留学生作业 日期:2018-10-08 10:00 CSE2ISD – Information ...
- 禾川触摸屏编程软件_汇川PLC编程PLC代写程序
汇川PLC编程-PLC代写程序 硬件设计 在硬件方面,Pro-face的要求不高,需要一个24V/2A的直流电源和触摸屏本身.另外,为了与PLC通讯,我们根据需要选择了MPI接口的RS232C串行连接 ...
- idea java web项目导出为jar打包成可运行exe程序
一.前言 前几天一个朋友找我,说有一个 数据接口开发 能够页面展示的小项目,能够在本地运行就行,不需要放到网上,问我这边可不可以做,本来想 婉言谢绝 的,但是听到说,可以给点 辛苦费,于是想到了 李白 ...
- Java Web项目,Android和微信小程序的初始页面配置
Java Web项目 我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:8080访问项目,会发 ...
- 黑马程序员 JAVA WEB 第三节 MYSQL 约束
这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步. b_d 若果有同学也想学习黑马程序员Java w ...
最新文章
- java制表位是什么意思_java制表位如何应用?大神进来。
- Windows10 + VS2015 (Win SDK10)环境下的64位 VTK编译小结
- python的结构_Python结构的选择,python,之
- 使用SQLALCHEMY 出现warning的问题解决
- 3算法全称_全网最通俗的KMP算法图解
- 深度linux 网络配置文件,solver及其配置 - Caffe 深度学习入门教程_Linux教程_Linux公社-Linux系统门户网站...
- 【registry】registry An exception was thrown while processing request with message
- [LeetCode] Valid Anagram
- (原創) 哪些地方會用到Copy Constructor和Assignment Operator? (C/C++)
- linux管道和tee命令
- envi反演水质参数_Landsat8单窗算法地表温度反演
- python 数据流中的移动平均值_Python实现数据流中的中位数【堆】
- 【图像融合】基于matlab GUI小波变换可见光与红外光图像融合(带面板)【含Matlab源码 701期】
- unity3d 挂载脚本_Unity3D加载资源的四种方式
- python--查询PG数据库
- 计算机网络原理_第8章 局域网技术 之二 令牌环
- 2017阿里巴巴实习生C/C++研发内推一面、二面经历
- kmplayer音轨切换(换配音)
- 秋冬易感冒着凉 风寒感冒9大食疗方
- Unknown	Faceted Project Problem (Java Version Mismatch)