Struts2类型转换及输入校验.ppt_第1页
Struts2类型转换及输入校验.ppt_第2页
Struts2类型转换及输入校验.ppt_第3页
Struts2类型转换及输入校验.ppt_第4页
Struts2类型转换及输入校验.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:

2、完成String和长整型之间的转换。 float和Float:完成String和单精度浮点型之间的转换。 double和Double:完成String和双精度浮点型之间的转换。 Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。 数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类型。但若程序员自定义类型转换器,则要根据情况判断。 集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素时再进行手动转换。,4.1.2 内置转换器的使用,【实例4.1】建立一个简单的页面

3、,如图4.1所示,让客户端填写用户信息,然后提交,在另一个页面上显示出所填信息。,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

4、;/姓名 private String 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.xw

5、ork2.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 内置转换器的使用,struts.xml配置如下: /show.jsp ,4.1.2 内置转换器的使用,4编写JSP

6、Action类处理完成后跳转到show.jsp页面,代码如下: 类型转换显示界面 姓名: 密码: 年龄: 生日: 电话: ,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

7、”。加载Struts 2包及修改web.xml文件,配置Struts 2,操作同【实例2.1】的第1步、第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 = se

8、ctionNo; public String getTelNo() return telNo; public void setTelNo(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; i

9、mport 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; 在struts.xml文件中配置: /show2.jsp ,4.2.1 继承DefaultTyp

10、eConverter类实现转换器,4实现类型转换器 自定义类型转换器需要实现Struts 2框架提供的TypeConverter接口,但这个接口比较复杂,里面的convertValue方法参数太多,不容易实现,Struts 2框架于是提供了继承该接口的实现类DefaultTypeConverter。该类结构如下: public class ognl.DefaultTypeConverter implements ognl.TypeConverter public DefaultTypeConverter(); public java.lang.Object convertValue( java

11、.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.1 继承DefaultTypeConverter类实

12、现转换器,该类中有两个convertValue方法,其中第2个参数比较多的是TypeConverter类中的方法,所以继承该方法后,只需重写第1个convertValue方法即可。故本例中自定义类型转换器可写为。 该类主要重写了下面这个方法: public Object convertValue(Map context, Object value, Class toType) 该方法中的参数有3个,下面分别进行介绍。 context:该参数就是类型转换的上下文,也就是Action的上下文。 value:value是需要转换的数据,这个数据可以是String类型,或者是需要转换的目标类型。从页面

13、传递的数值有时可能不止一个,例如,有几个输入框的名称相同,那么value就有多个值,不能用单独的String来接收值了,这时就必须用数组。这也就解释了上面为什么把value转换为字符串数组而不是字符串了。 toType:准备转换成的目标类型。,4.2.1 继承DefaultTypeConverter类实现转换器,5注册类型转换器 类型转换器编写完成后,需要注册,否则Struts 2框架不知道用哪个类型转换器对提交的数据进行转换。这里要把提交的字符串类型转换为Action类中的tel属性的Tel类型,故在该Action类所在路径下编写一个配置文件即可。该配置文件名称必须遵守“action类名-c

14、perties”格式,所以本例的配置文件名为:“MyTypeConverterAperties”,并且同Action放在同一位置(这里是org.action包)下。 在MyTypeConverterAperties文件中写入如下注册信息: tel=org.converter.MyTypeConverter 配置文件内容为“变量名=包名.类名”。,4.2.1 继承DefaultTypeConverter类实现转换器,6编写JSP 最后编写显示页面show2.jsp,代码如下: 自定义类型转换

15、 区号: 号码: ,4.2.2 继承StrutsTypeConverter类实现转换器,【实例4.2】的运行流程。 首先,页面传递的数据被Struts 2拦截,根据struts.xml中的配置找到MyTypeConverterAction类,然后在系统环境中寻找是否含有该Action类对应的MyTypeConverterAperties配置文件,如果找到,将其触发,对变量tel进行类型转换。完成后,执行Action类中的execute方法,最后跳转到show2.jsp页面。 可以看出,自定义的类型转换器继承了DefaultTypeConverter类,并

16、重写了其convertValue方法,里面用了一些ifelse语句来判断是从String向对象类型转换,还是从对象向String类型转换(实际上,类型转换也就两个方向:当接收数据时是从String向目标类型转换,而输出时则是向String类型转换),这样难免有点麻烦,Struts 2框架还提供了一个StrutsTypeConverter类,该类继承了DefaultTypeConverter类。,4.2.2 继承StrutsTypeConverter类实现转换器,该类的部分源代码如下: public abstract class StrutsTypeConverter extends Defau

17、ltTypeConverter public Object convertValue(Map context, Object o, Class toClass) if (toClass.equals(String.class) return convertToString(context, o); else if (o instanceof String) return convertFromString(context, (String) o, toClass); else if (o instanceof String) return convertFromString(context,

18、new String(String) o, toClass); else return performFallbackConversion(context, o, toClass); protected Object performFallbackConversion(Map context, Object o, Class toClass) return super.convertValue(context, o, toClass); public abstract Object convertFromString(Map context, String values, Class toCl

19、ass); public abstract String convertToString(Map context, Object o); ,4.2.2 继承StrutsTypeConverter类实现转换器,故可以把【实例4.2】的自定义转换器用继承该类来实现: package org.converter; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; import org.vo.Tel; public class MyStrutsTypeConverter extends StrutsTyp

20、eConverter public 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 arg0, Object arg1) Tel t=(Tel)arg1; return +t.getSectionNo()+-+t.getTelNo()+; 这样就更简单明了地完成了类型转换

21、的工作。当然,也要对该转换器进行注册,需要修改配置文件的内容为: tel=org.converter.MyStrutsTypeConverter,4.3 数组和集合类型的转换,4.3.1 数组类型转换器 【实例4.3】假如现在有这样一个页面,该页面要求用户输入两个电话号码,然后提交后分别显示其区号及号码。页面如图4.5所示。,4.3.1 数组类型转换器,1创建Struts 2项目 建立项目,取项目名为“ArrayTypeConverter”。加载Struts 2包及修改web.xml文件,配置Struts 2,操作同【实例2.1】的第1步、第2步,不再赘述。 2构造模型传值 构造Tel.jav

22、a代码与【实例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 ArrayTypeConverterAction extends ActionSupport privat

23、e 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注册类型转换器 用数组类型时需要配置局部类型转换器,故该例配置文件应为“ArrayTyp

24、eConverterAperties”,内容为: tel=org.converter.ArrayTypeConverter 位置应与ArrayTypeConverterAction.java文件的位置相同。,4.3.1 数组类型转换器,6编写JSP 由于是多个值传递,故显示页面show3.jsp用标签输出: 对数组的类型转换 区号: 号码: ,4.3.1 数组类型转换器,运行后,结果如图4.6所示,已经达到效果。,4.3.2 集合类型转换器,集合类型和数组类型差不多,也需要使用局部类型转换器,可以在【实例4.3】基础上稍做修改转换为集合类型。首先Acti

25、on类修改为: 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(

26、) throws Exception return SUCCESS; 然后是自定义的集合类型转换器。 最后把配置文件内容修改为: tel=org.converter.ListTypeConverter,4.4 Struts 2输入校验,Struts 2应用中的输入校验大致有下面几种方法。 在Action类中的处理方法进行校验,若没有指定方法就用execute()方法。 继承ActionSupport类,并重写其validate()方法实现校验。 应用Struts 2的校验框架进行校验。,4.4 Struts 2输入校验,【实例4.4】开发一个简单的注册功能项目,然后分别用不同的校验方法对用户填

27、写的注册信息进行校验。 创建Struts 2项目,名为ValidateTest,然后加载Struts 2包,配置web.xml文件,操作步骤同【实例2.1】的第1步、第2步,不再赘述。 首先是注册页面index.jsp: 注册页面 ,4.4 Struts 2输入校验,Action类文件RegistAction.java为: package org.action; import com.opensymphony.xwork2.ActionSupport; public class RegistAction extends ActionSupport private String username

28、;/姓名 private String password;/密码 private String repassword;/确认密码 private int age;/年龄 /上述属性的set和get方法 public String execute() throws Exception return SUCCESS; 在struts.xml文件中配置为: /success.jsp ,4.4 Struts 2输入校验,注册成功页面success.jsp为: 成功页面 恭喜您!您已经注册成功 ,4.4.1 使用execute()方法校验,这是最简单的办法,只要在RegistAction类的execut

29、e()方法中添加校验代码即可,如下: public class RegistAction extends ActionSupport public String execute() throws Exception if(username.equals()|username=null) addFieldError(username,username为空); else if(password.equals()| password=null) addFieldError(password,password为空); else if(repassword.equals()|repassword=nul

30、l) addFieldError(repassword,repassword为空); else if(!password.equals(repassword) addFieldError(password,两次输入密码不同); else if(age150) addFieldError(age,age必须在1到150之间); if(hasErrors() return INPUT; return SUCCESS; ,4.4.1 使用execute()方法校验,相应地在struts.xml中也要加入验证失败后的跳转页面: /index.jsp 运行后,输入界面如图4.7所示,不输入任何值直接单击

31、【提交】按钮,会出现如图4.8所示的界面。,4.4.2 重写validate()方法校验,自定义Action类在继承了ActionSupport后可以重写其validate()方法来实现输入校验,当在Action类中定义了该方法后,该方法会在执行系统的execute()方法之前执行。如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处。修改RegistAction.java类为: public class RegistAction extends ActionSupport public String execute() t

32、hrows Exception return SUCCESS; public void validate() 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(!p

33、assword.equals(repassword) addFieldError(password,两次输入密码不同); else if(age150) addFieldError(age,age必须在1到150之间); ,4.4.3 使用Struts 2校验框架,1使用标签 使用该标签可以声明字段型或非字段型两种类型校验器。 字段型校验器配置格式如下: 待校验字段名 校验失败信息 非字段型校验器格式如下: OGNL表达式取值 校验失败信息 ,4.4.3 使用Struts 2校验框架,例如,对username字段进行非空校验,应配置为: username username为空! ./若要声明其他校验器,可以在下面继续配置标签来完成,4.4.3 使用Struts 2校验框架,2使用标签 使用该标签可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论