Struts2总结之第四章国际化

Struts2总结之第四章国际化

复习:

1.action处理请求参数
1.属性驱动
1.直接将action做为model
2.在action声明一个model.在页面上需要使用ognl来给组件起名.
2.模型驱动
让action实现ModelDriven接口,重写getModel()方法,实例化一个model对象,
getModel方法返回的就是实例化的model对象。
2.struts2中类型转换
struts2中类型转换器的根接口TypeConverte

自定义类型转换器:
			1.创建一个类实现TypeConverter接口(继承DefaultTypeConverter  StrutsTypeConverter)
			2.重写方法
			3.注册类型转换器
				1.局部--action
					ActionClassName-conversion.properties
					属性名=类转换器全名
				2.局部--model
					modelClassName-conversion.properties
					属性名=类转换器全名	
				3.全局
					src下创建一个xwork-conversion.properties
					要转换的类型全名=类型转换器全名

3.struts2中请求参数校验

		1.手动编码
			要求:action类继承ActionSupport类,重写validate方法,在方法中使用										 addFieldError(String,String)
				 添加错误信息,在页面上使用<s:fielderror>展示错误信息。
				 
		2.xml配置
			
			位置:与action类在同一个包下.
			名称:actionclassName-validation.xml.
			约束:在xwrok-core.jar包下查找。
			书写

国际化

1、 国际化原理 ? 什么是国际化 ? 
    同一款软件 可以为不同用户,提供不同语言界面  ---- 国际化软件
    需要一个语言资源包(很多properties文件,每个properties文件 针对一个国家或者语言 ,
    通过java程序根据来访者国家语言,自动读取不同properties文件 )
	
2、 资源包编写 
        properties文件命名 :  基本名称_语言(小写)_国家(大写).properties
    例如 :
        messages_zh_CN.properties 中国中文
        messages_en_US.properties 美国英文
3、 ResourceBundle 根据不同Locale(地域信息),读取不同国家 properties文件
	ResourceBundle bundle = ResourceBundle.getBundle("messages", Locale.US);

Struts2国际化

struts2中对国际化进行了封装,我们只需要根据其提供的API进行访问就可以。

问题1:在struts2中国际化时properties文件怎样定义?(怎样定义properties)

		1.全局
			需要通过一个常量来声明.
			struts.custom.i18n.resources=testmessages,testmessages2
			对于properties配置文件可以放置在任意位置
			<constant name="struts.custom.i18n.resources" value="message"> 代表message.properties在src下
			<constant name="struts.custom.i18n.resources" value="cn.itcast.i18n.resource.message"> 代表message.properties在cn.itcast.i18n.resource包下.
		2.局部
			1.针对于action类
				位置:与action类在同一个包下.
				名称:ActionClassName.properties.
				这个配置文件只对当前action有效。
			2.针对于package下所有action
				位置:在指定的包下
				名称:package.properties
			3.jsp页面临时使用某一个properties文件.
				<s:i18n name="cn.itcast.action.package"></s:i18n>

问题2:在struts2中国际化操作可以在哪些位置使用?(在哪此位置上使用)

		1.action类中使用
		2.配置文件中使用<validation.xml>
		3.在jsp页面上使用

问题3:怎样在struts2中操作国际化?(怎样使用)

		1.在action类中使用
			前提:action类要继承ActionSupport类。
			getText(String name)就可以获取配置文件中对应名称的值。
		2.在validation.xml文件中使用
			<message key="名称"/>
		3.在jsp页面上使用
			<s:text name="名称"> 如果没有使用<s:i18n name="">来指定,会从全局配置文件中获取。
			如果要从某一个配置文件中获取,通过name属性来指定,  包名.配置文件名称 .

举例说明:

1、指定action类使用:Demo1i18n.java

配置文件:Demo1i18n.properties

username=用户名	

action类Demo1i18n.java

public class Demo1i18n extends ActionSupport {
	@Override
	//取出国际化信息
	public String execute() throws Exception {
		System.out.println(this.getText("username"));
		return NONE;
	}
}

2、在指定jsp页面使用指定的国际化配置文件;

在包下定义一个package.properties

username=包username

jsp页面使用:

i18n.jsp

	<!-- package指定包下的 -->
	<s:i18n name="com.syj.action.package">
		<s:text name="username"></s:text>
	</s:i18n><br>
	<!--取全局的,在全局定义的有message.properties -->
	<s:i18n name="message">
		<s:text name="username"></s:text>
	</s:i18n>
	<!-- 默认取全局的 -->
	<s:text name="username"></s:text>

