第4章 Struts 2类型转换及输入校验_第1页
第4章 Struts 2类型转换及输入校验_第2页
第4章 Struts 2类型转换及输入校验_第3页
第4章 Struts 2类型转换及输入校验_第4页
第4章 Struts 2类型转换及输入校验_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第4章Struts2类型转换及输入校验4.1Struts2内置类型转换器4.2自定义类型转换器4.3数组和集合类型的转换4.4Struts2输入校验4.1Struts2内置类型转换器4.1.1常用类型转换器对于大部分常用类型,程序员不用创建自己的类型转换器,因为Struts2可以完成大多数需要用到的默认功能,这些常用的类型转换器包括如下几种。

boolean和Boolean:完成String和布尔型之间的转换。

char和Character:完成String和字符型之间的转换。

int和Integer:完成String和整型之间的转换。

long和Long:完成String和长整型之间的转换。

float和Float:完成String和单精度浮点型之间的转换。

double和Double:完成String和双精度浮点型之间的转换。

Date:完成String和日期类型之间的转换,日期格式为用户请求本地的SHORT格式。

数组:该类型在数据转换时,必须满足需要转换的数据中每一个元素都能转换成数组的类型。但若程序员自定义类型转换器,则要根据情况判断。

集合:在使用集合类型转换器时,如果集合中的数据无法确定,可以先将其封装到一个String类型的集合中,然后在用到某个元素时再进行手动转换。4.1.2内置转换器的使用【实例4.1】建立一个简单的页面,如图4.1所示,让客户端填写用户信息,然后提交,在另一个页面上显示出所填信息。4.1.2内置转换器的使用1.创建Struts2项目建立项目,取项目名为“Struts2TypeConverter”。加载Struts2包及修改web.xml文件,配置Struts2,操作同【实例2.1】的第1步、第2步,不再赘述。2.构造模型传值本例中应用了模型传值方式,故需要构造一个JavaBean(模型类)User.java。代码如下:packageorg.vo;importjava.util.Date;publicclassUser{ privateStringusername; //姓名 privateStringpassword; //密码 privateintage; //年龄 privateDatebir; //生日 privateStringtel; //电话 //这里省略上述属性的get和set方法}4.1.2内置转换器的使用故converter.jsp页面代码可以写为:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html> <head> <title>类型转换</title> </head> <body> <s:formaction="typeconverter"method="post"> <s:textfieldname="user.username"label="姓名"></s:textfield> <s:passwordname="user.password"label="密码"></s:password> <s:textfieldname="user.age"label="年龄"></s:textfield> <s:textfieldname="user.bir"label="生日"></s:textfield> <s:textfieldname="user.tel"label="电话"></s:textfield> <s:submitvalue="提交"></s:submit> </s:form> </body></html>4.1.2内置转换器的使用3.编写控制器Action自定义Action类“SimpleTypeConverter.java”的代码如下:packageorg.action;importorg.vo.User;importcom.opensymphony.xwork2.ActionSupport;publicclassSimpleTypeConverterextendsActionSupport{

privateUseruser; publicUsergetUser(){ returnuser; } publicvoidsetUser(Useruser){ this.user=user; } publicStringexecute()throwsException{ returnSUCCESS; }}4.1.2内置转换器的使用struts.xml配置如下:…<struts> <packagename="default"extends="struts-default">

<actionname="typeconverter"class="org.action.SimpleTypeConverter"> <resultname="success">/show.jsp</result> </action> </package></struts>4.1.2内置转换器的使用4.编写JSPAction类处理完成后跳转到show.jsp页面,代码如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head><title>类型转换显示界面</title></head><body>

姓名:<s:propertyvalue="user.username"/><br>

密码:<s:propertyvalue="user.password"/><br>

年龄:<s:propertyvalue="user.age"/><br>

生日:<s:propertyvalue="user.bir"/><br>

电话:<s:propertyvalue="user.tel"/><br></body></html>4.1.2内置转换器的使用运行该程序,提交后出现如图4.2所示的界面。4.2自定义类型转换器4.2.1继承DefaultTypeConverter类实现转换器下面以一个简单实例说明。【实例4.2】在图4.3中的输入栏输入一个正确完整的电话后,单击【提交】按钮,出现如图4.4所示的界面,分别输出区号和电话号。

4.2.1继承DefaultTypeConverter类实现转换器1.创建Struts2项目建立项目,取项目名为“MyTypeConverter”。加载Struts2包及修改web.xml文件,配置Struts2,操作同【实例2.1】的第1步、第2步,不再赘述。2.构造模型传值本例依然采用模型传值,构造模型Tel类,Tel.java实现为:packageorg.vo;publicclassTel{ privateStringsectionNo; //区号 privateStringtelNo; //电话号 publicStringgetSectionNo(){ returnsectionNo; } publicvoidsetSectionNo(StringsectionNo){ this.sectionNo=sectionNo; } publicStringgetTelNo(){ returntelNo; } publicvoidsetTelNo(StringtelNo){ this.telNo=telNo; }}4.2.1继承DefaultTypeConverter类实现转换器对应converter2.jsp页面的代码写为:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head> <title>自定义类型转换器</title></head><body> <s:formaction="typeconverter2"method="post">

<s:textfieldname="tel"label="请输入电话"></s:textfield> <s:submitvalue="提交"></s:submit> </s:form></body></html>4.2.1继承DefaultTypeConverter类实现转换器3.编写控制器Action编写Action类“MyTypeConverterAction”的代码为:packageorg.action;importorg.vo.Tel;importcom.opensymphony.xwork2.ActionSupport;publicclassMyTypeConverterActionextendsActionSupport{ privateTeltel; publicStringexecute()throwsException{ returnSUCCESS; } publicTelgetTel(){ returntel; } publicvoidsetTel(Teltel){ this.tel=tel; }}在struts.xml文件中配置:<actionname="typeconverter2"class="org.action.MyTypeConverterAction"><resultname="success">/show2.jsp</result></action>4.2.1继承DefaultTypeConverter类实现转换器4.实现类型转换器自定义类型转换器需要实现Struts2框架提供的TypeConverter接口,但这个接口比较复杂,里面的convertValue方法参数太多,不容易实现,Struts2框架于是提供了继承该接口的实现类DefaultTypeConverter。该类结构如下:publicclassognl.DefaultTypeConverterimplementsognl.TypeConverter{ publicDefaultTypeConverter();

publicjava.lang.ObjectconvertValue( java.util.Mapcontext, java.lang.Objectvalue, java.lang.ClasstoType ); publicjava.lang.ObjectconvertValue( java.util.Mapcontext, java.lang.Objecttarget, java.lang.reflect.Membermember, java.lang.StringprepertyName, java.lang.Objectvalue, java.lang.ClasstoType );}4.2.1继承DefaultTypeConverter类实现转换器该类中有两个convertValue方法,其中第2个参数比较多的是TypeConverter类中的方法,所以继承该方法后,只需重写第1个convertValue方法即可。故本例中自定义类型转换器可写为。该类主要重写了下面这个方法:publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType){}该方法中的参数有3个,下面分别进行介绍。

context:该参数就是类型转换的上下文,也就是Action的上下文。

value:value是需要转换的数据,这个数据可以是String类型,或者是需要转换的目标类型。从页面传递的数值有时可能不止一个,例如,有几个输入框的名称相同,那么value就有多个值,不能用单独的String来接收值了,这时就必须用数组。这也就解释了上面为什么把value转换为字符串数组而不是字符串了。

toType:准备转换成的目标类型。4.2.1继承DefaultTypeConverter类实现转换器5.注册类型转换器类型转换器编写完成后,需要注册,否则Struts2框架不知道用哪个类型转换器对提交的数据进行转换。这里要把提交的字符串类型转换为Action类中的tel属性的Tel类型,故在该Action类所在路径下编写一个配置文件即可。该配置文件名称必须遵守“action类名-perties”格式,所以本例的配置文件名为:“MyTypeConverterAperties”,并且同Action放在同一位置(这里是org.action包)下。在MyTypeConverterAperties文件中写入如下注册信息:tel=org.converter.MyTypeConverter配置文件内容为“变量名=包名.类名”。4.2.1继承DefaultTypeConverter类实现转换器6.编写JSP最后编写显示页面show2.jsp,代码如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head><title>自定义类型转换</title></head><body> <s:propertyvalue="tel"/><br>

区号:<s:propertyvalue="tel.sectionNo"/><br>

