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>
|