• 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>显示消息,但是这种方式只能显示错误消息。
  • 相关阅读:
    ES6-01 2018-02-06
    8.1 IO类
    2.4 const限定符
    C++命名空间
    win7系统docker安装ubuntu
    win7安装docker
    wuzhicms 查看模板中的所有可用变量和值
    wuzhicms上传弹出层,如何返回数据到当前页面?
    wuzhicms 无规律推荐位标签的嵌套使用
    【wuzhicms】apache 设置禁止访问某些文件或目录
  • 原文地址:https://www.cnblogs.com/Fskjb/p/1563034.html
Copyright © 2020-2023  润新知