struts的国际化问题

Web应用实现国际化(i18n),主要包括两个方面 

一、页面jsp)静态信息国际化

二、动态消息的国际化

 

在开始Struts国际化之前,我们先来看一下java如何实现国际化

 

主要步骤:

 

1、创建属性文件(国际化资源文件)

 

*国际化资源文件是有baseName+Locale构成,如MessagesBundle_en_US.properties

 

*缺省的国际化资源文件是baseName.properties格式命名,如:MessagesBundle.properties

 

*关于中文必须转换成unicode,可以采用JAVA_HOME/bin/native2ascii工具转换

命令native2ascii.exe o.properties MessagesBundle_zh_CN.properties

也可以一个一个字符转换

 

举例:

 

属性文件示例:

k1=China

k2=Hello,{0}

 

2、定义Locale对象

 

*可以获得系统默认local,也可以自定义

 

*缺省的Locale是有操作系统决定的

 

*Locale是有语言和国家代码构成

 

3、创建一个ResourceBundle对象

 

*ResourceBundle对象用于分离跟本地相关的数据

 

*如果找不到相应语言或国家代码的属性文件,将使用默认的属性文件(即没有标识语言和国家代码的属性文件:MessagesBundle.properties)

 

4、从ResourceBundle对象中获取数据,如果有占位符,可以给占位符赋值

 

示例:

[java]  view plain copy print ?
  1. public class test {  
  2.     public static void main(String[] args)  
  3.     {  
  4.         //获取系统默认locle  
  5.         Locale localeDefault=Locale.getDefault();  
  6.         System.out.println("Country="+localeDefault.getCountry());  
  7.         System.out.println("Language="+localeDefault.getLanguage());  
  8.         System.out.println("------------------------");  
  9.           
  10.         //我们通过指定一个语言代码和国家代码来创建一个Locale对象  
  11.       
  12.   
  13.         Locale localeNew=new Locale("en","US");  
  14.         System.out.println("Country="+localeNew.getCountry());  
  15.         System.out.println("Language="+localeNew.getLanguage());  
  16.         System.out.println("------------------------");  
  17.       
  18.         //读取国际化资源文件  
  19.           
  20.         /** 
  21.          *  其创建方式如下: 
  22.         第一个参数,表示要从哪些资源属性文件中(MessagesBundle_XX_XX.properties)获取数据 
  23.         第二个参数,是一个Locale对象,表示要选择哪个资源属性文件 
  24.         ResourceBundle对象用于分离跟本地相关的数据 
  25.                      如果找不到相应语言或国家代码的属性文件, 
  26.                      将使用默认的属性文件(即没有标识语言和国家代码的属性文件:MessagesBundle.properties) 
  27.          */  
  28.         ResourceBundle myResources =ResourceBundle.getBundle("com.jialin.resource.MessagesBundle", localeDefault);  
  29.           
  30.         //从ResourceBundle对象中获取数据  
  31.         System.out.println(myResources.getString("k1"));  
  32.         System.out.println(myResources.getString("k2"));  
  33.         System.out.println("------------------------");  
  34.           
  35.         //给国际化资源文件中的占位符赋值  
  36.         MessageFormat myFormat=new MessageFormat(myResources.getString("k2"));  
  37.         System.out.println(myFormat.format(new Object[]{"jialin"}));  
  38.   
  39.     }  
  40.       
  41.       
  42. }  

 


Strust如何支持国际化?

 

(一)页面jsp)静态信息的国际化

 

我们以登录这个例子来说明。

 

通过点击中文或英文,实现登录界面语言信息的改变

 

主要步骤:

 

1、创建国际化资源文件

 

*与上一篇中提到的创建方式一致

属性文件内容

MessagesBoundle_zn_CN.properties

 

login.form.field.username=\u7528\u6237                          ----如果为GBK编码,这里是“用户名”

login.form.field.password=\u5BC6\u7801                                                                                “密码”

login.form.button.login=\u767B\u5F55                                                                                      “登录”

 

我们看到并非为中文,而是unicode编码。

这是采用JAVA_HOME/bin/native2ascii工具转换的,不然会出现乱码

 

MessagesBoundle_en_US.properties

 

login.form.field.username=user name

login.form.field.password=password

login.form.button.login=login

 

 

2、需要在struts配置文件中指定资源属性文件的位置和名称,如<message-resources parameter="MessageResources" />

 

*Parameter=国际化资源文件的basename即可

 

3、在JSP页面中使用Struts标签库来实现显示,如<bean:message key=“key string”/>来输出文本

 

*需要引入相应的标签库<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>

 

*struts利用在session中存放一个Locale对象来达到设置当前语言的目的
*默认的情况下,struts根据网页向后台提交时所包含的语言编码信息来提供缺省的Locale对象,这就是我们为什么可以通过更改网页显示语言设置,就能显示不同的语言文字的原因。
*struts在session中存放的这个Locale对象,取名为:Globals.LOCALE_KEY的值,Globals是struts框架提供的一个对象