3、在validation.xml文件中使用

  1. 在strute.xml中指定资源文件的基名。

     	 <constant name="struts.custom.i18n.resources" value="message"/>
         <constant name="struts.i18n.encoding" value="UTF-8" />
    

    对于properties配置文件可以放置在任意位置

    <constant name="struts.custom.i18n.resources" value="message">
    		代表message.properties在src下
    <constant name="struts.custom.i18n.resources"value="cn.itcast.i18n.resource.message">
            代表message.properties在cn.itcast.i18n.resource包下.
    
  2. 创建资源文件,用来存放相应的资源

    资源文件为properties文件,命名规则为:基名 _语言代号_地区代号.properties。基名就是第一步里设置的“message”。语言代号和地区代号可以在IE里查看:打开IE->打开internet选项->点击语言->点击添加,可以看到如下“添加语言”对话框,里面就有显示各种语言和地区的代号:

    Struts2总结之第四章国际化

    配置文件结构:
    Struts2总结之第四章国际化

    在src目录下添加分别为 中文-中国 和 英文-美国 的资源文件。那么对应的文件名就是:

    中文-中国:message_zh_CN.properties

    title=注册
    form.email=邮箱:
    form.password=密码:
    form.repassword=重复密码:
    form.phone=电话:
    form.submit=提交
    
    form.email.null=邮箱不能为空
    form.email.format=邮箱格式不正确
    form.password.null=密码不能为空
    form.password.length=密码长度不能少于6位
    form.repassword.same=两次密码不一至
    form.phone.format=电话号码格式不正确
    

    英文-美国:message_en_US.properties

    title=register
    form.email=eMail:
    form.password=password:
    form.repassword=repassword:
    form.phone=phone:
    form.submit=submit
    
    form.email.null=eMail cannot be null
    form.email.format=eMail format is error
    form.password.null=password cannot be null
    form.password.length=minimum password length is 6
    form.repassword.same=repassword should be same with password
    form.phone.format=phone format is error
    

    message.properties

    title=注册
    form.email=邮箱:
    form.password=密码:
    form.repassword=重复密码:
    form.phone=电话:
    form.submit=提交
    
    form.email.null=邮箱不能为空
    form.email.format=邮箱格式不正确
    form.password.null=密码不能为空
    form.password.length=密码长度不能少于6位
    form.repassword.same=两次密码不一至
    form.phone.format=电话号码格式不正确
    

  3. 实现JSP页面信息的国际化显示

    Register.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@taglib   prefix="s" uri="/struts-tags"  %> 
        
    <!DOCTYPE html>
    <html>
    <head>
    <title><s:text name="title" /></title>
    </head>
    <body>
    <form action="register.action" method="post">
             <table> 
                 <tr>
                    <!-- 把和显示相关的文字都替换成  <s:text name="对应资源文件的键"/>   -->
                     <td><s:text name="form.email" /></td>
                     <td><input type="text" name="email"/></td>
                     <!-- 使用<s:fielderror/>标签输入相应的字段错误信息 -->
                     <td><s:fielderror fieldName="email"/></td>
                 </tr>
                 <tr>
                    <!-- 把和显示相关的文字都替换成  <s:text name="对应资源文件的键"/> -->
                     <td><s:text name="form.password"/></td>
                     <td><input type="password" name="password"/></td>
                     <td><s:fielderror fieldName="password"/></td>
                 </tr>
                 <tr>
                     <td><s:text name="form.repassword" /></td><td>
                     <input type="password" name="repassword"/></td>
                     <td><s:fielderror fieldName="repassword"/></td>
                 </tr>
                 <tr>
                     <td><s:text name="form.phone" /></td>
                     <td><input type="text" name="phone"/></td>
                     <td><s:fielderror fieldName="phone"/></td>
                 </tr>
                 <tr>
                     <td><input type="submit" value="<s:text name="form.submit"/>"/></td>
                     <td></td>
                     <td></td>
                 </tr>
             </table>
         </form>
    </body>
    </html>
    
  4. 验证框架的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC
      		"-//Apache Struts//XWork Validator 1.0.3//EN"
      		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
    
    <validators>
    <!-- name值为需要被校验的字段,这里对email字段进行校验 -->
    	<field name="email">
    	 <!-- type值为校验器名,requiredstring:非空字符串校验器 -->
    		<field-validator type="requiredstring">
    			<message key="form.email.null"/>
    		</field-validator>
    		  <!-- 一个字段可以配置多个校验器,email:校验邮箱格式 -->
    		<field-validator type="email">
    			<message key="orm.email.format" />
    		</field-validator>
    	</field>
    
    	<field name="password">
    		<field-validator type="requiredstring">
    			<message key="form.password.null"  />
    		</field-validator>
    		<!-- stringlength:字符串长度校验 -->
    		<field-validator type="stringlength">
    			<!-- 为校验器指定参数实现不同的校验规则,minlength:最少长度 -->
    			<param name="minLength">6</param>
    			<message  key="form.password.length" />
    		</field-validator>
    	</field>
    
    <!-- 校验两次密码是否一致,使用 fieldexpression 校验器。expression参数指定判断用的表达式 -->
    	<field name="repassword">
    		<field-validator type="fieldexpression">
    			<!-- 表达式要写在 <![CDATA[]]> 内 -->
    			<param name="expression"><![CDATA[repassword==password]]></param>
    			<message key="form.repassword.same"  />
    		</field-validator>
    	</field>
    
    	<!-- 校验电话格式,使用regex正则表达示校验,regexExpression参数指定正则表达式 -->
    	<field name="phone">
    		<field-validator type="regex">
    			<param name="regexExpression"><![CDATA[\d{11}]]></param>
    			<message key="form.phone.format" />
    		</field-validator>
    	</field>
    </validators>
    
  5. 启动tomcat。用IE打开Register.jsp页面。当我们直接点击提交的时候因为校验器的存在会报中文错误,错误显示有优先级,前面错误不排除,后面的错误不显示

Struts2总结之第四章国际化

6.邮箱正确密码正确,重复密码不正确:

Struts2总结之第四章国际化

​ 7.打开internet选项->点击语言->点击添加,可以看到如下“添加语言”对话框。添加“英语(美国)[en-US]”项,并把该项上移到最上层,退回时记得每一步都点击确定
Struts2总结之第四章国际化

刷新页面:

Struts2总结之第四章国际化
刷新页面之后直接提交:
Struts2总结之第四章国际化