zoukankan      html  css  js  c++  java
  • struts如何实现国际化(转)

    Struts的国际化

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

    <message-resources parameter="res.MessageResources" />

    以制定资源文件的路径

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

    Res:目录名

    MessageResourcesbasename

    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对象,如果有直接用,如果没有strutsprocess的方法中就会从这个请求的头文件中获得其Locale对象,并把这个对象放置到session

    由于Locale信息是被保存在session中的,所以我们可以自己定义一个Locale对象,并把setsession中去,实现我们手动的语言切换。

     4、了解利用struts默认将locale放到session中的特性,完成采用编程的方式切换语言设置

    具体的实现方式是:

    1.自己写一个超连接,url指向我们自己定义的一个Action,后面带上语言参数,比如如果要中文就是“zh”。

    2.在我们自己定义的Action中获得语言参数,根据这个语言参数创建对应的Locale对象,放置到session中就可以了。

     具体例子代码

    比如超链接是这样的

    <a href="changelang.do?lang=zh">中文</a>

    自己创建changelangAction

    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在页面区分普通信息和错误信息就是以不同的keyrequest中去查找就对了。

    如果想在页面取出这些我们放入的错误信息,首先要加载对应的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>显示消息,但是这种方式只能显示错误消息。
  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/Fskjb/p/1563034.html
Copyright © 2011-2022 走看看