《Struts2类型转换及输入校验.ppt》由会员分享,可在线阅读,更多相关《Struts2类型转换及输入校验.ppt(43页珍藏版)》请在三一办公上搜索。
1、第4章Struts 2类型转换及输入校验,4.1 Struts 2内置类型转换器,4.2 自定义类型转换器,4.3 数组和集合类型的转换,4.4 Struts 2输入校验,4.1 Struts 2内置类型转换器,4.1.1 常用类型转换器对于大部分常用类型,程序员不用创建自己的类型转换器,因为Struts 2可以完成大多数需要用到的默认功能,这些常用的类型转换器包括如下几种。boolean和Boolean:完成String和布尔型之间的转换。char和Character:完成String和字符型之间的转换。int和Integer:完成String和整型之间的转换。long和Long:完成Str
2、ing和长整型之间的转换。float和Float:完成String和单精度浮点型之间的转换。double和Double:完成String和双精度浮点型之间的转换。Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类型。但若程序员自定义类型转换器,则要根据情况判断。集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素时再进行手动转换。,4.1.2 内置转换器的使用,【实例4.1】建立一个简单的页面,如图4.1所示,让
3、客户端填写用户信息,然后提交,在另一个页面上显示出所填信息。,4.1.2 内置转换器的使用,1创建Struts 2项目建立项目,取项目名为“Struts2TypeConverter”。加载Struts 2包及修改web.xml文件,配置Struts 2,操作同【实例2.1】的第1步、第2步,不再赘述。2构造模型传值本例中应用了模型传值方式,故需要构造一个JavaBean(模型类)User.java。代码如下:package org.vo;import java.util.Date;public class User private String username;/姓名private Stri
4、ng password;/密码private int age;/年龄private Date bir;/生日private String tel;/电话/这里省略上述属性的get和set方法,4.1.2 内置转换器的使用,故converter.jsp页面代码可以写为:类型转换,4.1.2 内置转换器的使用,3编写控制器Action自定义Action类“SimpleTypeConverter.java”的代码如下:package org.action;import org.vo.User;import com.opensymphony.xwork2.ActionSupport;public cl
5、ass SimpleTypeConverter extends ActionSupportprivate 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 内置转换器的使用,struts.xml配置如下:/show.jsp,4.1.2 内置转换器的使用,4编写JSPAction类处理完成后跳转到show.jsp页面,代码如下:类型转换显示界面姓名:
6、密码:年龄:生日:电话:,4.1.2 内置转换器的使用,运行该程序,提交后出现如图4.2所示的界面。,4.2 自定义类型转换器,4.2.1 继承DefaultTypeConverter类实现转换器下面以一个简单实例说明。【实例4.2】在图4.3中的输入栏输入一个正确完整的电话后,单击【提交】按钮,出现如图4.4所示的界面,分别输出区号和电话号。,4.2.1 继承DefaultTypeConverter类实现转换器,1创建Struts 2项目建立项目,取项目名为“MyTypeConverter”。加载Struts 2包及修改web.xml文件,配置Struts 2,操作同【实例2.1】的第1步、
7、第2步,不再赘述。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 setTel
8、No(String telNo)this.telNo=telNo;,4.2.1 继承DefaultTypeConverter类实现转换器,对应converter2.jsp页面的代码写为:自定义类型转换器,4.2.1 继承DefaultTypeConverter类实现转换器,3编写控制器Action编写Action类“MyTypeConverterAction”的代码为:package org.action;import org.vo.Tel;import com.opensymphony.xwork2.ActionSupport;public class MyTypeConverterActi
9、on extends ActionSupportprivate Tel tel;public String execute()throws Exception return SUCCESS;public Tel getTel()return tel;public void setTel(Tel tel)this.tel=tel;在struts.xml文件中配置:/show2.jsp,4.2.1 继承DefaultTypeConverter类实现转换器,4实现类型转换器自定义类型转换器需要实现Struts 2框架提供的TypeConverter接口,但这个接口比较复杂,里面的convertVal
10、ue方法参数太多,不容易实现,Struts 2框架于是提供了继承该接口的实现类DefaultTypeConverter。该类结构如下:public class ognl.DefaultTypeConverter implements ognl.TypeConverterpublic DefaultTypeConverter();public java.lang.Object convertValue(java.util.Map context,java.lang.Object value,java.lang.Class toType);public java.lang.Object conve
11、rtValue(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.1 继承DefaultTypeConverter类实现转换器,该类中有两个convertValue方法,其中第2个参数比较多的是TypeConverter类中的方法,所以继承该方法后,只需重写第1个convertValue方法即可。故本例中自定义类型转换器可写为。
12、该类主要重写了下面这个方法:public Object convertValue(Map context,Object value,Class toType)该方法中的参数有3个,下面分别进行介绍。context:该参数就是类型转换的上下文,也就是Action的上下文。value:value是需要转换的数据,这个数据可以是String类型,或者是需要转换的目标类型。从页面传递的数值有时可能不止一个,例如,有几个输入框的名称相同,那么value就有多个值,不能用单独的String来接收值了,这时就必须用数组。这也就解释了上面为什么把value转换为字符串数组而不是字符串了。toType:准备转换
13、成的目标类型。,4.2.1 继承DefaultTypeConverter类实现转换器,5注册类型转换器类型转换器编写完成后,需要注册,否则Struts 2框架不知道用哪个类型转换器对提交的数据进行转换。这里要把提交的字符串类型转换为Action类中的tel属性的Tel类型,故在该Action类所在路径下编写一个配置文件即可。该配置文件名称必须遵守“action类名-conversion.properties”格式,所以本例的配置文件名为:“MyTypeConverterAction-conversion.properties”,并且同Action放在同一位置(这里是org.action包)下。
14、在MyTypeConverterAction-conversion.properties文件中写入如下注册信息:配置文件内容为“变量名=包名.类名”。,4.2.1 继承DefaultTypeConverter类实现转换器,6编写JSP最后编写显示页面show2.jsp,代码如下:自定义类型转换 区号:号码:,4.2.2 继承StrutsTypeConverter类实现转换器,【实例4.2】的运行流程。首先,页面传递的数据被Struts 2拦截,根据struts.xml中的配置找到MyTypeConverterAction类,然后在系统环境中寻找是否含有该Action类对应的MyTypeConv
15、erterAction-conversion.properties配置文件,如果找到,将其触发,对变量tel进行类型转换。完成后,执行Action类中的execute方法,最后跳转到show2.jsp页面。可以看出,自定义的类型转换器继承了DefaultTypeConverter类,并重写了其convertValue方法,里面用了一些ifelse语句来判断是从String向对象类型转换,还是从对象向String类型转换(实际上,类型转换也就两个方向:当接收数据时是从String向目标类型转换,而输出时则是向String类型转换),这样难免有点麻烦,Struts 2框架还提供了一个StrutsT
16、ypeConverter类,该类继承了DefaultTypeConverter类。,4.2.2 继承StrutsTypeConverter类实现转换器,该类的部分源代码如下:public abstract class StrutsTypeConverter extends DefaultTypeConverter public Object convertValue(Map context,Object o,Class toClass)if(toClass.equals(String.class)return convertToString(context,o);else if(o insta
17、nceof String)return convertFromString(context,(String)o,toClass);else if(o instanceof String)return convertFromString(context,new String(String)o,toClass);else return performFallbackConversion(context,o,toClass);protected Object performFallbackConversion(Map context,Object o,Class toClass)return sup
18、er.convertValue(context,o,toClass);public abstract Object convertFromString(Map context,String values,Class toClass);public abstract String convertToString(Map context,Object o);,4.2.2 继承StrutsTypeConverter类实现转换器,故可以把【实例4.2】的自定义转换器用继承该类来实现:package org.converter;import java.util.Map;import org.apache
19、.struts2.util.StrutsTypeConverter;import org.vo.Tel;public class MyStrutsTypeConverter extends StrutsTypeConverterpublic Object convertFromString(Map arg0,String arg1,Class arg2)Tel t=new Tel();String str=arg10.split(-);t.setSectionNo(str0);t.setTelNo(str1);return t;public String convertToString(Map
20、 arg0,Object arg1)Tel t=(Tel)arg1;return+t.getSectionNo()+-+t.getTelNo()+;这样就更简单明了地完成了类型转换的工作。当然,也要对该转换器进行注册,需要修改配置文件的内容为:,4.3 数组和集合类型的转换,4.3.1 数组类型转换器【实例4.3】假如现在有这样一个页面,该页面要求用户输入两个电话号码,然后提交后分别显示其区号及号码。页面如图4.5所示。,4.3.1 数组类型转换器,1创建Struts 2项目建立项目,取项目名为“ArrayTypeConverter”。加载Struts 2包及修改web.xml文件,配置Str
21、uts 2,操作同【实例2.1】的第1步、第2步,不再赘述。2构造模型传值构造Tel.java代码与【实例4.2】相同,这里不再列举。对应converter3.jsp页面的代码如下:对数组的类型转换,4.3.1 数组类型转换器,3编写控制器Action编写Action类“ArrayTypeConverterAction”的代码如下:package org.action;import java.util.List;import org.vo.Tel;import com.opensymphony.xwork2.ActionSupport;public class ArrayTypeConvert
22、erAction extends ActionSupportprivate 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 数组类型转换器,在struts.xml文件中配置:/show3.jsp,4.3.1 数组类型转换器,4实现类型转换器数组类型转换器ArrayTypeConverter.java实现为。5注册类型转换器用数组类型时需要配置局部类型转
23、换器,故该例配置文件应为“ArrayTypeConverterAction-conversion.properties”,内容为:位置应与ArrayTypeConverterAction.java文件的位置相同。,4.3.1 数组类型转换器,6编写JSP由于是多个值传递,故显示页面show3.jsp用标签输出:对数组的类型转换 区号:号码:,4.3.1 数组类型转换器,运行后,结果如图4.6所示,已经达到效果。,4.3.2 集合类型转换器,集合类型和数组类型差不多,也需要使用局部类型转换器,可以在【实例4.3】基础上稍做修改转换为集合类型。首先Action类修改为:package org.ac
24、tion;import java.util.List;import org.vo.Tel;import com.opensymphony.xwork2.ActionSupport;public class ArrayTypeConverterAction extends ActionSupportprivate List tel;/应用泛型public List getTel()return tel;public void setTel(List tel)this.tel=tel;public String execute()throws Exception return SUCCESS;然后
25、是自定义的集合类型转换器。最后把配置文件内容修改为:,4.4 Struts 2输入校验,Struts 2应用中的输入校验大致有下面几种方法。在Action类中的处理方法进行校验,若没有指定方法就用execute()方法。继承ActionSupport类,并重写其validate()方法实现校验。应用Struts 2的校验框架进行校验。,4.4 Struts 2输入校验,【实例4.4】开发一个简单的注册功能项目,然后分别用不同的校验方法对用户填写的注册信息进行校验。创建Struts 2项目,名为ValidateTest,然后加载Struts 2包,配置web.xml文件,操作步骤同【实例2.1】
26、的第1步、第2步,不再赘述。首先是注册页面index.jsp:注册页面,4.4 Struts 2输入校验,Action类文件RegistAction.java为:package org.action;import com.opensymphony.xwork2.ActionSupport;public class RegistAction extends ActionSupportprivate String username;/姓名private String password;/密码private String repassword;/确认密码private int age;/年龄/上述属
27、性的set和get方法public String execute()throws Exception return SUCCESS;在struts.xml文件中配置为:/success.jsp,4.4 Struts 2输入校验,注册成功页面success.jsp为:成功页面 恭喜您!您已经注册成功,4.4.1 使用execute()方法校验,这是最简单的办法,只要在RegistAction类的execute()方法中添加校验代码即可,如下:public class RegistAction extends ActionSupportpublic String execute()throws E
28、xception if(username.equals()|username=null)addFieldError(username,username为空);else if(password.equals()|password=null)addFieldError(password,password为空);else if(repassword.equals()|repassword=null)addFieldError(repassword,repassword为空);else if(!password.equals(repassword)addFieldError(password,两次输入
29、密码不同);else if(age150)addFieldError(age,age必须在1到150之间);if(hasErrors()return INPUT;return SUCCESS;,4.4.1 使用execute()方法校验,相应地在struts.xml中也要加入验证失败后的跳转页面:/index.jsp运行后,输入界面如图4.7所示,不输入任何值直接单击【提交】按钮,会出现如图4.8所示的界面。,4.4.2 重写validate()方法校验,自定义Action类在继承了ActionSupport后可以重写其validate()方法来实现输入校验,当在Action类中定义了该方法后
30、,该方法会在执行系统的execute()方法之前执行。如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处。修改RegistAction.java类为:public class RegistAction extends ActionSupportpublic String execute()throws Exception return SUCCESS;public void validate()if(username.equals()|username=null)addFieldError(username,usernam
31、e为空);else if(password.equals()|password=null)addFieldError(password,password为空);else if(repassword.equals()|repassword=null)addFieldError(repassword,repassword为空);else if(!password.equals(repassword)addFieldError(password,两次输入密码不同);else if(age150)addFieldError(age,age必须在1到150之间);,4.4.3 使用Struts 2校验框
32、架,1使用标签使用该标签可以声明字段型或非字段型两种类型校验器。字段型校验器配置格式如下:待校验字段名校验失败信息非字段型校验器格式如下:OGNL表达式取值校验失败信息,4.4.3 使用Struts 2校验框架,例如,对username字段进行非空校验,应配置为:usernameusername为空!./若要声明其他校验器,可以在下面继续配置标签来完成,4.4.3 使用Struts 2校验框架,2使用标签使用该标签可以在其内声明多个字段型或非字段型校验器。校验器配置格式如下:参数值 校验失败信息./下面还可以定义多个来配置其他校验器例如,对usename字段进行非空校验,应配置为:userna
33、me为空!,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格式。visitor:引用指定对象各属性对应的检
34、验规则。conversion:检查字段是否发生类型的错误。stringlength:检查字符串长度是否在指定范围内。regex:检查字段是否匹配指定的正则表达式。根据上述介绍,配置【实例4.4】校验文件RegistAction-validation.xml,代码为。,4.4.3 使用Struts 2校验框架,这样就可以完成同前面类似的校验。运行程序,出现如前图4.7所示的界面,单击“提交”按钮,出现如图4.9所示的界面。输入password及repassword,但让两次输入的密码不同,就会出现如图4.10所示的验证失败界面。,4.4.4 客户端校验,(1)在注册页面的中加入“validate
35、=true”。(2)在项目WebRootWEB-INF下创建content文件夹,然后将项目的所有JSP页面都移到该文件夹下。(3)在struts.xml中增加配置如下:/WEB-INF/content/1.jsp,4.4.4 客户端校验,(4)部署运行程序,在IE地址栏输入“http:/localhost:9080/ValidateTest/index”并回车,不输入任何内容直接单击“提交”按钮,结果会如图4.11所示。输入不一样的password和repassword值,则会出现如图4.12所示的验证失败界面。,4.4.4 客户端校验,Struts 2的客户端校验所支持的校验器有以下几种。int 校验器 double校验器 required校验器 requiredstring校验器 stringlength校验器 regex校验器 email校验器 url校验器,