null第4章 Struts 2的类型转换及输入校验第4章 Struts 2的类型转换及输入校验4.1 Struts 2类型转换4.2 自定义类型转换器4.3 对数组类型及集合类型的转换4.4 Struts 2的输入校验4.1 Struts 2类型转换4.1 Struts 2类型转换4.1.1 Struts 2的内置类型转换器
对于大部分常用类型,程序员不用创建自己的类型转换器,因为Struts 2可以完成大多数常用的类型转换,包括如下几种类型:
boolean和Boolean:完成String和布尔型之间的转换。
char和Character:完成String和字符型之间的转换。
int和Integer:完成String和整型之间的转换。
long和Long:完成String和长整型之间的转换。
float和Float:完成String和单精度浮点型之间的转换。
double和Double:完成String和双精度浮点型之间的转换。
Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。
数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类型。但若程序员自定义类型转换器,则要根据情况判断。
集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素时再进行手动转换。
类型转换是在页面与Action相互传递数据时发生的。
4.1.2 类型转换4.1.2 类型转换建立项目、添加Struts 2所需的类库及修改web.xml的步骤不再赘述,在第2章的例子中已经详细列举,本例取项目名为“Struts2TypeConverter”。本例建立一个简单的页面,如图4.1所示,让客户端填写用户信息,然后提交,在另一个页面展示出所填信息。
图4.1 项目初始页面4.1.2 类型转换4.1.2 类型转换本例中应用了模型传值方式,故需要建立一个模型类User.java。代码如下:
package org.vo;
import java.util.Date;
public class User {
private String username;
private String password;
private int age;
private Date bir;
private String tel;
//这里省略上述属性的get和set方法
}
4.1.2 类型转换4.1.2 类型转换故typeconverter.jsp页面代码可以写为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
类型转换
4.1.2 类型转换4.1.2 类型转换自定义Action类“SimpleTypeConverter.java”的代码为:
package org.action;
import org.vo.User;
import com.opensymphony.xwork2.ActionSupport;
public class SimpleTypeConverter extends ActionSupport{
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute() throws Exception {
return SUCCESS;
}
}
4.1.2 类型转换4.1.2 类型转换struts.xml配置如下:
/show.jsp
4.1.2 类型转换4.1.2 类型转换Action类处理完成后跳转的show.jsp页面代码为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
类型转换显示界面
姓名:
密码:
年龄:
生日:
电话:
4.1.2 类型转换4.1.2 类型转换运行该程序,提交后出现如图4.2所示的界面。
图4.2 程序提交后的页面4.2 自定义类型转换器4.2 自定义类型转换器前面说过,如果想要把输入的电话的区号和号码分开显示,Struts 2的内置类型转换器就不能做到了,这时就需要程序员自定义类型转换器。这里要达到这样的目的,输入界面如图4.3所示,当输入一个正确的电话后(因为还没讲到输入校验,故这里为做测试用例先输入正确的号码),单击“提交”按钮,出现如图4.4所示的界面,分别输出区号和电话号(本项目名为MyTypeConverter,从图4.4中的浏览器地址栏中可以看出)。
图4.3 输入界面 图4.4 显示界面4.2 自定义类型转换器4.2 自定义类型转换器typeconverter2.jsp页面代码非常简单,还是一个输入框及“提交”按钮:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
自定义类型转换器
4.2 自定义类型转换器4.2 自定义类型转换器实现的Action类也正常写出:
package org.action;
import org.vo.Tel;
import com.opensymphony.xwork2.ActionSupport;
public class MyTypeConverterAction extends ActionSupport{
private Tel tel;
public String execute() throws Exception {
return SUCCESS;
}
public Tel getTel() {
return tel;
}
public void setTel(Tel tel) {
this.tel = tel;
}
}
4.2 自定义类型转换器4.2 自定义类型转换器对应的Tel类Tel.java实现为:
package org.vo;
public class Tel {
private String sectionNo;
private String telNo;
public String getSectionNo() {
return sectionNo;
}
public void setSectionNo(String sectionNo) {
this.sectionNo = sectionNo;
}
public String getTelNo() {
return telNo;
}
public void setTelNo(String telNo) {
this.telNo = telNo;
}
}
4.2 自定义类型转换器4.2 自定义类型转换器自定义类型转换器需要实现Struts 2框架提供的TypeConverter接口,但这个接口比较复杂,里面的convertValue方法参数太多,不容易实现,Struts 2框架还提供了继承该接口的实现类DefaultTypeConverter。该类结构如下:
public class ognl.DefaultTypeConverter implements ognl.TypeConverter{
public DefaultTypeConverter();
public java.lang.Object convertValue(
java.util.Map context,
java.lang.Object value,
java.lang.Class toType
);
public java.lang.Object convertValue(
java.util.Map context,
java.lang.Object target,
java.lang.reflect.Member member,
java.lang.String prepertyName,
java.lang.Object value,
java.lang.Class toType
);
}
4.2 自定义类型转换器4.2 自定义类型转换器该类中有两个convertValue方法,其中第2个参数比较多的是TypeConverter类中的方法,所以继承该方法后,只需重写第1个convertValue方法即可。故本例中自定义类型转换器可写为。
该类主要重写了下面这个方法:
public Object convertValue(Map context, Object value, Class toType) {}
该方法中的参数有3个,下面分别介绍:
context:该参数就是类型转换的上下文,也就是Action的上下文。
value:value是需要转换的数据,这个数据可以是String类型,或者是需要转换的目标类型。从页面传递的数值有时可能不止一个,例如有几个输入框的名称相同,那么value就有多个值,不能用单独的String来接收值了,这时就必须用数组。这也就解释了上面为什么把value转换为字符串数组而不是字符串了。
4.2 自定义类型转换器4.2 自定义类型转换器这里是要把提交的字符串类型转换为Action类中的tel属性的Tel类型,故在该Action类所在路径下编写一个配置文件即可。该配置文件名称必须遵守“action类型-conversion.properties”格式,所以该例的配置文件名就必须为:“MyTypeConverterAction-conversion.properties”,并且同Action放在同一位置下,这里即放在“org.action”包下。而配置文件的内容为“变量名=包名.类名”。其中,“变量名”是Action类中转换的属性名,本例就为“tel”,“包名.类名”就是要用的自定义的类型转换器所在的包及其类名,本例就为“org.converter. MyTypeConverter”。故本例中配置文件的内容就为:
tel=org.converter.MyTypeConverter
4.2 自定义类型转换器4.2 自定义类型转换器这样配置后,系统就会根据该路径找到类型转换器来完成其类型转换工作。下面就可以配置struts.xml文件:
/show.jsp
4.2 自定义类型转换器4.2 自定义类型转换器最后是显示页面show2.jsp:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
自定义类型转换
区号:
号码:
4.2 自定义类型转换器4.2 自定义类型转换器页面传递的数据被Struts 2拦截,根据struts.xml中的配置找到MyTypeConverterAction类,然后在系统环境中寻找是否含有该Action类对应的MyTypeConverterAction-conversion.properties配置文件,如果找到,将其触发,对变量tel进行类型转换。完成后,执行Action类中的execute方法,最后跳转到show.jsp页面。
自定义的类型转换器继承了DefaultTypeConverter类,并重写了其convertValue方法,里面用了一些if…else语句来判断是从String向对象类型转换,还是从对象向String类型转换(实际上,类型转换也就两个方面,当接收数据时是从String向目标类型转换,而当输出时是向String类型转换),Struts 2框架还提供了一个StrutsTypeConverter类,该类继承了DefaultTypeConverter类。该类的部分源代码。
该类已经实现了convertValue方法,并把对不同方向(String到目标类型还是目标类型到String)的处理分成两个方法来处理,程序员只需重写这两个对应的方法即可,比之继承DefaultTypeConverter方法较为简单些。故可以把上例的自定义转换器用继承该类来实现。
4.2 自定义类型转换器4.2 自定义类型转换器这样可以更简单明了地完成类型转换的工作。当然,要对该转换器进行应用,需要在配置文件中进行修改,内容修改为:
tel=org.converter.MyStrutsTypeConverter
需要把前面的配置语句删除,也可以注释掉,在.properties文件中对代码进行注释只需在该行代码头部加上“#”即可。例如,注释掉前面的配置:
#tel=org.converter.MyTypeConverter
前面的例子中,对类型的转换指定到了某个Action类中的属性,但如果有另外的Action类中也有“Tel”类型的属性,势必还要写一个配置文件,对其进行转换,Struts 2框架提供了全局类型转换器的配置。相对而言,前面配置的就属于局部类型转换器,全局类型转换器就是让整个系统关于某个类型的转换都可以应用配置的类型转换器,全局类型转换器的配置非常简单,只需改变配置文件的名称、内容及位置即可,在上例中如果要配置全局类型转换器,只需在“src”下建立配置文件“xwork-conversion.properties”,也就是和struts.xml文件在同一目录下,而内容编写为:
org.vo.Tel=org.converter.MyStrutsTypeConverter
4.3 对数组类型及集合类型的转换4.3 对数组类型及集合类型的转换4.3.1 数组类型的使用
本节将用实例来说明数组类型的使用。假如现在有这样一个页面,该页面要求用户输入两个电话号码,然后提交后分别显示其区号及号码。页面如图4.5所示。
图4.5 输入页面4.3.1 数组类型的使用4.3.1 数组类型的使用该typeconverter3.jsp页面的代码为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
对数组的类型转换
4.3.1 数组类型的使用4.3.1 数组类型的使用可以看出,该页面的两个输入框应用了同一名称。这时,在Action类接收属性就用数组类型来实现:
package org.action;
import java.util.List;
import org.vo.Tel;
import com.opensymphony.xwork2.ActionSupport;
public class ArrayTypeConverterAction extends ActionSupport{
private Tel[] tel; //数组类型
public Tel[] getTel() {
return tel;
}
public void setTel(Tel[] tel) {
this.tel = tel;
}
public String execute() throws Exception {
return SUCCESS;
}
}
4.3.1 数组类型的使用4.3.1 数组类型的使用对应的Tel.java与前面的例子相同,这里不再列举。类型转换器ArrayTypeConverter.java实现为。
用数组类型时需要配置局部类型转换器,故该例配置文件应为“ArrayTypeConverterAction-conversion.properties”,内容为:
tel=org.converter.ArrayTypeConverter
位置应与ArrayTypeConverterAction.java文件位置相同。struts.xml配置文件为:
/show3.jsp
4.3.1 数组类型的使用4.3.1 数组类型的使用由于是多个值,故显示页面show3.jsp用
标签输出:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
对数组的类型转换
区号:
号码:
4.3.1 数组类型的使用4.3.1 数组类型的使用运行后,结果如图4.6所示,已经达到效果。图4.6 运行结果页面4.3.2 集合类型的使用4.3.2 集合类型的使用集合类型和数组类型差不多,也需要使用局部类型转换器,可以在上例的基础上稍做修改转换为集合类型。首先Action类修改为:
package org.action;
import java.util.List;
import org.vo.Tel;
import com.opensymphony.xwork2.ActionSupport;
public class ArrayTypeConverterAction extends ActionSupport{
private List tel; //应用泛型
public List getTel() {
return tel;
}
public void setTel(List tel) {
this.tel = tel;
}
public String execute() throws Exception {
return SUCCESS;
}
}
4.3.2 集合类型的使用4.3.2 集合类型的使用然后是自定义的类型转换器。
最后把配置文件内容修改为:
tel=org.converter.ListTypeConverter
4.4 Struts 2的输入校验4.4 Struts 2的输入校验所谓输入校验是指在把数据提交给程序处理之前,对数据信息进行合法性检查,只允许合法的数据进入应用程序。例如,后台是int型的数据,结果传来一个字符“a”,这样势必会报错,所以进行输入校验对应用程序是必不可少的。Struts 2应用中的输入校验大致有下面几种方法:
在Action类中的处理方法进行校验,若没有指定方法就用execute()方法。
继承ActionSupport类,并重写其validate()方法实现输入校验。
应用Struts 2的校验框架进行校验。
下面以简单的注册实例来分别介绍它们的用法。首先建立项目(本例起名为ValidateTest),然后加载Struts 2类库,修改web.xml文件。这里先简单开发一个注册功能的项目,后面分别用不同的校验方法进行校验。首先是注册页面index.jsp:
4.4 Struts 2的输入校验4.4 Struts 2的输入校验Action类文件“RegistAction.java”为:
package org.action;
import com.opensymphony.xwork2.ActionSupport;
public class RegistAction extends ActionSupport{
private String username;
private String password;
private String repassword;
private int age;
//上述属性的set和get方法
public String execute() throws Exception {
return SUCCESS;
}
}
4.4 Struts 2的输入校验4.4 Struts 2的输入校验struts.xml文件为:
/success.jsp
4.4 Struts 2的输入校验4.4 Struts 2的输入校验注册成功页面success.jsp为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
成功页面
恭喜您!您已经注册成功
4.4.1 使用execute()方法校验4.4.1 使用execute()方法校验使用execute()方法校验是最简单的方法,但一般不提倡使用这种方法,因为如果在execute()方法中要处理很多事情,那么把校验也放在这里就显得代码臃肿而且不易维护。这种方法只需读者了解就行,目的是让读者知道这种方法也是可行的。修改RegistAction.java代码为。
相应地在struts.xml中要加入验证失败后的跳转页面:
/index.jsp
运行后,输入界面如图4.7所示,不输入任何值,单击“提交”按钮会出现如图4.8所示的界面。
图4.7 输入界面 图4.8 验证失败界面4.4.2 重写validate()方法进行校验4.4.2 重写validate()方法进行校验自定义Action类在继承了ActionSupport后可以重写其validate()方法来实现输入校验,当在Action类中定义了该方法后,该方法会在执行系统的execute()方法之前执行。如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处。修改RegistAction.java类为。
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架使用校验框架是指在程序中创建一个配置文件,该文件的名称及内容按照一定的规则编写后会起到校验的作用。校验文件的命名规则为“ActionName-validation.xml”,比如上例中ActionName的值为“RegistAction”,那么,要为上例创建校验文件就应该命名为“RegistAction-validation.xml”,并且该文件必须与它对应的Action类文件处于同一目录下。另外,该文件还可命名为“ActionName-别名-validation.xml”,别名为action配置的name值。例如,上例就应为“RegistAction-regist-validation.xml”。命名规则清楚后,下面看其配置格式。Struts 2校验框架有两种配置格式。
1.使用标签
使用该标签可以声明字段型或非字段型两种类型校验器。
字段型校验器配置格式如下:
待校验字段名
校验失败信息
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架非字段型校验器格式如下:
OGNL
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达式取值
校验失败信息
例如,对username字段进行非空校验,应配置为:
username
username为空!
...//若要声明其他校验器,可以在下面继续配置标签来完成
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架2.使用标签
使用该标签可以在其内声明多个字段型或非字段型校验器。
校验器配置格式如下:
参数值
校验失败信息
...//下面还可以定义多个来配置其他校验器
例如,对usename字段进行非空校验,应配置为:
username为空!
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架在实际应用中,对一个字段进行校验的时候,这两种方式都是可行的。个人可以根据习惯来选择用哪种类型的校验器。
Struts 2提供了下面几种类型的校验框架:
required:检查字段是否为空。
requiredstring:检查字段是否为字符串且是否为空。
int:检查字段是否为整数且在[min,max]范围内。
double:检查字段是否为双精度浮点数且在[min,max]范围内。
date:检查字段是否为日期格式且在[min,max]范围内。
expression:对指定OGNL表达式求值。
fieldexpression:对指定OGNL表达式求值。
email:检查字段是否为E-mail格式。
url:检查字段是否为URL格式。
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架 visitor:引用指定对象各属性对应的检验规则。
conversion:检查字段是否发生类型的错误。
stringlength:检查字符串长度是否在指定范围内。
regex:检查字段是否匹配指定的正则表达式。
根据上述介绍,前面的注册程序的验证配置文件应配置为。
4.4.3 使用Struts 2校验框架4.4.3 使用Struts 2校验框架这样就可以完成同前面类似的校验。运行程序,出现如图4.7所示的界面,单击“提交”按钮,出现如图4.9所示的界面。输入password及repassword值,但让两次输入的密码不同,就会出现如图4.10所示的验证失败界面。
图4.9 验证失败界面 图4.10 密码不同时的验证失败界面4.4.4 客户端校验与服务器端校验4.4.4 客户端校验与服务器端校验前面介绍的校验是在服务器端进行的,Struts 2校验框架还提供了客户端校验。应用客户端校验非常简单,只需将标签的validate属性设置为true即可,该属性的默认值为false,故如果没有指定该属性,其值就为false,即为服务器端校验。同样是前面的例子,只在注册页面的中加入“validate=true”,然后刷新页面,再进行校验,结果会如图4.11所示。同样地,输入password及repassword值,但让两次输入的密码不同,就会出现如图4.12所示的验证失败界面。
图4.11 客户端验证失败界面 图4.12 客户端密码不同时的验证失败界面4.4.4 客户端校验与服务器端校验4.4.4 客户端校验与服务器端校验Struts 2的客户端校验所支持的校验器有以下几种:
int 校验器
double校验器
required校验器
requiredstring校验器
stringlength校验器
regex校验器
email校验器
url校验器