SSH笔记-Struts2的语言国际化

1、配置国际化资源文件 四种方法

1、action范围资源文件:在action类所在路径建立 actionname_language_country.properties,适用于指定action类 如:TestAction_language_CN.properties
2、包范围资源文件:在包根路径下建立 package_language_country.properties,适用范围在properties所在包所有类,这里的package真的是直接下package,而不是包名 如:package_language_CN.properties
3、全局范围资源文件:在src下建立basename_language_country.properties,适用于整个项目 如:i18n.properties/i18n_en_US.properties/i18n_zh_CN.properties
4、临时资源文件(比较少用):在页面上使用s:i18n元素的name属性指定临时的国际化资源文件

2、需要在struts.xml中配置<constant name="struts.custom.i18n.resources" value="baseName"/>,如果不适用全局范围资源文件的话,value可以为空,如果使用全局范围文件的话,value需要是资源文件名

3、读取优先顺序:

临时资源文件>action范围资源文件>包范围资源文件>全局范围文件

4、访问国际化资源文件步骤
(1)action类:

  1. 实现TextProvider接口
  2. 使用getText(” “)方法取值

(2)页面:

  1. 使用s:text标签,使用表单标签对应的key属性读取值

5、如果想要页面上直接点击按钮实现语言转换,请求action时,request_locale参数值赋值为语言简写就可以了,如:en_US

6、如果想要在标签元素的label里面读取国际化资源文件的value值,就需要用%{}进行强制的OGNL转换 如:<s:textfield name="name" label="%{getText('name')}"></s:textfield>

7、struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

    <!-- 配置全局的国际化资源文件 -->
    <!-- 这里的value里面的i18n是自定义的 可以是其他名字 -->
    <constant name="struts.custom.i18n.resources" value="baseName"></constant>

    <package name="default" namespace="/" extends="struts-default">

        <action name="testAction" class="com.demo.sshtest.TestAction">
            <result>/index1.jsp</result>
        </action>

    </package>
</struts>

这里的constant标签的value,如果不用全局资源文件来配置的话,value可以为空,也可以不为空

8、显示页面 index1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
配置国际化资源文件 四种方法:
1、action范围资源文件:在action类所在路径建立 actionname_language_country.properties,适用于指定action类 如:TestAction_language_CN.properties
2、包范围资源文件:在包根路径下建立 package_language_country.properties,适用范围在properties所在包所有类 如:package_language_CN.properties
3、全局范围资源文件:在src下建立basename_language_country.properties,适用于整个项目 如:i18n.properties/i18n_en_US.properties
    (1)文件名就叫basename_language_country.properties
    (2)需要在struts.xml中配置<constant name="struts.custom.i18n.resources" value="baseName"/>
4、临时资源文件(比较少用):在页面上使用s:i18n元素的name属性指定临时的国际化资源文件
-->
<!--
资源文件加载顺序:离当前action越近,越优先打加载   即: 临时资源>基于action>基于包>基于全局
-->
<!--
在页面和action类中访问国际化资源文件步骤:
1、actino中实现TextProvider接口后,可以调用getText()方法取得值(可通过集成ActionSupport实现)
2、页面可以使用s:text标签,使用表单标签对应的key属性值实现
    (1)如果由占位符,则可以使用s:text标签的s:param子标签填充占位符
    (2)如果当前页面来自于action,可使用标签或OGNL直接访问action的属性值(访问值栈的属性值)
-->
<s:debug></s:debug>
<!-- 如果想在页面上直接点击按钮实现语言转换,只需要请求action时,在后面带上request_locale=语言,就可以了 -->
<a href="testAction?request_locale=en_US">English</a><br>
<a href="testAction?request_locale=zh_CN">中文</a><br>
<hr>
<br>

    <!-- s:text的name属性写的是资源文件里面的属性key,s:param的value写的是action里面定义的时间参数date(即值栈里面的date对象) -->
    <s:text name="datetime">
        <s:param value="date"></s:param>
    </s:text><br>
    <!-- i18n的properties中,可以直接用\${}代替占位符,然后把值栈里面的date对象放到\${}里面,来获取对应的值 -->
    <s:text name="datetime2"></s:text>
<hr>
<s:form action="">
    form主题不为simple时,能用label<br>
    <!-- label固定是name -->
    <s:textfield name="name" label="name"></s:textfield><br>
    <!--
        使用OGNL强制解析
        1、要label从资源文件中获取value值,就需要用 %{getText('')的方法
        2、因为这时候的国际化值是对象栈中的DefaultTextProvider的一个实例,整个对象提供访问资源文件的getText()方法
        3、struts2 框架label需要以 %{}包装着一个OGNL表达式getText(),强制进行OGNL解析
    -->
    <s:textfield name="name" label="%{getText('name')}"></s:textfield><br>
    <!-- key动态从资源文件读取name值 -->
    <s:textfield name="name" key="name"></s:textfield><br>
    <s:password name="pswd" key="pswd"></s:password><br>
    <s:submit key="submit"></s:submit>
</s:form>

<hr>
<br>

<s:form action="" theme="simple">
    form主题为simple时这里label没用,所以要用s:text标签读取资源文件的值<br>
    <s:text name="name"/>:<s:textfield name="name"></s:textfield><br>
    <s:text name="pswd"/>:<s:password name="pswd"></s:password><br>
    <!-- 遇到struts2标签 需要value里面拿值 就要用强制OGNL解析 -->
    <s:submit value="%{getText('submit')}"></s:submit>
</s:form>
</body>
</html>

9、action类 TestAction.java

package com.demo.sshtest;

import java.util.Arrays;
import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class TestAction extends ActionSupport{

    private static final long serialVersionUID = 1L;

    public Date date = null;
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String execute() throws Exception {
        //这里定义一下date的格式 就能使前台或console输出的时候按照想要的时间格式输出
        date = new Date();

        //action中访问资源文件value
        String name = getText("name");
        String pswd = getText("pswd");
        String submit = getText("submit");
        //读取带占位符的值
        String datetime = getText("datetime",Arrays.asList(date));
        System.out.println("name:"+name);
        System.out.println("pswd:"+pswd);
        System.out.println("submit:"+submit);
        System.out.println("datetime:"+datetime);
        return "success";
    }
}

10、英文资源文件 baseName_en_US.properties/package_en_US.properties/TestAction_en_US.properties

name=Username
pswd=Password
submit=submit
datetime=Time>>>{0}
datetime2=Time>>>${date}

这里为了区分三个properties文件的区别,所以会在value值的第一个字母加上数字来区分,而datetime2的date值,是直接读取值栈里面的date对象,来达到动态配置资源文件值的效果

11、中文资源文件
同上,只是value值为中文

12、项目目录
项目目录
里面的index.jsp只是用来第一次打开index1.jsp的时候调用action初始化一下页面的语言值

13、运行效果
运行效果
左边是eclipse的浏览器,页面默认显示语言是英文(即local值为en_US),右边是360浏览器,页面默认显示语言是中文(即local值为zh_CN)

运行效果2
这个是点击语言按钮后的运行结果,调用action时request_locale值为zh_CN,页面就会显示中文资源文件的对应值

14、项目demo
https://download.csdn.net/download/qq_22778717/10294774

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值