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文件中使用
-
在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包下.
-
创建资源文件,用来存放相应的资源
资源文件为properties文件,命名规则为:基名 _语言代号_地区代号.properties。基名就是第一步里设置的“message”。语言代号和地区代号可以在IE里查看:打开IE->打开internet选项->点击语言->点击添加,可以看到如下“添加语言”对话框,里面就有显示各种语言和地区的代号:
配置文件结构:
在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=电话号码格式不正确
-
实现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>
-
验证框架的配置文件
<?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>
-
启动tomcat。用IE打开Register.jsp页面。当我们直接点击提交的时候因为校验器的存在会报中文错误,错误显示有优先级,前面错误不排除,后面的错误不显示
6.邮箱正确密码正确,重复密码不正确:
7.打开internet选项->点击语言->点击添加,可以看到如下“添加语言”对话框。添加“英语(美国)[en-US]”项,并把该项上移到最上层,退回时记得每一步都点击确定
刷新页面:
刷新页面之后直接提交: