您的位置:首页 > 编程语言 > Java开发

Struts2-类型转换

2015-10-18 21:59 495 查看
概述:
从一个 HTML 表单到一个 Action 对象, 类型转换是从字符串到非字符串. 
HTTP 没有 “类型” 的概念. 每一项表单输入只可能是一个字符串或一个字符串数组. 在服务器端, 必须把 String 转换为特定的数据类型
在 struts2 中, 把请求参数映射到 action  属性的工作由 Parameters 拦截器负责, 它是默认的 defaultStack 拦截器中的一员. 
Parameters 拦截器可以自动完成字符串和基本数据类型之间转换. 

问题描述:
如果类型转换失败:
若 Action 类没有实现 ValidationAware 接口: Struts 在遇到类型转换错误时仍会继续调用其 Action 方法, 就好像什么都没发生一样.
若 Action 类实现 ValidationAware 接口:Struts 在遇到类型转换错误时将不会继续调用其 Action 方法:  Struts 将检查相关 action 
元素的声明是否包含着一个 name=input 的 result.  如果有, Struts 将把控制权转交给那个 result  元素; 若没有 input 结果, 
Struts 将抛出一个异常

解决问题:
Action 类必须实现了 ValidationAware 接口,或继承该类ActionSupport,因为该类实现了该接口;
然后发现,当我们输入错误类型的数据页面会提示错误;
那么问题来了:
问题1: 如何覆盖默认的错误消息?
1). 在对应的 Action 类所在的包中新建  
   ActionClassName.properties 文件, ActionClassName 即为包含着输入字段的 Action 类的类名
2). 在属性文件中添加如下键值对: invalid.fieldvalue.fieldName=xxx
案例:
在ConversionAction.properties文件设置,
invalid.fieldvalue.age=\u9519\u8BEF\u7684\u5E74\u9F84\u683C\u5F0F
问题2:上边的描述是我们在默认的主题下进行的,Xhtml,那么问题来了,在Simple主题下是什么情况
发现不会显示错误信息,然后debug发现:
fieldErrors {age=[错误的年龄格式]} 
因此可以在页面这样获取:
${fieldErrors.age[0]}
还可以使用 s:fielderror 标签来显示. 可以通过 fieldName 属性显示指定字段的错误.
<s:textfield name="age" label="Age"></s:textfield>
但是使用后发现页面很不整齐;
因为出现了很多,<span>和<ui>
那么问题来了:
问题3:如何去除 ul, li, span 呢 ?
在 template.simple 下面的 fielderror.ftl 定义了 simple 主题下, s:fielderror 标签显示错误消息的样式. 所以修改该
配置文件即可. 在 src 下新建  template.simple 包, 新建 fielderror.ftl 文件, 把原生的 fielderror.ftl 中的内容
复制到新建的 fielderror.ftl 中, 然后剔除 ul, li, span 部分即可. 

Struts 不能自动完成 字符串 到 引用类型 的 转换.
那么问题还有一个,怎样自定义类型转换器 来进行字符串到引用类型的转化呢?
如何定义类型转换器:
I.  开发类型转换器的类: 扩展 StrutsTypeConverter 类.
II. 配置类型转换器: 
有两种方式
①. 基于字段的配置: 
> 在字段所在的 Model(可能是 Action, 可能是一个 JavaBean) 的包下, 新建一个 ModelClassName-conversion.properties 文件
> 在该文件中输入键值对: fieldName=类型转换器的全类名. 
> 第一次使用该转换器时创建实例. 
> 类型转换器是单实例的!

②. 基于类型的配置:
> 在 src 下新建 xwork-conversion.properties
> 键入: 待转换的类型=类型转换器的全类名.
> 在当前 Struts2 应用被加载时创建实例.

问题延伸:类型转换与复杂属性配合使用
form 标签的 name 属性可以被映射到一个属性的属性. 
例如:
<s:form action="/app03/testComplexProperty">

  <s:textfield name="deptName" label="DeptName"></s:textfield>

  <s:textfield name="mgr.name" label="MgrName"></s:textfield>

  <s:textfield name="mgr.birth" label="MgrBirth"></s:textfield>

  <s:submit></s:submit>

  </s:form>
直接在model中设置该复杂对象值即可赋值
Struts 还允许填充 Collection 里的对象, 这常见于需要快速录入批量数据的场合
直接在model中设置该复杂对象集合值即可赋值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts2.0 类型转换