利用这个原理,我们可以用编程的方式来手工切换整个应用系统的语言

 

示例:

相关action

[html]  view plain copy print ?
  1. <action path="/changeLanguage" type="com.jialin.ChangeLanguageAction"  
  2.         scope="request">  
  3.         <forward name="login" path="/index.jsp" />  
  4. </action>  
[java]  view plain copy print ?
  1. public class ChangeLanguageAction extends Action {  
  2.   
  3.     @Override  
  4.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  5.             HttpServletRequest request, HttpServletResponse response)  
  6.             throws Exception {  
  7.           
  8.         String lang = request.getParameter("lang");  
  9.         Locale locale = Locale.getDefault();  
  10.           
  11.         if ("zh".equals(lang)) {  
  12.             locale = new Locale("zh""CN");   
  13.         }else if ("en".equals(lang)) {  
  14.             locale = new Locale("en""US");  
  15.         }  
  16.           
  17.         this.setLocale(request, locale);//将语言信息设置到session中        
  18.         return mapping.findForward("login");  
  19.     }  
  20.       
  21. }  


登录JSP

[html]  view plain copy print ?
  1. <body>  
  2.    <form action="login.do" method="post">  
  3.     <bean:message key="login.form.field.username" />  
  4.     <input type="text" name="name" />  
  5.     <br />  
  6.     <bean:message key="login.form.field.password" />  
  7.     <input type="password" name="password" />  
  8.     <input type="submit" value="<bean:message key="login.form.button.login"/>/>  
  9.    </form>  
  10.   
  11.     <a href="changeLanguage.do?lang=zh">中文</a>      
  12.     <a href="changeLanguage.do?lang=en">英文</a>  
  13. </body>  

 

页面信息的国际化还可以给我们带来另一个好处:我们可以通过修改国际化资源文件更改页面显示的内容,今天叫登录,明天可以改为开始等等。


(二)动态消息的国际化

对于消息提示,异常信息等这些动态信息,我们如何实现国际化呢?

 

我们依然用上面的例子,在登录验证中加入国际化

 

更改MessagesBoundle_zn_CN.properties

errors.header=<UL>
errors.prefix=<font color="red"><LI>
errors.suffix=</LI></font>
errors.footer=</UL>
login.form.field.username=\u7528\u6237
login.form.field.password=\u5BC6\u7801
login.form.button.login=\u767B\u5F55
login.success={0},\u767B\u5F55\u6210\u529F                                                                                                                                                 --登录成功
login.user.not.found=\u7528\u6237\u4E0D\u80FD\u627E\u5230\uFF0C\u7528\u6237\u540D\u79F0\=\u3010{0}\u3011                   --用户未找到,用户=
login.password.error=\u5BC6\u7801\u9519\u8BEF                                                                                                                                            --密码错误

更改MessagesBoundle_en_US.properties

errors.header=<UL>
errors.prefix=<font color="red"><LI>
errors.suffix=</LI></font>
errors.footer=</UL>
login.form.field.username=user name
login.form.field.password=password
login.form.button.login=login
login.success={0},Login Success
login.user.not.found=user not found,user name=[{0}]
login.password.error=password error

Struts配置文件

[html]  view plain copy print ?
  1. <struts-config>  
  2.   
  3.     <!-- set ActionForm info-->  
  4.     <form-beans>  
  5.         <form-bean name="userForm" type="com.jialin.UserActionForm" />  
  6.     </form-beans>  
  7.       
  8.     <global-forwards>  
  9.         <forward name="login" path="/index.jsp" />  
  10.         <forward name="success" path="/LoginSuccess.jsp" />  
  11.         <forward name="fail" path="/LoginFail.jsp" />  
  12.     </global-forwards>  
  13.       
  14.     <action-mappings>  
  15.         <!-- Set path,action,actionform,scope,forward info -->  
  16.         <action path="/login" type="com.jialin.LoginAction" name="userForm"  
  17.             scope="request" validate="true" attribute="uf">  
  18.         </action>  
  19.   
  20.         <action path="/changeLanguage" type="com.jialin.ChangeLanguageAction"  
  21.             scope="request">  
  22.         </action>  
  23.     </action-mappings>  
  24.   
  25.     <message-resources parameter="com.jialin.resource.MessagesBoundle"></message-resources>  
  26.   
  27. </struts-config>  


LoginAction

 

第一步:在这个LoginAction中,我们将根据业务逻辑需要获取国际化消息文本ActionMessage,然后将他保存起来到ActionMessages里

 

ActionMessages与ActionMessage对象
*ActionMessages对象是ActionMessage对象的集合
*一个ActionMessage对象,代表一个国际化消息文本(字符串)

 

第二步:保存这个ActionMessages,用于传递

 

首先我们要判断要传递的消息是普通消息还是错误消息?

*普通消息:即普通的消息文本

*错误消息:即异常消息文本

本质上,这两种消息没有什么区别,都是消息文本,但是如果一个页面同时需要显示普通的消息文本和错误消息文本的时候,就需要进行区分了,比如不同类型的消息文本可能要用不同的样式来显示

 

 

[java]  view plain copy print ?
  1. /** 
  2.  * 登录action 
  3.  * @author jialin 
  4.  *作用:取得表单数据,调用model层业务逻辑,返回转向信息 
  5.  */  
  6. public class LoginAction extends Action {  
  7.   
  8.     @Override  
  9.     public ActionForward execute(ActionMapping mapping, ActionForm form,  
  10.             HttpServletRequest request, HttpServletResponse response)  
  11.             throws Exception {  
  12.           
  13.         UserActionForm  userForm=(UserActionForm)form;  
  14.         String userName=userForm.getName();  
  15.         int password=userForm.getPassword();  //这里不用我们手动强转类型了。  
  16.           
  17.         UserManage userManage=new UserManage();  
  18.         User user=new User();  
  19.         user.setName(userName);  
  20.         user.setPassword(password);  
  21.         ActionMessages messages = new ActionMessages();  
  22.           
  23.           
  24.         try {  
  25.             userManage.ValidateUser(user);  
  26.             //创建国际化消息文本  
  27.             ActionMessage message=new ActionMessage("login.success", userName);  
  28.             messages.add("login_message_1",message);  
  29.               
  30.             //传递国际化消息,普通消息  
  31.             this.saveMessages(request, messages);  
  32.               
  33.             return mapping.findForward("success");  
  34.           
  35.         } catch (UserNotFoundException e) {  
  36.             //创建国际化消息文本  
  37.             ActionMessage message=new ActionMessage("login.user.not.found", userName);  
  38.             messages.add("login_error_1",message);  
  39.               
  40.             //传递国际化消息,异常消息  
  41.             this.saveErrors(request, messages);  
  42.               
  43.         }catch (PasswordErrorException e) {  
  44.             //创建国际化消息文本  
  45.             ActionMessage message=new ActionMessage("login.password.error", userName);  
  46.             messages.add("login_error_2",message);  
  47.               
  48.             //传递国际化消息,异常消息  
  49.             this.saveErrors(request, messages);  
  50.         }  
  51.           
  52.         return mapping.findForward("fail");  
  53.           
  54.     }  
  55.   
  56. }  

UserManage

[java]  view plain copy print ?
  1. /** 
  2.  * MODEL层业务逻辑 
  3.  *  
  4.  * @author jialin 判断用户是否合法 
  5.  */  
  6. public class UserManage {  
  7.   
  8.     public void ValidateUser(User user) {  
  9.         // 判断用户名密码是否正确  
  10.         if (!"jialin".equals(user.getName())) {  
  11.             //"用户不存在!用户名为:" + user.getName()"会被Struts用于填充占位符  
  12.             throw new UserNotFoundException("用户不存在!用户名为:" + user.getName());  
  13.         } else if (user.getPassword() != 123456) {  
  14.             //"密码错误“会被Struts用于填充占位符  
  15.             throw new PasswordErrorException("密码错误");  
  16.         }  
  17.     }  
  18. }  

 

自定义异常类PasswordErrorException,UserNotFoundException略

 

登录失败jsp

[html]  view plain copy print ?
  1. <body>  
  2.     <font color="red"> <html:messages id="msg"  
  3.             property="login_error_1">  
  4.             <bean:write name="msg" />  
  5.         </html:messages> </font>  
  6.     <font color="blue"> <html:messages id="msg"  
  7.             property="login_error_2">  
  8.             <bean:write name="msg" />  
  9.         </html:messages> </font>  
  10. </body>  

 

别忘记引入taglib

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>

 

也可以用 <html:errors />代替<font color="red"> <html:messages id="msg"property="login_error_1"><bean:write name="msg" /></html:messages> </font><font color="blue"> <html:messages id="msg"property="login_error_2"><bean:write name="msg" /></html:messages> </font>显示异常信息

<html:errors/>标签只显示错误消息
<html:errors/>标签与<html:messages/>标签类似,但无id属性
<html:errors/>标签通过提供header/footer属性以及prefix/suffix属性来定制每条消息的显示格式
header/footer – 定义整个错误消息显示之前(之后)要显示的内容,这些内容也是在资源属性文件中定义的一些key值,默认的情况下,它们的取值分别为:errors.header和errors.footer
prefix/suffix – 定义每条错误消息显示之前(之后)要显示的内容,这些内容也是在资源属性文件中定义的一些key值,默认的情况下,它们的取值分别为:errors.prefix和errors.suffix
举例如下(见国际化资源文件):

errors.header=<UL>

errors.prefix=<LI>

errors.suffix=</LI>

errors.footer=</UL>

 


 

登录成功jsp

[html]  view plain copy print ?
  1. <body>  
  2.         <html:messages id="msg" message="true">  
  3.             <bean:write name="msg" />  
  4.         </html:messages>  
  5.     </body>  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值