J2EE学习笔记--Struts中文问题

       JSP的中文乱码问题,其根源在于:Web容器默认的字符处理编码是iso-8859-1,对于需要在浏览器页面上显示中文的JSP程序,但在程序中并没有指定中文的字符集,那么中文将在浏览器页面上显示为乱码。当然,前面所说的是指在Tomcat服务器下的,其他服务器有些不是这样的,比如BEA Weblogic和IBM Websphere是从操作系统中取得默认的编码,然后按该编码来转码所有用户请求。以前我也写过一遍JSP的学习笔记,关于本地化和国际化的,那里有详细解释在Tomcat服务器下中文问题产生的原理。Struts中文问题有三种:发送请求时的中文问题、处理响应结果的中文问题和国际化资源文件的中文问题。

 

1.       发送请求时的中文问题

客户机向服务器发送请求时,根据所使用浏览器的不同可能会有不同的编码形式。不过通常情况下在请求到达Web容器前要将之转码,转成某种固定的编码以方便Web应用的处理。这种问题有三种处理方法:

第一种,可以采用设置用户请求对象的编码形式,也就是以HttpServletRequest对象的编码的形式来进行用户请求的转码:

//将用户请求转码为GBK型

request.setCharacterEncoding(“GBK”);

第二种,可以在Servlet中对用户输入的数据进行转码。Web容器接受到一个请求时,它会将它发往某个处理的Servlet。在Servlet中直接获取用户请求的数据,然后将之转码为需要的格式,例如把数据转换为GBK格式:

String username = request.getParameter(“username”);

username = new String(username.getBytes(“iso-8859-1”), “GBK”);

以上两种方法都是很常用的,但第一种是每个页面都要去修改,当JSP页面很多时比较麻烦,第二种就每个发送的数据都要转码,也很麻烦。

第三种,就是采用Filter过滤器方式,将用户的所有请求都通过过滤器进行转码,这种方法就克服了以上两种方法的缺点。代码如下:

public void doFilter(ServletRequest request, ServletResponse response,                   FilterChain chain )  throws IOException, ServletException {

              request.setCharacterEncoding("GBK");

              chain.doFilter(request, response);

       }

这里转码为GBK过滤器的主要代码,当然还要把这个类要在web.xml文件中部署。

 

2.       处理响应结果的中文问题

响应的结果包括Servlet、JSP和HTML三种情况,可以通过以下方式设置响应结果编码:

对于Servlet,可以在Servlet中为其设置响应代码类型,代码如下:

response.setContentType(“text/html;charset=GBK”);

对于JSP,是比较方便的,只需要在JSP最前部分按如下方式声明:

<%@ page contentType=“text/html;charset=GBK”%>

对于HTML,其和JSP文件基本类似,也是在页面最前部分按如下方式声明:

<head>

       <META HTP-EQUIV=“contentType” CONTENT=“text/html;charset=GBK”>

</head>

 

3.       国际化资源文件的中文问题

一个Struts应用程序中,可以配置多个资源包,无论是Action、ActionForm还是JSP都可以访问这些包中的资源。资源包就是由扩展名为.properties的文件组成的一组具有相同前缀的文件,如ApplicationResources_zh_CN.properties、ApplicationResources_zh.properties和ApplicationResources.properties。这些文件就构成一个Struts的资源包,它们都有一个统一的前缀ApplicationResources,凡是有相同前缀的资源文件就都属于一个包。

当用MyEclipse编写资源文件时,默认是不能保存中文的,因为默认保存编码的格式是ISO-8859-1,这就需要修改为gb2312或者gbk编码格式。Windons -->Preferences-->General -->Content Types-->Text-->Java Properties File,在最下方把其Default encoding改为“UTF-8”,然后“update”就可以保存中文了。但就这样保存的中文还是不能够在页面上使用的,因为Web容器默认是使用ISO-8859-1,也就会把中文用ISO-8859-1的格式发送给客户页面,显示的还是乱码,这就是JAVA国际化的问题。JAVA是支持unicode编码格式的,unicode是国际统一通用编码,所以不管什么格式的编码转化为unicode编码肯定不会显示乱码的。这个时候就是需要把资源文件的UTG-8编码格式转化为unicode编码格式,而SUN公司又提供了这样的一种工具。在JDK的安装目录bin下,有一个叫native2ascii可执行文件,这个是专门来进行资源文件转码的。打开cmd,进入JDK的bin目录下,把资源文件拷贝到该目录下,执行该命令。比如:native2ascii –encoding GBK ApplicationResources.properties ApplicationResources_zh_CN.properties 就是把GBK编码格式ApplicationResources.properties转化为unicode编码格式ApplicationResources_zh_CN.properties,这样显示页面时就不会出现乱码了。

       比如资源文件中有:

label.name=名字

label.sex=性别

转化为unicode编码为:

label.name=u540du5b57

label.sex=u6027u522b

 

 

