1、struts2讲义王昭珽0621类型转换概述从一个HTML表单到一个动作对象,类型转换将是从字符串到非字符串.因为HTTP没有“类型”的概念,所以一切表单输入都将以请求参数的形式被发送到服务器,而每一项表单输入之可能是一个String或一个String数组。在服务器端,必须先把这些String值转换为特定的数据类型,才能进行相应的处理。把请求参数映射到动作属性的工作由Parameters拦截器负责,它是defaultStack拦截器栈的一员。所有的请求参数都是String类型,但并非所有的动作属性都是String类型,所以每一种非String类型的动作属性需要对相关的请求参数进行类型转换。st
2、ruts2提供的转换解决方案Struts2在类型转换失败时会发生错误,具体如何处理取决于你的动作类是否实现了com.opensymphony.xwork2.ValidationAware接口。1、 没有实现该接口:struts在遇到类型转换错误时仍会继续调用其动作方法,就好像什么问题都没有发生过那样。2、 如果实现了该接口:struts在遇到类型转换错误时不会继续调用其动作方法,它将检查相关动作元素中是否包含着一个input结果。如果是,struts将把控制权转交给那个result元素;如果找不到这样的结果,struts将抛出一个异常。注:如果你的动作类继承自com.opensymphony.
3、xwork2.ActionSupport,就相当于你间接实现了com.opensymphony.xwork2.ValidationAware接口。类型转换错误消息的定制conversionError拦截器负责添加与类型转换有关的出错消息和保存各请求参数的原始值,它是defaultStack中的一员。使用该拦截器的前提是你实现了com.opensymphony.xwork2.ValidationAware接口。如果你用来呈现这个字段的标签使用的不是simple主题,有非法值的字段将导致一条有着以下格式的出错消息:Invalid field value for field fieldName.我们
4、可以通过以下方式来改变该消息:1、 在动作类所在的包中创建一文件,文件的命名规则是ClassName.properties。2、 在该文件中增加以下内容:invalid.fieldvalue.fieldName=Your message。fieldName是你动作类中队应的字段。示例自定义类型转换器TypeConverter接口struts2内建的类型转换器并不能解决所有的问题,那就需要自己创建类型转换器。自定义的类型转换器必须实现ognl.TypeConverter接口或对这个接口的某种具体实现做进一步扩展。TypeConverter接口只有一个名为convertValue的方法,它的方法签
5、名如下:public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);参数:context:将在其中进行类型转换的OGNL上下文环境。target:将在其中对有关属性进行设置的目标对象。member:将被设置的类成员的名字。propertyName:将被设置的属性的名字。value:将被转换的值。toType:转换结果的类型。DefaultTypeConverter与自行实现TypeConverter接口相比,对该类扩展
6、更容易一些,他是对TypeConverter金额接口的一种默认实现类,且他有简单的方法签名。public Object convertValue(Map context, Object value, Class toType) return convertValue(value, toType); public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType) return convertValue(context, va
7、lue, toType);自定义类型转换器的配置在使用一个自定义的类型转换器之前,必须先对它进行配置。这种配置可以基于字段,也可以基于类。基于字段:在动作类所在的包中创建ActionClass-conversion.properties的文件,其中的内容可能为下所示:fieldname=customConverter1基于类:在WEB-INF/classes子目录下创建一个conversion.properties文件,其中的内容可能为下所示:fullQualifieldClassName=customerConverter1与复杂对象的配合使用与Collection配合使用与Map配合使用验
8、证Strut2验证可以通过一个XML配置文件和注解的方式来实现,当然手工验证(编码验证)也是支持的。同时也可以通过XML和注解共同使用的方式实现联合验证。Struts2的验证是通过validation和workflow拦截器实现的,它们都属于default interceptor stack。validation拦截器用于验证并组织错误消息。workflow拦截器用于检测是否包含错误消息,假如有,它将返回结果为input所指向的页面,并将错误消息和原先输入的数据一同呈现给客户。如果您的程序中使用了默认的验证(或者转换器)而没有提供为input的结果,则将出现错误。注解验证注解验证从struts
9、2.1版本开始就不建议使用了。示例基础验证Basic Validation让我们一步一步做一个基础验证的示例1. 步骤一:创建输入表单create.jsp 2. 步骤二:创建动作类HelloAction.javapackage cn.wzhting;import com.opensymphony.xwork2.ActionSupport;public class HelloAction extends ActionSupport private static final long serialVersionUID = 117358005790515177L; private String na
10、me; private Integer age; private String address; public String getName() return name; public void setName(String name) this.name = name; public Integer getAge() return age; public void setAge(Integer age) this.age = age; public String getAddress() return address; public void setAddress(String addres
11、s) this.address = address; 3. 步骤三:创建验证器。验证配置文件必须是以下两种形式之一 -validation.xml -validation.xmlHelloAction-validation.xml!DOCTYPE validators PUBLIC -/OpenSymphony Group/XWork Validator 1.0.2/EN 请输入姓名 13 19 年龄为1319周岁的才允许填写 4. 步骤四:请确认你的struts.xml文件中该动作有input的结果。struts.xml /createConfirm.jsp /error.jsp /crea
12、te.jsp假如你没有这样设置,你将会得到“No result defined for action * and result input”的错误提示。客户端验证Client-side Validation让我们一步一步做一个客户端验证的示例 标签的validate设置为true; 某些主题(themes)不支持客户端验证;步骤一:创建输入表单create.jsp Validation - Basic 注意: 虽然使用了标签,此处我们只是利用其默认样式。 虽然struts2中的动作带不带action后缀效果一样,但是在此处最好加上action后缀,不然会报错。步骤二、三、四通基础验证 Basi
13、c Validation一节,此处省略。动作和命名空间(Action and namespace)如果表单提交到的动作不在默认命名空间里,在使用时必须指定其namespace属性。例如,helloValidation在命名空间/ns内,可能的struts.xml如下:struts.xml /createConfirm.jsp /error.jsp /create.jsp输入表单如下:create.jsp Validation - Basic 看上去应该能正常运行,客户端验证将不能。struts必须准确的知道动作所在的命名空间(不是通过URL),因此正确的写法如下:create.jsp Vali
14、dation - Basic 内建验证器struts2为我们共内置了16个验证器,且全部是基于字段的验证器。required validator功能用来验证某个给定的字段的值不是null。注意,空字符串不是null。参数参数名类型默认值必须的描述fieldNameStringno要验证的字段名(用法见后面的说明)示例页面: 动作类:import com.opensymphony.xwork2.ActionSupport;public class ValidationAction extends ActionSupport private static final long serialVers
15、ionUID = 6877330242746547448L; private String userName; private String password; public String getUserName() return userName; public void setUserName(String userName) this.userName = userName; public String getPassword() return password; public void setPassword(String password) this.password = passw
16、ord; 验证配置文件: The password field is required! 运行结果:说明验证配置文件的另外一种写法: password The password field is required! requiredstring validator功能验证给定的字段的值既不是null、也不是空白。参数参数名类型默认值必须的描述fieldNameStringno要验证的字段名trimBooleantrueno验证前是否要去掉前导和尾缀的空白字符示例页面: 动作类:import com.opensymphony.xwork2.ActionSupport;public class V
17、alidationAction extends ActionSupport private static final long serialVersionUID = 6877330242746547448L; private String userName; private String password; public String getUserName() return userName; public void setUserName(String userName) this.userName = userName; public String getPassword() retur
18、n password; public void setPassword(String password) this.password = password; 验证配置文件: Please input the userName! false Please input the password! 运行结果:说明验证配置文件的另外一种写法: userName Please input the userName! password false Please input the password! int validator功能用来验证某个字段的值是否可以被转换为一个整数。若指定参数,还验证是否在允许的范围内。参数参数名类型默认值描述fieldNameString要验证的字段名minInteger允许的最小值。若没有给出该参数则无限制maxInteger允许的最大值。若没有给出该参数则无限制示例页面:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1