Action类获得国际化资源文件中的信息,主要使用ActionSupport类的getText方法进行。
ActionSupport类重载了很多getText方法,常用的有如下几个:
1、getText(String aTextName):参数aTextName是资源文件中的key值,可以返回对应的value值。
2、getText(String key,String[] args):参数key是资源文件中的key值,args可以用来给资源文件中的参数传值。
messageResource_en_US.properties
#The Text
register.info=Please input your register Info:
#The Form
custname.label=Input your name
pwd.label=Input your password
age.label=Input your age
address.label=Input your address
register.button=Register New Customer
#error message
custname.null=Input your custname,please.
pwd.null=Input your password,please.
custname.exit=Sorry,the custname already existed.
#action message
register.successful=Register successfully,login pls.
messageResource_zh_CN.properties
#The Text
register.info=\u8bf7\u8f93\u5165\u60a8\u7684\u6ce8\u518c\u4fe1\u606f\uff1a
#The Form
custname.label=\u8f93\u5165\u7528\u6237\u540d\uff1a
pwd.label=\u8f93\u5165\u5bc6\u7801\uff1a
age.label=\u8f93\u5165\u5e74\u9f84\uff1a
address.label=\u8f93\u5165\u5730\u5740
register.button=\u6ce8\u518c\u65b0\u7528\u6237
#error message
custname.null=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002
pwd.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\u3002
custname.exist=\u7528\u6237\u540d\u5df2\u5b58\u5728\uff0c\u8bf7\u7528\u5176\u4ed6\u7528\u6237\u540d\u6ce8\u518c\u3002
#action message
register.successful=\u6ce8\u518c\u6210\u529f\uff0c\u8bf7\u767b\u5f55\u3002
修改RegisterAction
public String register() {
CustomerServiceImpl cs = new CustomerServiceImpl();
cs.setDao(new CustomerDAOImpl());
try{
cs.register(cust);
this.addActionMessage(this.getText("register.successful"));
return "regsuccess";
}catch (RegisterException e) {
this.addActionError(this.getText("custname.exist"));
e.printStackTrace();
return "regfail";
}
}
@Override
public void validate(){
String custname=cust.getCustname();
String pwd = cust.getPwd();
if(custname==null||custname.equals("")){
this.addFieldError("custname", this.getText("custname.null"));
}
if(pwd==null||pwd.equals("")){
this.addFieldError("pwd", this.getText("pwd.null"));
}
}
运行后显示为资源文件中配置的相关信息。
校验器校验
Action对输入进行校验,不仅可以使用前面章节学习的手工编码方式,还可以调用API 中提供的校验器校验。
下面列举使用校验器进行校验的具体步骤:
1、Action类继承ActionSupport类,但是不需要覆盖validate方法。
2、在Action类所在包中创建“Action类名-validation.xml”形式的文件。
在action包下配置RegisterAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="custname">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="custname.null"></message>
</field-validator>
</field>
<field name="pwd">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="pwd.null"></message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">60</param>
<message key="age.int"></message>
</field-validator>
</field>
<field name="address">
<field-validator type="email">
<message key="address.email"></message>
</field-validator>
</field>
</validators>
上述代码中,
<field name="">表示对指定name的域进行校验。
<field-validator type="">表示使用type指定的名字在的校验器进行校验。
在资源文件中天剑age.int以及address.email键值,以定义错误信息
#The Text
register.info=\u8bf7\u8f93\u5165\u60a8\u7684\u6ce8\u518c\u4fe1\u606f\uff1a
#The Form
custname.label=\u8f93\u5165\u7528\u6237\u540d\uff1a
pwd.label=\u8f93\u5165\u5bc6\u7801\uff1a
age.label=\u8f93\u5165\u5e74\u9f84\uff1a
address.label=\u8f93\u5165\u5730\u5740
register.button=\u6ce8\u518c\u65b0\u7528\u6237
#error message
custname.null=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a\u3002
pwd.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\u3002
custname.exist=\u7528\u6237\u540d\u5df2\u5b58\u5728\uff0c\u8bf7\u7528\u5176\u4ed6\u7528\u6237\u540d\u6ce8\u518c\u3002
#action message
register.successful=\u6ce8\u518c\u6210\u529f\uff0c\u8bf7\u767b\u5f55\u3002
#register message
age.int=\u5e74\u9f84\u5fc5\u987b\u5728${min}\u548c${max}\u4e4b\u95f4
address.email=\u5730\u5740\u5fc5\u987b\u662f\u4e00\u4e2a\u6709\u6548\u7684email\u5730\u5740\u3002
修改RegisterAction.java
package action;
import service.CustomerServiceImpl;
import vo.Customer;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import dao.Impl.CustomerDAOImpl;
import exception.RegisterException;
public class RegisterAction extends ActionSupport implements ModelDriven<Customer>{
private Customer cust = new Customer();
public String register(){
CustomerServiceImpl cs = new CustomerServiceImpl();
cs.setDao(new CustomerDAOImpl());
try{
cs.register(cust);
this.addActionMessage(this.getText("register.successful"));
return"regsuccess";
}catch(RegisterException e) {
this.addActionError(this.getText("custname.exit"));
e.printStackTrace();
return "regfail";
}
}
/* @Override
public void validate(){
String custname=cust.getCustname();
String pwd = cust.getPwd();
if(custname==null||custname.equals("")){
// this.addFieldError("custname", "Pls input your name.");
}
if(pwd==null||pwd.equals("")){
// this.addFieldError("pwd", "Pls input your password.");
}
} */
@Override
public Customer getModel() {
return cust;
}
}
类型转换
请求参数的类型都是String类型,而在实际应用中,却往往需要将请求参数转换成其他类型,
如int、double、List等API中的类型,或者其他自定义的类型。
Struts2框架的内置类型转换有:
1、基本数据类型:int、boolean、double等,包括基本类型对应的包装器类型,如Integer、Boolean、Double等。
2、日期类型
3、Collection集合类型。
4、Set集合类型。
5、数组类型。
只要Action类继承了ActionSupport类,则内置的类型转换器将默认生效。
例:
当注册年龄输入字符串时,会有默认的校验错误信息输出:
如果需要修改默认的类型转换校验信息,则只要在Action类的包中声明局部属性文件即可,
名字为“Action类名.properties”
invalid.fieldvalue.age=年龄必须是数字
当定义了局部属性文件后,校验失败信息将被修改,不再使用默认的校验信息,而显示属性文件中定义的校验信息。