首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同形式

2012-08-10 
《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同方式9.5??Struts2访问国际化信息的不同方

《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同方式

9.5??Struts2访问国际化信息的不同方式

为了示例的简洁,删除在9.4节中添加的I18NAction_zh_CN.properties文件和package.properties文件,只保留全局级国际化信息资源文件。并在message.properteis中增加一个带有参数的国际化信息。

?

java代码:查看复制到剪贴板打印
  1. labela?=?labela?in?zh_CN??
  2. labelb?=?labelb,{0}??

注意:本节中的访问,都是在浏览器使用中文zh_CN的前提下访问的。

9.5.1用<s:text>访问国际化信息

在前面已经使用了<s:text>标签来访问国际化信息,只需要在它的name属性上填入需要的key即可。下面,来看看它的其它的属性。

1:使用带参数的国际化信息

?????? 可以用参数把一些可变值传给国际化信息,在<s:text>标签访问国际化信息的时候,只需要配合上<s:param>子标签即可传入参数,示例如下:

?

java代码:查看复制到剪贴板打印
  1. <%@?taglib?prefix="s"?uri="/struts-tags"?%>??
  2. <s:text?name="labela"/>??
  3. <hr>??
  4. <s:text?name="labelb">??
  5. ????<s:param>ok</s:param>??
  6. </s:text>??

上面的示例中,key为labela的国际化信息没有参数,因此<s:text>标签直接结束,没有子标签;而key为labelb的国际化信息有参数,因此<s:text>标签用<s:param>子标签来传入参数值ok。在运行的时候,参数{0}被替换为ok,最终显示为:

《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同形式

图9.7 使用<s:param>子标签为<s:text>标签传递参数的结果

2:指定国际化信息来源

?????? 再来添加一个国际化信息来源。比如,恢复包级国际化信息资源文件,也就是package_zh_CN.properties文件,内容如下:

?

java代码:查看复制到剪贴板打印
  1. labela?=?labela?in?zh_CN?with?package??

现在,同时存在全局级国际化信息资源和包级国际化信息资源,根据前面所学的知识,包级国际化信息资源会覆盖全局级国际化信息资源,因此,<s:text name=”labela”/>将会返回在package_zh_CN.properties中定义的labela = labela in zh_CN with package。

?????? 现在需要仍然显示全局级的国际化信息,该怎么办呢?

?????? 可以通过<s:i18n>标签,来为<s:text>标签指定国际化信息来源。如果<s:text>标签作为<s:i18n>标签的子标签出现,则会使用<s:i18n>指定的国际化信息来源。把jsp修改如下:

?

java代码:查看复制到剪贴板打印
  1. <%@?taglib?prefix="s"?uri="/struts-tags"?%>??
  2. ??
  3. <s:text?name="labela"/>??
  4. <hr>??
  5. <s:i18n?name="message">??
  6. ????<s:text?name="labela"/>??
  7. </s:i18n>??

