Struts的国际化
1.配置struts-config.xml文件:
<message-resources parameter="res.MessageResources" />
以制定资源文件的路径
其中的"res.MessageResources"就是我们自己在src目录下面创建的国际化配置文件的路径
Res:目录名
MessageResources:basename
2.提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode
3.在jsp中采用<bean:message>标签来读取国际化消息文本
为了用这个标签,我们需要使用struts定义的标签
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
这样,我们使用<bean:message key="user.title"/>就可以从国家化文件中读取到对应当前文字的key的值
当一个http请求被发送过来的时候,struts默认会先从session中检查是否有对应的locale对象,如果有直接用,如果没有struts的process的方法中就会从这个请求的头文件中获得其Locale对象,并把这个对象放置到session中
由于Locale信息是被保存在session中的,所以我们可以自己定义一个Locale对象,并把set到session中去,实现我们手动的语言切换。
4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置
具体的实现方式是:
1.自己写一个超连接,url指向我们自己定义的一个Action,后面带上语言参数,比如如果要中文就是“zh”。
2.在我们自己定义的Action中获得语言参数,根据这个语言参数创建对应的Locale对象,放置到session中就可以了。
具体例子代码
比如超链接是这样的
<a href="changelang.do?lang=zh">中文</a>
自己创建changelang的Action
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
获得页面传递下来的语言信息
String lang = request.getParameter("lang");
Locale currentLocale = Locale.getDefault();
if ("zh".equals(lang)) {
currentLocale = new Locale("zh", "CN");
}else if("en".equals(lang)) {
currentLocale = new Locale("en", "US");
}
//request.getSession().setAttribute(Globals.LOCALE_KEY, currentLocale);
这里调用的struts自己内部定义好的方法,把我们自己定义的 currentLocale对象放置到session中。上面注释掉的代码所做的功能和这个是一样的
this.setLocale(request, currentLocale);
return mapping.findForward("index");
}
先根据session的locale加载属性文件,没有的话读取http头文件的loacle,那么当http头文件的loacle没有对应的属性文件与之匹配时,究竟会显示那种语言呢?答案是:根据服务器端得区域和语言的设置加载相关的属性文件,组后根据默认的属性文件。比如说,你有中文和英文的两个属性文件和一个默认的属性文件,区域设置为中文中国。浏览器传过来的是一个阿拉伯的locale,这时没有相应的阿拉伯属性文件存在,这时就会根据区域中的中文中国读取中文的属性文件,如果万一,区域是俄罗斯或别的,那么就会读取默认的属性文件。(测试时,当区域设置发生改变时要重启tomcat)
动态填充提示信息
1.在对应的国际化文件中配置对应信息
比如我们添加了如下信息:
user.login.success={0},登录成功
现在我们希望在程序中动态填充上这个信息,只要下面这样就可以了
1.创建国际化消息文本集合
ActionMessages messages = new ActionMessages();
2.创建国际化消息文本
ActionMessage message = new ActionMessage("user.login.success", new Object[]{username})
ActionMessage :一个ActionMessage对象对应国际化文件中的一条消息
User.login.success:对应消息key
new Object[]{username}:该数组通过下标与消息中的占位符一一对应
3.把这个消息文本加到前面创建的文本集合中
messages.add("loginSuccess2", message);
4.传递这个文本集合到页面的request对象中去
this.saveMessages(request, messages);
注意:这个saveMessages方法Action对象自带的。其内部源码实际上就是把我们创建的这个文本集合放置到request的一个属性中去
其内部源码就是这样:
request.setAttribute(Globals.MESSAGE_KEY, messages);
我们可以使用struts提供的标签把它拿出来。
但是,如果上面的消息是一个错误消息的话,就需要这样
this.saveErrors(request, messages);
这个时候,内部其实同样是把文本集合放置到一个request属性中去,只不过key值发生变化,源码是这样的
request.setAttribute(Globals.ERROR_KEY, errors);
Struts在页面区分普通信息和错误信息就是以不同的key到request中去查找就对了。
如果想在页面取出这些我们放入的错误信息,首先要加载对应的struts的标签库
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
然后用下面方法可以读取我们放入到messages中的数据
<html:messages id="msg" message="true" property="loginSuccess1">
<bean:write name="msg"/>
</html:messages>
这个标签会循环我们放在messages中的所有对象,默认情况下只读取其中标记为错误的部分。
这个标签中的message默认是“false”的,这个时候,这个标签只读我们saveErrors中的错误信息,如果希望他能读出普通的提示信息,就必须设置message="true"
如果我们不设置其中的property属性,它会循环出所有放在messages中的信息,但是如果我们设置了property="loginSuccess2",则我们就只能读出前面messages.add("loginSuccess2", message);中的那个message。
也可以通过<html:errors>显示消息,但是这种方式只能显示错误消息。