号码:<s:propertyvalue="tel.telNo"/></body></html>4.2.2继承StrutsTypeConverter类实现转换器【实例4.2】的运行流程。首先,页面传递的数据被Struts2拦截,根据struts.xml中的配置找到MyTypeConverterAction类,然后在系统环境中寻找是否含有该Action类对应的MyTypeConverterAperties配置文件,如果找到,将其触发,对变量tel进行类型转换。完成后,执行Action类中的execute方法,最后跳转到show2.jsp页面。可以看出,自定义的类型转换器继承了DefaultTypeConverter类,并重写了其convertValue方法,里面用了一些if…else语句来判断是从String向对象类型转换,还是从对象向String类型转换(实际上,类型转换也就两个方向:当接收数据时是从String向目标类型转换,而输出时则是向String类型转换),这样难免有点麻烦,Struts2框架还提供了一个StrutsTypeConverter类,该类继承了DefaultTypeConverter类。4.2.2继承StrutsTypeConverter类实现转换器该类的部分源代码如下:publicabstractclassStrutsTypeConverterextendsDefaultTypeConverter{ publicObjectconvertValue(Mapcontext,Objecto,ClasstoClass){ if(toClass.equals(String.class)){ returnconvertToString(context,o); }elseif(oinstanceofString[]){ returnconvertFromString(context,(String[])o,toClass); }elseif(oinstanceofString){ returnconvertFromString(context,newString[]{(String)o},toClass); }else{ returnperformFallbackConversion(context,o,toClass);}} protectedObjectperformFallbackConversion(Mapcontext,Objecto,ClasstoClass){ returnsuper.convertValue(context,o,toClass); } publicabstractObjectconvertFromString(Mapcontext,String[]values,ClasstoClass); publicabstractStringconvertToString(Mapcontext,Objecto);}4.2.2继承StrutsTypeConverter类实现转换器故可以把【实例4.2】的自定义转换器用继承该类来实现:packageorg.converter;importjava.util.Map;importorg.apache.struts2.util.StrutsTypeConverter;importorg.vo.Tel;publicclassMyStrutsTypeConverterextendsStrutsTypeConverter{

publicObjectconvertFromString(Maparg0,String[]arg1,Classarg2){ Telt=newTel(); String[]str=arg1[0].split("-"); t.setSectionNo(str[0]); t.setTelNo(str[1]); returnt; }

publicStringconvertToString(Maparg0,Objectarg1){ Telt=(Tel)arg1; return"["+t.getSectionNo()+"-"+t.getTelNo()+"]"; }}这样就更简单明了地完成了类型转换的工作。当然,也要对该转换器进行注册,需要修改配置文件的内容为:tel=org.converter.MyStrutsTypeConverter4.3数组和集合类型的转换4.3.1数组类型转换器【实例4.3】假如现在有这样一个页面,该页面要求用户输入两个电话号码,然后提交后分别显示其区号及号码。页面如图4.5所示。4.3.1数组类型转换器1.创建Struts2项目建立项目,取项目名为“ArrayTypeConverter”。加载Struts2包及修改web.xml文件,配置Struts2,操作同【实例2.1】的第1步、第2步,不再赘述。2.构造模型传值构造Tel.java代码与【实例4.2】相同,这里不再列举。对应converter3.jsp页面的代码如下:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head> <title>对数组的类型转换</title></head><body> <s:formaction="typeconverter3"method="post"> <s:textfieldname="tel"label="家庭电话"></s:textfield> <s:textfieldname="tel"label="公司电话"></s:textfield> <s:submitvalue="提交"></s:submit> </s:form></body></html>4.3.1数组类型转换器3.编写控制器Action编写Action类“ArrayTypeConverterAction”的代码如下:packageorg.action;importjava.util.List;importorg.vo.Tel;importcom.opensymphony.xwork2.ActionSupport;publicclassArrayTypeConverterActionextendsActionSupport{ privateTel[]tel; //数组类型传值 publicTel[]getTel(){ returntel; } publicvoidsetTel(Tel[]tel){ this.tel=tel; }

publicStringexecute()throwsException{ returnSUCCESS; }}4.3.1数组类型转换器在struts.xml文件中配置:<actionname="typeconverter3"class="org.action.ArrayTypeConverterAction"><resultname="success">/show3.jsp</result></action>4.3.1数组类型转换器4.实现类型转换器数组类型转换器ArrayTypeConverter.java实现为。5.注册类型转换器用数组类型时需要配置局部类型转换器,故该例配置文件应为“ArrayTypeConverterAperties”,内容为:tel=org.converter.ArrayTypeConverter位置应与ArrayTypeConverterAction.java文件的位置相同。4.3.1数组类型转换器6.编写JSP由于是多个值传递,故显示页面show3.jsp用<s:iterator>标签输出:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html><head><title>对数组的类型转换</title></head><body><s:propertyvalue="tel"/><br> <s:iteratorvalue="tel"id="t">

区号:<s:propertyvalue="#t.sectionNo"/>

