开发框架:利用STRUTS实现国际化支持
1.4手工设置显示语言
用浏览器的语言设置来决定系统采用哪种语言展现可能会出现一个问题,就是用户的浏览器语言与他想要使用系统的语言不一致的情况,如某客户浏览器的语言设置为英文,但他还是在使用主站系统时看到的是中文界面。该问题可以通过手工选择语言来解决,在程序中可以通过设置名为Globals.LOCALE_KEY(Globals.LOCALE_KEY 是 struts的常量)的SESSION变量,也能改变系统中当前语言的设置,代码类似于:
| Locale newLocale = new Locale( language, country ); session.setAttribute( Globals.LOCALE_KEY, newLocale ); |
2. 带有文字的图片处理
2.1静态图片
带有文字的图片应该也要根据语言的不同而显示不同的图片,但图片本身不是文本信息,无法直接用< bean:message>标签来完成国际化操作。但由于页面上显示图片取决于< image>标签的src属性,因此可以为每个图片对应各种语言的都准备一个版本,文件名或路径有所差异,然后将每种语言对应的图片的路径及文件名放在资源文件中,而在JSP页面上< image>标签的src属性由< bean:message>标签指定,这样即可以完成图片的国际化。
2.2 JAVA生成动态图片
由于生成动态图片是在服务器端进行,因此同样需要将生成图形字符的静态部分放在资源文件中,如图形名称等,从资源文件中取字符串的方法在JSP页面显示部分已有说明;从数据库中取出的部分可以不用做任何处理,直接从数据库取出与静态部分拼装成图形字符串即可,数据库相关设置在数据库部分有详细说明。
3. 页面提交参数处理
页面上向WEB服务器提交参数有两种方式,一是在访问URL后面附加上request变量,这样的变量在服务器端可以通过request.getParameter方法得到,另一种方式是在JSP页面上用FORM表单方式提交,这种方法提交的变量在服务器端可以通过form的getXXX方法取到变量的值。
当WEB系统需要国际化时,JSP页面的编码方式被指定为UTF-8(前面已有说明),也就是说页面上可以处理各国文字,在使用URL传递变量时需要将变量用JS方法encodeURI方法处理过,才能在服务器端得到正确的值,如
location.href="int/do/common/queryUserInfo.do?sqlcode=QUERY0001&hh="+encodeURI(document.all.hh.value)+"&hm="+encodeURI(document.all.hm.value)+"&bmbh="+encodeURI(document.all.bmbh.value);
由于这种方式需要对每个request变量调用encodeURI方法,处理起来比较麻烦,但用FORM表单提交的方式即不需要进行任何处理,因此在开发时应尽量使用FORM表单提交的方式进行数据传递。
如果需要JAVA代码中生成URL,则其中传递的参数也需要调用URLEncoder.encode方法进行处理,并指定编码方式为"UTF-8"。
在服务器端取得客户端传递的参数时也需要对参数进行字符集的转换后才可以下确使用,如
strString = new String(strString.getBytes("ISO-8859-1"), "GBK");
但如此对每个变量都需要这样处理也是非常麻烦,实际上可以利用servlet的Filter机制进行统一处理。在调用servlet(包括struts)时,在到达实际的servlet类前,会首先调用指定的Filter进行处理,Filter处理完成后再决定是否交给实际请求的servlet类处理。
利用这一点,我们可以新建一个类继承自Filter基类,重载doFilter方法,并在该方法中加入
request.setCharacterEncoding(“UTF-8”);
指定客户端的字符集为UTF-8(默认客户端的字符集为ISO8859),这样在ACTION类中取得的参数就不需要进行任何的转换处理了。
配置Filter的地方在web.xml,在web.xml文件中加入类似这样的配置即可以使自定义的Filter生效:
| < filter> < filter-name>charsetfilter< /filter-name> < filter-class> international.CharsetFilter< /filter-class> < init-param> < param-name>encoding< /param-name> < param-value>UTF-8< /param-value> < /init-param> < /filter> < filter-mapping> < filter-name>charsetfilter< /filter-name> < url-pattern>/*< /url-pattern> < /filter-mapping> |
在数据库建库时需要将数据库的字符集指定为unicode编码类型,以支持多种语言。
有一点需要特别说明的是UTF-8是用3个字节表示一个汉字,这点在进行表结构设计时需要注意,适当设置字段的长度。


















文章评论
共有 位CH网友发表了评论 查看完整内容