struts2讲义传智播客王昭珽.docx
- 文档编号:10155770
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:65
- 大小:106.30KB
struts2讲义传智播客王昭珽.docx
《struts2讲义传智播客王昭珽.docx》由会员分享,可在线阅读,更多相关《struts2讲义传智播客王昭珽.docx(65页珍藏版)》请在冰点文库上搜索。
struts2讲义传智播客王昭珽
类型转换
概述
从一个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(Map
参数:
context:
将在其中进行类型转换的OGNL上下文环境。
target:
将在其中对有关属性进行设置的目标对象。
member:
将被设置的类成员的名字。
propertyName:
将被设置的属性的名字。
value:
将被转换的值。
toType:
转换结果的类型。
DefaultTypeConverter
与自行实现TypeConverter接口相比,对该类扩展更容易一些,他是对TypeConverter金额接口的一种默认实现类,且他有简单的方法签名。
publicObjectconvertValue(Map
returnconvertValue(value,toType);
}
publicObjectconvertValue(Map
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.步骤三:
创建验证器。
验证配置文件必须是以下两种形式之一
●
●
HelloAction-validation.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEvalidatorsPUBLIC
"-//OpenSymphonyGroup//XWorkValidator1.0.2//EN"
"
4.步骤四:
请确认你的struts.xml文件中该动作有input的结果。
struts.xml
…
…
假如你没有这样设置,你将会得到“Noresultdefinedforaction***andresultinput”的错误提示。
客户端验证Client-sideValidation
让我们一步一步做一个客户端验证的示例
● form>标签的validate设置为true; ●某些主题(themes)不支持客户端验证; 步骤一: 创建输入表单 create.jsp
head/>
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 … … 输入表单如下: create.jsp
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
head/>
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; } } 验证配置文件: 运行结果: 说明 验证配置文件的另外一种写法: 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; } } 验证配置文件: 运行结果: 说明 验证配置文件的另外一种写法: intvalidator 功能 用来验证某个字段的值是否可以被转换为一个整数。 若指定参数,还验证是否在允许的范围内。 参数 参数名 类型 默认值 描述 fieldName String 要验证的字段名 min Integer 允许的最小值。 若没有给出该参数则无限制 max Integer 允许的最大值。 若没有给出该参数则无限制 示例 页面: formaction="validate"> textfieldname="age"label="年龄"> textfield> submitvalue="登录"> submit> <
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- struts2 讲义 传智播客王昭珽
![提示](https://static.bingdoc.com/images/bang_tan.gif)