Struts2的国际化和验证框架

1、Struts2的国际化

将多语言版本的项目合并到一个项目中,通过读取不同语言环境的资源文件(properties),来显示不同语言的内容。

这些资源文件在Struts2中命名必须按照以下规则命名:

1)  主文件名必须相同

2)  必须放在src或config根目录下。

3)  主文件名后必须根上 语言缩写 国家缩写

例如:

主文件名是message,要求支持简体中文和美国英文。

文件名就要命名为:

message_zh_CN

message_en_US

 

在页面上通过:s:i18n或s:text 两组标签来实现国际化功能。

 

将需要显示的信息全部配置到资源文件中,配置后,页面上不允许再出现手写的中文内容

msg.news.insert=添加新闻

msg.news.list=新闻列表

msg.news.insert=Insert News

msg.news.list=News List

所有资源文件中,key值必须相同。

修改页面,在首页上使用s标签,加入s:i18n和s:text标签的内容

       <center>

           <s:i18n name="message">

              <a href="pages/back/news_insertPre.action"><s:text name="msg.news.insert"></s:text></a>

              <br />

              <a href="pages/back/news_list.action"><s:text name="msg.news.list"/></a>

              <br />

           </s:i18n>

       </center>

 

这里就实现了基本的国际化功能,现在可以通过浏览器的语言环境自动切换显示的语言。

 

如果想实现手工的切换功能,就必须通过Struts的语言环境设置方法来完成。

           <a href="language_change.action?name=zh_CN">中文</a>

           <a href="language_change.action?name=en_US">English</a>

通过点连接传递参数,进入Action后,就可以完成转换语言的功能。

@Controller

public class LanguageAction extends ActionSupport {

 

    private String name;

 

    public String change() throws Exception {

       // 拆分传入的内容

       String[] str = name.split("_");

       // 先根据传入的参数建立语言环境对象 Locale

       Locale loc = new Locale(str[0], str[1]);

       // 设置为当前Struts所使用的语言环境

       ServletActionContext.getContext().setLocale(loc);

 

       return "index";

    }

 

配置路径

    <package name="root" namespace="/" extends="my_project_default">

       <action name="language_*" class="languageAction" method="{1}">

           <result name="index">/index.jsp</result>

       </action>

    </package>

通过Struts2的拦截器,配合上面的功能,可以使属性长时间保存到Session范围中。

       // 手工再向Session范围保存一个属性

       ServletActionContext.getRequest().getSession().setAttribute("locale",

              loc);

建立拦截器类,必须继承Struts2提供的AbstractInterceptor

public class LocaleInterceptor extends AbstractInterceptor {

 

    @Override

    public String intercept(ActionInvocation invocation) throws Exception {

       // 取得session范围中自己保存的语言环境

       Locale loc = (Locale) invocation.getInvocationContext().getSession()

              .get("locale");

       if (loc != null) {

           invocation.getInvocationContext().setLocale(loc);

       }

 

       return invocation.invoke();

    }

}

将该类配置到公共的struts.xml中,作为默认拦截器使用。

    <package name="my_project_default" extends="struts-default"

       abstract="true">

       <interceptors>

           <interceptor name="localeInterceptor"

               class="org.liky.ssh.interceptor.LocaleInterceptor"></interceptor>

           <interceptor-stack name="myDefaultStack">

              <interceptor-ref name="localeInterceptor"></interceptor-ref>

              <interceptor-ref name="defaultStack"></interceptor-ref>

           </interceptor-stack>

       </interceptors>

       <default-interceptor-ref name="myDefaultStack"></default-interceptor-ref>

       <global-results>

           <result name="forward">/forward.jsp</result>

           <result name="input">/error.jsp</result>

       </global-results>

    </package>

 

即便这样配置,作用的范围也只在所有的Action中起作用,因此进入到页面前,必须保证按照标准MVC开发模式,先进入Action。

    public String change() throws Exception {

       // 拆分传入的内容

       String[] str = name.split("_");

       // 先根据传入的参数建立语言环境对象 Locale

       Locale loc = new Locale(str[0], str[1]);

       // 设置为当前Struts所使用的语言环境

       ServletActionContext.getContext().setLocale(loc);

 

       // 手工再向Session范围保存一个属性

       ServletActionContext.getRequest().getSession().setAttribute("locale",

              loc);

 

       message = "设置成功";

       url = "language_forward.action";

 

       return "forward";

    }

 

    public String forward() {

       return "index";

    }


2、Struts2的验证框架

通过Struts2编写的XML配置文件,可以替代validate方法,完成页面上一些内容的验证功能。

 

在Struts2的源代码开发包中,包含了验证规则的配置,里面包含一些非空,长度,类型,邮件地址格式等各种验证规则,可以自行编写XML使用这些规则完成验证。

 

如果想使用这个功能,必须保证分发使用自定义的method={1} 的方式,如果使用!形式,则不支持验证框架的分发。

 

验证时,需要先在要验证的Action的同一目录下,建立以下规则的XML文件,文件名必须为:

Action类名-<action>的name-validation.xml

 

例如:

新闻的添加功能需要验证

NewsAction-news_insert-validation.xml

<?xml version="1.0" encoding="UTF-8"?>

 

<!DOCTYPE validators PUBLIC

        "-//OpenSymphony Group//XWork Validator 1.0//EN"

        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

 

<validators>

    <field name="news.title">

       <field-validator type="requiredstring">

           <message><![CDATA[ 新闻标题不能为空! ]]></message>

       </field-validator>

       <field-validator type="email">

           <message><![CDATA[ 新闻标题必须输入邮件地址! ]]></message>

       </field-validator>

    </field>

    <field name="news.content">

       <field-validator type="requiredstring">

           <message><![CDATA[ 新闻内容不能为空! ]]></message>

       </field-validator>

       <field-validator type="stringlength">

           <param name="minLength">5</param>

           <param name="maxLength">20</param>

           <param name="trim">true</param>

           <message><![CDATA[ 新闻内容必须在 5 - 20位之间! ]]></message>

       </field-validator>

    </field>

</validators>

       






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值