解释一下如何引用国际化信息资源,仍然分为三种情况讨论:

  • 全局级国际化信息资源:直接用文件前缀名即可—message。
  • 包级国际化信息资源:用这个包的全限定名+package—cn.javass.i18n.package。
  • 类级国际化信息资源:用这个类的全限定名—cn.javass. i18n.I18NAction。

    上面的示例中,第一个<s:text>标签没有作为<s:i18n>的标签子标签出现,则它访问包级国际化信息资源;而第二个<s:text>标签作为<s:i18n>标签的子标签出现,则它访问<s:i18n>标签中指定的message国际化信息资源,最终显示为:

    《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同形式

    图9.8 使用<s:i18n>标签临时指定国际化信息来源的结果

    9.5.2用表单标签访问国际化信息

    在前面学过使用Struts的表单标签来建立一张表单,看看如下代码:

    ?

    java代码:查看复制到剪贴板打印
    1. <%@?taglib?prefix="s"?uri="/struts-tags"?%>??
    2. <s:form>??
    3. ????<s:textfield?name="name1"?label="labela"/>??
    4. </s:form>??

    它采用<s:form>的默认主题(xhtml)建立了一个一行一列的表单,其中,<s:textfield>标签的label属性用于在文本框前生成这个文本框的说明,label属性就是简单的把它的值“labela”放在了文本框前。

    ?????? 现在只需要做个小小的改动,就可以访问国际化的信息了,简单的把label属性改为key属性,就可以访问国际化信息来显示文本框前的说明信息了,示例如下:

    ?

    java代码:查看复制到剪贴板打印
    1. <%@?taglib?prefix="s"?uri="/struts-tags"?%>??
    2. <s:form>??
    3. ????<s:textfield?name="name1"?key="labela"/>??
    4. </s:form>??

    与<s:textfield>类似,s标签中的其他可见表单域标签也都支持使用key属性来访问国际化信息,包括:<s:label/>、<s:textarea/>、<s:password/>、<s:submit/>等等,这里就不再去列举了。

    ?????? 使用表单标签还有两个问题:

    • 表单标签在访问国际化信息的时候,不能使用<s:param>标签指定参数值。
    • 表单标签也可以使用<s:i18n>标签来指定国际化信息来源,代码示例如下:java代码:查看复制到剪贴板打印
      1. <%@?taglib?prefix="s"?uri="/struts-tags"?%>??
      2. <s:form>??
      3. ????<s:textfield?name="name1"?key="labela"/>??
      4. </s:form>??
      5. <hr>??
      6. <s:i18n?name="message">??
      7. ????<s:form>??
      8. ????????<s:textfield?name="name1"?key="labela"/>??
      9. ????</s:form>??
      10. </s:i18n>??

      可以看到,第一个仍访问默认的国际化信息来源,而第二个则指定了名称为message的全局级国际化信息。最终显示为:

      《研磨struts2》第九章 国际化 之 9.5 Struts2访问国际化信息的不同形式

      图9.9 使用<s:i18n>标签临时指定国际化信息来源的结果

      9.5.3在Action中访问国际化信息

      前面都是在页面上来访问国际化的信息,如果要在Action中访问国际化信息,该怎么办呢?

      ???????如果我们自己写的Action类继承自ActionSupport,就可以直接使用ActionSupport的一系列getText方法来访问国际化信息。这些方法声明于ActionSupport类实现的TextProvider接口。

      ?????? 分为三种情况讨论:

      • 访问没有参数的国际化信息。

        直接调用最简单的getText(String aTextName)即可,传入国际化信息的key,这个在前面讲ActionSupport的时候,就示例过这种情况。

        • 访问有参数的国际化信息。

          调用可以设置参数的getText(String aTextName,String defaultValue,String… args),其中,第一个参数为国际化信息的key,第二个参数为找不到此key时返回的默认值,第三个String[]参数传入需要传给国际化信息的参数。

          • 指定国际化信息来源。

            调用其getTexts(String aBundleName)可以返回一个ResourceBundle对象,可然后就可以自由操作此ResourcBundle对象。

            ?????? 比如,可以在execute方法中访问国际化信息,示例如下:

            ?

            java代码:查看复制到剪贴板打印
            1. public?class?I18NAction??extends?ActionSupport{??
            2. ????public?String?execute()?throws?Exception?{??
            3. ????????System.out.println(this.getText("labela"));??
            4. ????????System.out.println(this.getText("labelb",null,"ok"));??
            5. ????????ResourceBundle?bundle?=?this.getTexts("message");??
            6. ????????System.out.println(bundle.getString("labela"));??
            7. ????????return?SUCCESS;??
            8. ????}??
            9. }??

            在上例中,第一句访问默认的国际化信息,第二句访问默认的国际化信息并传入参数值为ok,第三句访问名为message的全局国际化信息。访问这个Action,运行的结果是

            ?

            java代码:查看复制到剪贴板打印
            1. labela?in?zh_CN?with?package??
            2. labelb,ok??
            3. labela?in?zh_CN??

            ?

            私塾在线网站原创《研磨struts2》系列

            转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4087.html】

            欢迎访问http://sishuok.com获取更多内容

热点排行