Struts2学习进阶(基础篇七)——本地化输出

说明:本文翻译自:struts-2.0.8docsdocsvalidating-input.html
     在验证输入这一小节中,我们使用验证框架来验证提交到表单的数据。在“本地化输出”这一节中,我们将验证信息移到消息资源文件中。

    当创建web应用程序的时候,我们发现我们在多个页面中常常使用一些相同的消息或字段标签。如果我们的系统由不同语言的用户使用时,我们也想要本地化消息。

一.本地化验证信息和属性值
    让我们增加一个消息资源文件,并且在其中加入验证信息和字段标签。
1.代码
    本框架将消息资源与类联系起来。为了为Logon action增加一个消息资源,我们需要将消息资源文件命名为Logon.properties,并且在Logon Action后设置它的classpath。但是,大多数人发现为某一个类使用一个单独的资源文件时间和低效率的工作。很多人更喜欢为一整个类包增加一个消息资源文件。为了做到这样,我们可以简单的为某个包增加一个paacage.properties文件。例如。我们为tutorial包增加一个资源文件tutorial/package.properties。该文件内容如下:

    requiredstring = ${getText(fieldName)} is required.
      password = Password
      username = User Name

     我们还需要改变一下验证器和Logon页面。Logon-validation.xml修改的地方:
    <message>Username is required</message>
      <message key=”requiredstring”/>

      <message>Password is required</message>
      <message key=”requiredstring”/>

     Logon,jsp修改的地方如下:

   <s:textfield label=”User Name” name=”username”/>
     <s:textfield label=”%{getText(‘username’)}” name=”username”/>

      <s:password label=”Password” name=”password” />
      <s:password label=”%{getText(‘password’)}” name=”password” />

2. 代码是如何工作的?
    1)“key”属性告诉验证器为一个消息资源捆绑验证;
    2)在资源捆绑中,表达式:${getText(fieldName)}告诉框架在资源文件中查找字段名。这种方式下我们能够为所有的非空验证使用相同的默认信息;
    3)相似地,在文本域中,表达式:%{getText(‘password’)}告诉框架在资源文件中寻找“password”。

二.本地化其余的信息
     其余的页面元素也能够被本地化。例如,我们需要在资源文件中增加“Hello World”和“Missing page”这两个消息。
1. 代码tutorial/package.properties:
# …
HelloWorld.message = Struts is up and running …
Missing.message = This feature is under construction. Please try again in the next interation.
    这对HelloWorld是可运行的,因为Hello World已经存在于包中。但是它对于默认的Missing action是不可用的,除非你将我们的基类加入到tutorial包中。

    TutorialSupport.java的代码如下:

package tutorial;
import com.opensymphony.xwork2.ActionSupport;
public class TutorialSupport extends ActionSupport {}
    并且还需要更新一下struts.xml默认的通配符映射,如下:

<action name=”*” class=”tutorial.TutorialSupport”>
<result>/{1}.jsp</result>
</action>
    现在,我们可以更新HelloWorld.jsp和Missing.jsp来查找信息。

    Missing.jsp的代码如下:

This feature is under construction. Please try again in the next interation.
<s:text name=”Missing.message”/>

    在HelloWorld的情况下,我们从Action类设置消息。让我们更新一下class,使用资源文件来代替它。HelloWorld的代码如下:

package tutorial;
public class HelloWorld extends ExampleSupport {
    public static final String MESSAGE = “HelloWorld.message”;
    public String execute() throws Exception {
        setMessage(getText(MESSAGE));
        return SUCCESS;
    }

//  
}

2. 代码是如何工作的?
   1)对于Missing.jsp,我们使用text标签来查找资源文件中的消息;
   2) 在HelloWorld中,我们在Action类中使用getText()方法来获得消息;
   3)  在HelloWorld.jsp中,只是显示由Action类设置的消息,所以不要做任何改变。

三.需要记住的东西

    框架支持国际化。为了本地化应用,我们增加了资源文件,并且更新某些元素或标签来应用资源文件中的资源而不是静态的文本。