淘宝网上专业IT程序代写

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追究法律责任。
作者: 永恒の_☆ 地址: 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>
作者:ch656409110 发表于2013-8-25 17:03:06 原文链接
阅读:1720 评论:7 查看评论

转载于:https://www.cnblogs.com/sourcecode2014/p/3295410.html

木其工作室代写程序 [原]java web项目各种乱码的解决方案相关推荐

  1. 木其工作室代写程序 [原]Oracle常用sql语法

    淘宝网上专业IT程序代写 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本人声明.否则将追究法律责任. 作者: 永恒の_☆ 地址: http://blog.csdn.ne ...

  2. 基于Docker里的运行的tomcat容器进行部署Java Web项目详解

    引言:在centos-7环境装了docker后,通过docker创建一个tomcat容器,想部署Java web项目,结果就是找不到tomcat 容器的的webapps目录,导致部署不了项目,不过后来 ...

  3. Java Web项目运行一直提示ClassNotFoundException

    初学JSP+Servlet,今天在写一个小项目的时候,启动tomcat后,在网页输入地址一直显示ClassNotFoundException 而控制台一直输出java.sql.SQLException ...

  4. 木其工作室(专业程序代写服务)[转]学写块设备驱动(三)----踢开IO调度器,自己处理bio(下)...

    优质代写程序 代写Assignment程序 定制软件 设计程序 专业代写IT 大学生程序代写 踢开IO调度器很容易,即不使用__make_request 这个系统指定的强力函数,如何不使用?其实我们从 ...

  5. 用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 ...

  6. 禾川触摸屏编程软件_汇川PLC编程PLC代写程序

    汇川PLC编程-PLC代写程序 硬件设计 在硬件方面,Pro-face的要求不高,需要一个24V/2A的直流电源和触摸屏本身.另外,为了与PLC通讯,我们根据需要选择了MPI接口的RS232C串行连接 ...

  7. idea java web项目导出为jar打包成可运行exe程序

    一.前言 前几天一个朋友找我,说有一个 数据接口开发 能够页面展示的小项目,能够在本地运行就行,不需要放到网上,问我这边可不可以做,本来想 婉言谢绝 的,但是听到说,可以给点 辛苦费,于是想到了 李白 ...

  8. Java Web项目,Android和微信小程序的初始页面配置

    Java Web项目 我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:8080访问项目,会发 ...

  9. 黑马程序员 JAVA WEB 第三节 MYSQL 约束

    这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步.   b_d 若果有同学也想学习黑马程序员Java w ...

最新文章

  1. java制表位是什么意思_java制表位如何应用?大神进来。
  2. Windows10 + VS2015 (Win SDK10)环境下的64位 VTK编译小结
  3. python的结构_Python结构的选择,python,之
  4. 使用SQLALCHEMY 出现warning的问题解决
  5. 3算法全称_全网最通俗的KMP算法图解
  6. 深度linux 网络配置文件,solver及其配置 - Caffe 深度学习入门教程_Linux教程_Linux公社-Linux系统门户网站...
  7. 【registry】registry An exception was thrown while processing request with message
  8. [LeetCode] Valid Anagram
  9. (原創) 哪些地方會用到Copy Constructor和Assignment Operator? (C/C++)
  10. linux管道和tee命令
  11. envi反演水质参数_Landsat8单窗算法地表温度反演
  12. python 数据流中的移动平均值_Python实现数据流中的中位数【堆】
  13. 【图像融合】基于matlab GUI小波变换可见光与红外光图像融合(带面板)【含Matlab源码 701期】
  14. unity3d 挂载脚本_Unity3D加载资源的四种方式
  15. python--查询PG数据库
  16. 计算机网络原理_第8章 局域网技术 之二 令牌环
  17. 2017阿里巴巴实习生C/C++研发内推一面、二面经历
  18. kmplayer音轨切换(换配音)
  19. 秋冬易感冒着凉 风寒感冒9大食疗方
  20. Unknown Faceted Project Problem (Java Version Mismatch)

热门文章

  1. JAVA编程环境搭建 JDK与环境变量、Eclipse
  2. IP定位,IP转地理位置
  3. 软件开发模型(瀑布模型、敏捷模型)和软件测试模型(V模型、W模型、 H模型、X模型)
  4. Android性能优化之冷启动优化
  5. 五种控制Android应用的权限的方法
  6. ParaView在单页面下实现MPR
  7. newcoder【链表分割】
  8. 《游戏视频主播手册》——第1章 游戏视频直播概述 1.1 游戏视频直播的发展历程...
  9. Protobuf 学习(二)编译proto文件并测试
  10. selenium 您的连接不是私密连接 解决办法