号码:<s:propertyvalue="#t.telNo"/><br> </s:iterator></body></html>4.3.1数组类型转换器运行后,结果如图4.6所示,已经达到效果。4.3.2集合类型转换器集合类型和数组类型差不多,也需要使用局部类型转换器,可以在【实例4.3】基础上稍做修改转换为集合类型。首先Action类修改为:packageorg.action;importjava.util.List;importorg.vo.Tel;importcom.opensymphony.xwork2.ActionSupport;publicclassArrayTypeConverterActionextendsActionSupport{ privateList<Tel>tel;//应用泛型 publicList<Tel>getTel(){ returntel; } publicvoidsetTel(List<Tel>tel){ this.tel=tel; } publicStringexecute()throwsException{ returnSUCCESS; }}然后是自定义的集合类型转换器。最后把配置文件内容修改为:tel=org.converter.ListTypeConverter4.4Struts2输入校验Struts2应用中的输入校验大致有下面几种方法。

在Action类中的处理方法进行校验,若没有指定方法就用execute()方法。

继承ActionSupport类,并重写其validate()方法实现校验。

应用Struts2的校验框架进行校验。4.4Struts2输入校验【实例4.4】开发一个简单的注册功能项目,然后分别用不同的校验方法对用户填写的注册信息进行校验。创建Struts2项目,名为ValidateTest,然后加载Struts2包,配置web.xml文件,操作步骤同【实例2.1】的第1步、第2步,不再赘述。首先是注册页面index.jsp:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html> <head> <title>注册页面</title> </head> <body> <s:formaction="regist"method="post"> <s:textfieldname="username"label="姓名"></s:textfield> <s:passwordname="password"label="密码"></s:password> <s:passwordname="repassword"label="确认密码"></s:password> <s:textfieldname="age"label="年龄"></s:textfield> <s:submitvalue="提交"></s:submit> </s:form> </body></html>4.4Struts2输入校验Action类文件RegistAction.java为:packageorg.action;importcom.opensymphony.xwork2.ActionSupport;publicclassRegistActionextendsActionSupport{ privateStringusername; //姓名 privateStringpassword; //密码 privateStringrepassword; //确认密码 privateintage; //年龄 //上述属性的set和get方法 publicStringexecute()throwsException{ returnSUCCESS; }}在struts.xml文件中配置为:<actionname="regist"class="org.action.RegistAction"><resultname="success">/success.jsp</result></action>4.4Struts2输入校验注册成功页面success.jsp为:<%@pagelanguage="java"pageEncoding="UTF-8"%><%@tagliburi="/struts-tags"prefix="s"%><html> <head> <title>成功页面</title> </head> <body>

恭喜您<s:propertyvalue="username"/>!您已经注册成功 </body></html>4.4.1使用execute()方法校验这是最简单的办法,只要在RegistAction类的execute()方法中添加校验代码即可,如下:…publicclassRegistActionextendsActionSupport{ … publicStringexecute()throwsException{ if(username.equals("")||username==null){ addFieldError("username","username为空"); }elseif(password.equals("")||password==null){ addFieldError("password","password为空"); }elseif(repassword.equals("")||repassword==null){ addFieldError("repassword","repassword为空"); }elseif(!password.equals(repassword)){ addFieldError("password","两次输入密码不同"); }elseif(age<1||age>150){ addFieldError("age","age必须在1到150之间"); } if(hasErrors()){ returnINPUT; } returnSUCCESS; }}4.4.1使用execute()方法校验相应地在struts.xml中也要加入验证失败后的跳转页面:<resultname="input">/index.jsp</result>运行后,输入界面如图4.7所示,不输入任何值直接单击【提交】按钮,会出现如图4.8所示的界面。

4.4.2重写validate()方法校验自定义Action类在继承了ActionSupport后可以重写其validate()方法来实现输入校验,当在Action类中定义了该方法后,该方法会在执行系统的execute()方法之前执行。如果执行该方法之后,Action类的fieldErrors中已经包含了数据校验错误信息,将把请求转发到input逻辑视图处。修改RegistAction.java类为:…publicclassRegistActionextendsActionSupport{ … publicStringexecute()throwsException{ returnSUCCESS; } publicvoidvalidate(){ if(username.equals("")||username==null){ addFieldError("username","username为空"); }elseif(password.equals("")||password==null){ addFieldError("password","password为空"); }elseif(repassword.equals("")||repassword==null){ addFieldError("repassword","repassword为空"); }elseif(!password.equals(repassword)){ addFieldError("password","两次输入密码不同"); }elseif(age<1||age>150){ addFieldError("age","age必须在1到150之间"); } }}4.4.3使用Struts2校验框架1.使用<validate></validate>标签使用该标签可以声明字段型或非字段型两种类型校验器。字段型校验器配置格式如下:<validatortype="校验器名称"> <paramname="fieldName">待校验字段名</param> <message>校验失败信息</message></validator>非字段型校验器格式如下:<validatortype="校验器名称"> <paramname="expression">OGNL表达式取值</param> <message>校验失败信息</message></validator>4.4.3使用Struts2校验框架例如,对username字段进行非空校验,应配置为:<validatortype="required"> <paramname="fieldName">username</param> <message>username为空!</message></validator>...//若要声明其他校验器,可以在下面继续配置<validate>标签来完成4.4.3使用Struts2校验框架2.使用<field></fie

温馨提示

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

评论

0/150

提交评论