时间: 2025-01-17 03:45:46

J2EE学习笔记--Struts中文问题的相关文章

扬扬的J2EE学习笔记(四)Platform Services平台服务

j2ee|services|笔记 每周学一些J2EE,作点笔记. 目标:能熟练使用Websphere做J2EE的开发工作. 加油!加油!!加油!!! 1. 平台服务概述    1) 为应用编程的部署提供服务.   2) 命名服务:能够帮助应用客户端寻找企业Beans:寻找通过Java Naming Directory Interface(JNDI)访问naming环境的WEB组件.   3) 无须更改源代码就能定制组件   4) 使用JNDI接口,J2EE组件可以定位自己的环境名称内容(envi

J2EE学习笔记(8) 真是知易行难 初试Struts

j2ee|笔记 实在是好事多磨,折腾了两个晚上才搞定了一个 HelloWorld Struts版,下面谈谈一点体会. 开发环境 Eclipse + MyEclipse (Struts 1.1) Struts 1.1支持多模块开发,在myEclipse的Web Application Project里先建立新module (New->Struts 1.1 Module),再依次加Form Action ActionForward (New -> Struts 1.1 Action, Form &

J2EE学习笔记(6) Struts HTML Tags

HTML Tags一些公用的tag attributes在HTMLTagLib里的含义前后一致,它们是name: ActionForm bean的实例名,如果name不存在,<html:form>所关联的formBean会生效.property: property既决定了生成的html的fieldname,也决定了该field的值 via formBean.getThisPropertyvalue: value决定了生成html的field的value,注意它不是bean的propertyNa

J2EE学习笔记(3) Struts Logic Tags

Logic Tags语法应用是 --<someComparisonTag value="someUserNameValue" cookie="userName"> (cookie specifies the name of the cookie to compare with value)<someComparisonTag value="en_US" header="Accept-Language">

扬扬的J2EE学习笔记(一)概述

j2ee|笔记 扬扬今天开始学习J2EE啦! 目标:尽可能在最短时间内,把J2EE体系结构相关了解个大概,以后再慢慢往深处学习. 加油!加油!!加油!!!一.分布式的多层应用程序 图1 分布式的多层应用程序 J2EE平台使用多层分布式的应用模式.应用逻辑根据其功能分成多个组件,各种不同的应用组件构成分布在不同的依赖于层的机器上的J2EE程序.位于不同层的组件有: ☆ 运行在客户机上的客户层组件 ☆ 运行在J2EE服务器上的网络层 ☆ 运行在J2EE服务器上的逻辑层 ☆ 运行在

J2EE学习笔记--MVC框架

MVC是一种软件设计模式,最初是为SMALLTALK-80语言提出来的,但后来在JSP开发中渐渐得到广泛应用,并且成为Sun公司推荐的J2EE平台的设计模式.Sun公司提出的Model2开发模型就是基于MVC设计模式的应用,在Web应用程序开发中,MVC框架应用非常广泛,特别适合应用在大型的.比较复杂的项目开发中.   MVC框架即是模型-视图-控制器(Model-View-Controller)设计模式.其中,M代表Model,V代表View,C代表Controller.MVC的核心思想是将来

扬扬的J2EE学习笔记(三)Components and Roles组件和角色

j2ee|笔记 每周学一些J2EE,作点笔记. 目标:能熟练使用Websphere做J2EE的开发工作. 加油!加油!!加油!!!  1. 架构    1) 组件:一个应用级的软件单元      J2SE拥有JavaBeans:J2EE拥有EJB(Enterprise JavaBeans)   2) 系统级实体容器      提供:运行支持.生命周期管理.安全.部署.线程   3) applet和客户应用程序      客户端组件执行自己的Java虚拟机(JVM)   4) WEB组件:    

扬扬的J2EE学习笔记(五)Installing J2EE SDK(安装J2EE SDK)

j2ee|笔记 每周学一些J2EE,作点笔记. 目标:能熟练使用Websphere做J2EE的开发工作. 加油!加油!!加油!!! 以在Linux下安装为例. 1 准备安装J2SE普通用户身份:./j2sdk-1_3_1_01-linux-i386-rpm.bin运行安装程序,最后生成jdk-1.3.1_01.i386.rpm文件2 安装J2SE SDK1) su root身份:rpm -iv jdk-1.3.1_01.i386.rpm得到jdk-1.3.1_01-fcs2) cd /usr发现

扬扬的J2EE学习笔记(二)J2EE的客户端/服务器

j2ee|笔记|服务器|客户端 每周学一些J2EE,作点笔记. 目标:能熟练使用Websphere做J2EE的开发工作. 加油!加油!!加油!!! 图3 J2EE场景 图三里须注意的是: 1.Tier integration is the center of the J2EE programming model. 2.用户使用Browser方式访问:      1) Browser:使用HTML,HTTP,XML.可能经过防火墙      2) Web container:使用JSP,Serve