struts2讲义王昭珽0621.docx
《struts2讲义王昭珽0621.docx》由会员分享,可在线阅读,更多相关《struts2讲义王昭珽0621.docx(55页珍藏版)》请在冰豆网上搜索。
![struts2讲义王昭珽0621.docx](https://file1.bdocx.com/fileroot1/2023-1/29/5f42aa8b-4111-4dd1-aca5-7b0104eaff3a/5f42aa8b-4111-4dd1-aca5-7b0104eaff3a1.gif)
struts2讲义王昭珽0621
类型转换
概述
从一个HTML表单到一个动作对象,类型转换将是从字符串到非字符串.因为HTTP没有“类型”的概念,所以一切表单输入都将以请求参数的形式被发送到服务器,而每一项表单输入之可能是一个String或一个String数组。
在服务器端,必须先把这些String值转换为特定的数据类型,才能进行相应的处理。
把请求参数映射到动作属性的工作由Parameters拦截器负责,它是defaultStack拦截器栈的一员。
所有的请求参数都是String类型,但并非所有的动作属性都是String类型,所以每一种非String类型的动作属性需要对相关的请求参数进行类型转换。
struts2提供的转换解决方案
Struts2在类型转换失败时会发生错误,具体如何处理取决于你的动作类是否实现了com.opensymphony.xwork2.ValidationAware接口。
1、没有实现该接口:
struts在遇到类型转换错误时仍会继续调用其动作方法,就好像什么问题都没有发生过那样。
2、如果实现了该接口:
struts在遇到类型转换错误时不会继续调用其动作方法,它将检查相关动作元素中是否包含着一个input结果。
如果是,struts将把控制权转交给那个result元素;如果找不到这样的结果,struts将抛出一个异常。
注:
如果你的动作类继承自com.opensymphony.xwork2.ActionSupport,就相当于你间接实现了com.opensymphony.xwork2.ValidationAware接口。
类型转换错误消息的定制
conversionError拦截器负责添加与类型转换有关的出错消息和保存各请求参数的原始值,它是defaultStack中的一员。
使用该拦截器的前提是你实现了com.opensymphony.xwork2.ValidationAware接口。
如果你用来呈现这个字段的标签使用的不是simple主题,有非法值的字段将导致一条有着以下格式的出错消息:
Invalidfieldvalueforfield"fieldName".
我们可以通过以下方式来改变该消息:
1、在动作类所在的包中创建一文件,文件的命名规则是ClassName.properties。
2、在该文件中增加以下内容:
invalid.fieldvalue.fieldName=Yourmessage。
fieldName是你动作类中队应的字段。
示例
自定义类型转换器
TypeConverter接口
struts2内建的类型转换器并不能解决所有的问题,那就需要自己创建类型转换器。
自定义的类型转换器必须实现ognl.TypeConverter接口或对这个接口的某种具体实现做进一步扩展。
TypeConverter接口只有一个名为convertValue的方法,它的方法签名如下:
publicObjectconvertValue(Mapcontext,Objecttarget,Membermember,StringpropertyName,Objectvalue,ClasstoType);
参数:
context:
将在其中进行类型转换的OGNL上下文环境。
target:
将在其中对有关属性进行设置的目标对象。
member:
将被设置的类成员的名字。
propertyName:
将被设置的属性的名字。
value:
将被转换的值。
toType:
转换结果的类型。
DefaultTypeConverter
与自行实现TypeConverter接口相比,对该类扩展更容易一些,他是对TypeConverter金额接口的一种默认实现类,且他有简单的方法签名。
publicObjectconvertValue(Mapcontext,Objectvalue,ClasstoType){
returnconvertValue(value,toType);
}
publicObjectconvertValue(Mapcontext,Objecttarget,Membermember,
StringpropertyName,Objectvalue,ClasstoType){
returnconvertValue(context,value,toType);
}
自定义类型转换器的配置
在使用一个自定义的类型转换器之前,必须先对它进行配置。
这种配置可以基于字段,也可以基于类。
基于字段:
在动作类所在的包中创建ActionClass-conversion.properties的文件,其中的内容可能为下所示:
fieldname=customConverter1
基于类:
在WEB-INF/classes子目录下创建一个conversion.properties文件,其中的内容可能为下所示:
fullQualifieldClassName=customerConverter1
与复杂对象的配合使用
与Collection配合使用
与Map配合使用
验证
Strut2验证可以通过一个XML配置文件和注解的方式来实现,当然手工验证(编码验证)也是支持的。
同时也可以通过XML和注解共同使用的方式实现联合验证。
Struts2的验证是通过validation和workflow拦截器实现的,它们都属于defaultinterceptorstack。
validation拦截器用于验证并组织错误消息。
workflow拦截器用于检测是否包含错误消息,假如有,它将返回结果为input所指向的页面,并将错误消息和原先输入的数据一同呈现给客户。
如果您的程序中使用了默认的验证(或者转换器)而没有提供为input的结果,则将出现错误。
注解验证
注解验证从struts2.1版本开始就不建议使用了。
示例
基础验证BasicValidation
让我们一步一步做一个基础验证的示例
1.步骤一:
创建输入表单
create.jsp
formaction="helloValidation">
textfieldname="name"label="姓名">
textfield>
textfieldname="age"label="年龄">
textfield>
textfieldname="address"label="籍贯">
textfield>
submitvalue="提交">
submit>
form>
2.步骤二:
创建动作类
HelloAction.java
packagecn.wzhting;
importcom.opensymphony.xwork2.ActionSupport;
publicclassHelloActionextendsActionSupport{
privatestaticfinallongserialVersionUID=117358005790515177L;
privateStringname;
privateIntegerage;
privateStringaddress;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicIntegergetAge(){
returnage;
}
publicvoidsetAge(Integerage){
this.age=age;
}
publicStringgetAddress(){
returnaddress;
}
publicvoidsetAddress(Stringaddress){
this.address=address;
}
}
3.步骤三:
创建验证器。
验证配置文件必须是以下两种形式之一
●-validation.xml
●--validation.xml
HelloAction-validation.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEvalidatorsPUBLIC
"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"
请输入姓名
13
19
年龄为13~19周岁的才允许填写
4.步骤四:
请确认你的struts.xml文件中该动作有input的结果。
struts.xml
…
/createConfirm.jsp
/error.jsp
/create.jsp
…
假如你没有这样设置,你将会得到“Noresultdefinedforaction***andresultinput”的错误提示。
客户端验证Client-sideValidation
让我们一步一步做一个客户端验证的示例
●form>标签的validate设置为true;
●某些主题(themes)不支持客户端验证;
步骤一:
创建输入表单
create.jsp
Validation-Basichead/>
formaction="helloValidation.action"validate="true">
textfieldname="name"label="姓名">
textfield>
textfieldname="age"label="年龄">
textfield>
textfieldname="address"label="籍贯">
textfield>
submitvalue="提交">
submit>
form>
注意:
●虽然使用了head/>标签,此处我们只是利用其默认样式。
●虽然struts2中的动作带不带action后缀效果一样,但是在此处最好加上action后缀,不然会报错。
步骤二、三、四通《基础验证BasicValidation》一节,此处省略。
动作和命名空间(Actionandnamespace)
如果表单提交到的动作不在默认命名空间里,在使用form>时必须指定其namespace属性。
例如,helloValidation在命名空间/ns内,可能的struts.xml如下:
struts.xml
…
/createConfirm.jsp
/error.jsp
/create.jsp
…
输入表单如下:
create.jsp
Validation-Basic
head/>
formaction="helloValidation.action"validate="true"namespace="/ns">
textfieldname="name"label="姓名">
textfield>
textfieldname="age"label="年龄">
textfield>
textfieldname="address"label="籍贯">
textfield>
submitvalue="提交">
submit>
form>
看上去应该能正常运行,客户端验证将不能。
struts必须准确的知道动作所在的命名空间(不是通过URL),因此正确的写法如下:
create.jsp
Validation-Basichead/>
formaction="/ns/helloValidation.action"validate="true">
textfieldname="name"label="姓名">
textfield>
textfieldname="age"label="年龄">
textfield>
textfieldname="address"label="籍贯">
textfield>
submitvalue="提交">
submit>
form>
内建验证器
struts2为我们共内置了16个验证器,且全部是基于字段的验证器。
requiredvalidator
功能
用来验证某个给定的字段的值不是null。
注意,空字符串不是null。
参数
参数名
类型
默认值
必须的
描述
fieldName
String
no
要验证的字段名
(用法见后面的说明)
示例
页面:
fielderror/>
formaction="validate">
textfieldname="userName"label="用户名">
textfield>
submitvalue="登录">
submit>
form>
动作类:
importcom.opensymphony.xwork2.ActionSupport;
publicclassValidationActionextendsActionSupport{
privatestaticfinallongserialVersionUID=6877330242746547448L;
privateStringuserName;
privateStringpassword;
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
验证配置文件:
Thepasswordfieldisrequired!
运行结果:
说明
验证配置文件的另外一种写法:
password
Thepasswordfieldisrequired!
requiredstringvalidator
功能
验证给定的字段的值既不是null、也不是空白。
参数
参数名
类型
默认值
必须的
描述
fieldName
String
no
要验证的字段名
trim
Boolean
true
no
验证前是否要去掉前导和尾缀的空白字符
示例
页面:
formaction="validate">
textfieldname="userName"label="用户名"required="true"requiredposition="left">
textfield>
passwordname="password"label="密码"required="true"requiredposition="left">
password>
submitvalue="登录">
submit>
form>
动作类:
importcom.opensymphony.xwork2.ActionSupport;
publicclassValidationActionextendsActionSupport{
privatestaticfinallongserialVersionUID=6877330242746547448L;
privateStringuserName;
privateStringpassword;
publicStringgetUserName(){
returnuserName;
}
publicvoidsetUserName(StringuserName){
this.userName=userName;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
验证配置文件:
PleaseinputtheuserName!
false
Pleaseinputthepassword!
运行结果:
说明
验证配置文件的另外一种写法:
userName
PleaseinputtheuserName!
password
false
Pleaseinputthepassword!
intvalidator
功能
用来验证某个字段的值是否可以被转换为一个整数。
若指定参数,还验证是否在允许的范围内。
参数
参数名
类型
默认值
描述
fieldName
String
要验证的字段名
min
Integer
允许的最小值。
若没有给出该参数则无限制
max
Integer
允许的最大值。
若没有给出该参数则无限制
示例
页面:
formaction="validate">
textfieldname="age"label="年龄">
textfield>
submitvalue="登录">
submit>
<