Action参数封装过程中,数据类型转换问题
来源:互联网 发布:春英广场舞网络一线牵 编辑:程序博客网 时间:2024/05/29 09:13
struts接收表单的参数可参见:http://blog.csdn.net/flysun3344/article/details/54176019
下面为参数封装过程中,数据类型的转换问题:
1、 struts2 内部提供大量类型转换器,用来完成数据类型转换问题
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串
数组 可以将多个同名参数,转换到数组中
集合 支持将数据保存到 List 或者 Map 集合
案例: 输入合法年龄和生日可以自动转换
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串
数组 可以将多个同名参数,转换到数组中
集合 支持将数据保存到 List 或者 Map 集合
案例: 输入合法年龄和生日可以自动转换
customer.jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><!-- 引入struts2 标签库 --> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><h1>添加一个客户信息</h1><s:fielderror /> <!-- 查看fieldError错误信息 --><form action="${pageContext.request.contextPath }/customer.action" method="post">客户姓名 <input type="text" name="username" /> <br/>年龄 <input type="text" name="age" /> <br/>生日 <input type="text" name="birthday" /> <br/><input type="submit" value="提交" /></form></body></html>Action:
public class CustomerAction extends ActionSupport {private String username;private int age; // 内建转换器private Date birthday; // yyyy-MM-dd 可以自动转换public void setUsername(String username) { this.username = username; } public void setAge(int age) { this.age = age; } public void setBirthday(Date birthday) { this.birthday = birthday; }@Overridepublic String execute() throws Exception {System.out.println("客户姓名:" + username);System.out.println("年龄: " + age);System.out.println("生日:" + birthday);return NONE;}}配置:
<action name="customer" class="fly.sun.demo.CustomerAction"><result name="input">/demo/customer.jsp</result></action>当输入abc 转换为 int类型 age时
Caused by: java.lang.NoSuchMethodException: fly.sun.demo.CustomerAction.setAge([Ljava.lang.String;
分析: 输入20 ,转换 int类型20 --- setAge(int)
输入abc,转换int 出错 ---- setAge(String) ----- 报错方法不存在异常
2、 自定义类型转换器 (了解)
1) 自定义类型转换器
第一种 实现TypeConverter接口
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType)
第二种 继承 DefaultTypeConverter
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType)
第三种 继承 StrutsTypeConverter
convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) --- 请求封装
convertToString(java.util.Map context, java.lang.Object o) --- 数据回显
* 类型转换器 一直都是双向转换
页面提交请求参数,封装到model --- 需要转换
model数据 需要在页面 回显 ---- 需要转换
第一种 实现TypeConverter接口
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object target, java.lang.reflect.Member member, java.lang.String propertyName, java.lang.Object value, java.lang.Class toType)
第二种 继承 DefaultTypeConverter
convertValue(java.util.Map<java.lang.String,java.lang.Object> context, java.lang.Object value, java.lang.Class toType)
第三种 继承 StrutsTypeConverter
convertFromString(java.util.Map context, java.lang.String[] values, java.lang.Class toClass) --- 请求封装
convertToString(java.util.Map context, java.lang.Object o) --- 数据回显
* 类型转换器 一直都是双向转换
页面提交请求参数,封装到model --- 需要转换
model数据 需要在页面 回显 ---- 需要转换
2) 以 1990/10/10 为例,自定义日期转换器,完成转换
public class MyDateConverter extends DefaultTypeConverter {// 覆盖convertValue@Override/** * context 上下文对象 * value 转换前的值 * toType 转换目标类型 */public Object convertValue(Map<String, Object> context, Object value,Class toType) {// 根据toType判断 是请求封装 还是 数据回显DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");System.out.println("自定义转换器 执行了...");if (toType == Date.class) {// 请求参数封装 (value是字符串)String[] params = (String[]) value;String strVal = params[0]; // 转换为 日期类型try {return dateFormat.parse(strVal);} catch (ParseException e) {e.printStackTrace();// 在类型转换过程中如果发生错误,通知struts2框架throw new RuntimeException(e);}} else {// 回显(value是 Date)Date date = (Date) value;return dateFormat.format(date);}}}3) 注册类型转换器
局部注册 : 只对当前Action有效 (针对属性) ,在Action类所在包 创建 Action类名-conversion.properties , 格式 : 属性名称=类型转换器的全类名 .
eg:
内容为:birthday = fly.sun.demo.MyDateConverter
全局注册 : 针对所有Action的日期类型有效 (针对类型 ),在src下创建 xwork-conversion.properties ,格式 : 待转换的类型=类型转换器的全类名.
eg:
内容为:java.util.Date = fly.sun.demo.MyDateConverter
3、 类型转换中错误处理
通过分析拦截器作用,得知当类型转换出错时,自动跳转input视图 ,在input视图页面中 <s:fieldError/> 显示错误信息。但是显示的是英文。可以在Action所在包中,创建 ActionName.properties,在局部资源文件中配置提示信息 : invalid.fieldvalue.属性名= 错误信息。
eg:invalid.fieldvalue.birthday=******
阅读全文
0 0
- Action参数封装过程中,数据类型转换问题
- 【Spring】详解Spring MVC中不同格式的POST请求参数的数据类型转换过程
- 【JavaWeb-16】静态参数封装、3种动态参数封装、数据类型转换、struts标签、验证器
- form action中传递参数的问题
- form action中传递参数的问题
- 参数中有const时进行数据类型的转换问题-固定变量转常量
- JavaScript跳转页面/Action并传递中文参数[解决js超链接传递过程中产生的中文乱码问题]
- jni中数据类型的转换问题
- struts2中自动封装参数及类型转换
- url.action参数问题
- struts1中action参数
- argparse 中action参数
- 使用Action来封装HTTP请求参数
- SpringMVC中,前台jsp封装参数,绑定参数,传递参数到后台controller的过程详解
- form action中get \post传递参数的问题
- ajax请求中文参数在action中乱码问题
- 【问题】struts2中Action的请求参数获取
- struts2框架中action链传递时的参数问题
- 消除重复数字
- git使用教程
- 引用(交换数值)
- css其他属性
- 安卓图片加载代码
- Action参数封装过程中,数据类型转换问题
- IPC-共享内存
- PHP 单例模式解析和实战
- Spark优化--开发调优
- HDU 3518Boring counting(后缀数组)
- Luogu 1351(树形dp)
- Spark cache和checkpoint
- Unity 碰撞器与触发器
- 原来用matlab画好图后,直接可以用窗口进行很多操作