struts如何实现国际化?

2020-05-12 22:34发布

struts如何实现国际化?

struts如何实现国际化?

1条回答

Struts的国际化


 


1.配置struts-config.xml文件:



以制定资源文件的路径


 


其中的"res.MessageResources"就是我们自己在src目录下面创建的国际化配置文件的路径


Res:目录名


MessageResources:basename


 


2.提供不同版本的国际化资源文件,中文需要采用native2ascii转换成unicode


 


3.在jsp中采用标签来读取国际化消息文本


 


为了用这个标签,我们需要使用struts定义的标签


<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean"%>


这样,我们使用就可以从国家化文件中读取到对应当前文字的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中就可以了。


 


 具体例子代码


 


比如超链接是这样的


 


中文


 


自己创建changelang的Action


 


public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)            throws Exception {


 


获得页面传递下来的语言信息


 


        String.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中的数据


 



       



 


这个标签会循环我们放在messages中的所有对象,默认情况下只读取其中标记为错误的部分。


这个标签中的message默认是“false”的,这个时候,这个标签只读我们saveErrors中的错误信息,如果希望他能读出普通的提示信息,就必须设置message="true"


 


如果我们不设置其中的property属性,它会循环出所有放在messages中的信息,但是如果我们设置了property="loginSuccess2",则我们就只能读出前面messages.add("loginSuccess2", message);中的那个message。


 


也可以通过显示消息,但是这种方式只能显示错误消息。


一周热门 更多>