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中设置该复杂对象集合值即可赋值
从一个 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中设置该复杂对象集合值即可赋值
相关文章推荐
- c#入门之类型转换详解
- C#难点逐个击破(9):类型转换
- C++中4种类型转换方式 cast操作详解
- C++中的四种类型转换
- asp 类型转换函数大全第1/2页
- JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
- Javascript 强制类型转换函数
- JavaScript的类型转换(字符转数字 数字转字符)
- Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
- sql使用cast进行数据类型转换示例
- javascript中的关于类型转换的性能优化
- C#调用C++版本dll时的类型转换需要注意的问题小结
- JS 类型转换常见方法小结
- Javascript将string类型转换int类型
- python中的一些类型转换函数小结
- C++类型转换归纳总结
- c++显式类型转换示例详解
- C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结
- Javascript 类型转换方法
- js类型转换与引用类型详解(Boolean_Number_String)