测试项目工程的结构图如下:
globalMessage.properties为默认配置资源文件
globalMessage_zh_CN.properties为中文配置资源文件
globalMessage_en_US.properties为英文配置资源文件
接着 在资源文件中添加我们index.jsp界面中需要国际化效果的键值对信息
globalMessage.properties,globalMessage_zh_CN.properties的内容为:
globalMessage_en_US.properties的内容为:
username=Username password=Password submit=Submit china=China us=English
完成了资源文件的基本配置 就要设计index.jsp
struts2中为了获取国际化资源信息同样是采用struts标签<s:text> 或者 form表单中可通过标签中的key属性来获取。
index.jsp
<s:form action="userAction" method="post">
<s:textfield key="username" name="name"></s:textfield><s:fielderror fieldName="name"></s:fielderror>
<s:password key="password" name="password"></s:password><s:fielderror fieldName="password"></s:fielderror>
<s:submit key="submit"></s:submit>
</s:form>
<s:url action="localeAction" id="url">
<s:param name="lan" value="1"></s:param>
</s:url>
<s:url action="localeAction" id="url1">
<s:param name="lan" value="2"></s:param>
</s:url>
<a href="<s:property value="#url"/>"><s:text name="china"></s:text></a>
<a href="<s:property value="#url1"/>"><s:text name="us"></s:text></a>
从api我们看出 getText方法 是类ActionSupport实现了接口TextProvider
在我们查看 TextProvider 的api中 我们可以看到这么一段话:
You can override LocaleProvider.getLocale() to change the behaviour of how to choose locale for the bundles that are returned.
Typically you would use the LocaleProvider interface to get the users configured locale.
大意也就是 我们如果想改变系统的locale 可以通过重写LocaleProvider的 getLocale()方法 从而来实现
那么我们就可以自定义action让其实现接口LocaleProvider 重写getLocale()方法。让其返回我们设置的locale
本次我们是通过链接 访问我们自定义的action 通过参数 来设置不同环境的locale 具体代码如下:
Action代码:
import java.util.Locale;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.LocaleProvider;
public class ChangeLocale extends ActionSupport implements LocaleProvider {
private String lan;
public String getLan() {
return lan;
}
public void setLan(String lan) {
this.lan = lan;
}
public Locale getLocale() {
System.out.println("changelocale-------1");
Locale locale=null;
if(lan.equals("1")){
locale=new Locale("zh", "cn");
}else if(lan.equals("2")){
locale=new Locale("en", "US");
}
return locale;
}
@Override
public String execute() throws Exception {
System.out.println(lan);
System.out.println("changelocale-------2");
ActionContext ac=ActionContext.getContext();
ac.setLocale(getLocale());
return "success";
}
}
Struts.xml:
<struts> <constant name="struts.devMode" value="false" /> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <!-- 将错误消息转换成中文的文件,也称为国际化.我就直接放置在src目录下所以value不带包名 --> <constant name="struts.custom.i18n.resources" value="globalMessage" /> <package name="default" namespace="/" extends="struts-default"> <action name="localeAction" class="ChangeLocale"> <result name="success">/index.jsp</result> </action> </package> </struts>
效果图: