Struts2中的数据类型转换
2016-10-20 19:15
232 查看
当我们使用Struts2框架实现一个简单的注册功能时,页面中输入的内容都是String类型的,而我们的数据库中却是各种类型的,这时候就需要进行数据类型转换
1:把页面上的字符串类型的数据转成数据库的类型 insert,update,delete
2:把数据库中某种类型的数据转换成字符串显示在页面上 select
其实不难发现,我们如果只是简单的实现注册功能时,
像我们在页面输入的数字,符合yyyy-MM-dd这个形式的日期,还有页面中的多选框,当我们点击注册把这些数据存入数据库时并不会报错,
数据库中也成功存储了这些数据
这是因为Struts2自动帮我们实现了一些类型转换。
struts2实现的自动转换:
虽然Struts2可以自动实现一些类型转换,可还是不够的,比如,如果我们在页面中输入MM/dd/yyyy这样形式的日期时
就会出现错误,因为Struts2不能将MM/dd/yyyy这样格式的字符串转换成日期格式
这时候只靠Struts2自动转换就不行了,我们可以找到Struts2实现自动转换上面三种数据类型的类,在Struts核心包struts2-core-2.3.15.3.jar中找到struts-default.xml文件,这个文件中定义了很多bean和interceptor,我们可以找到实现转换功能的类
回到MyEclipse中,ctrl+shift+t,可以看到这个类的源码,可以看到,这个类继承了DefaultTypeConverter类
我们继续找DefaultTypeConverter类,同样是ctrl+shift+t,
最后找到这个类实现了TypeConverter接口,
如果我们要实现输入MM/dd/yyyyy格式的数据时也能成功注册进去,我们可以自定义类型转换器,同样实现TypeConverter接口,但是因为这个接口中的转换方法参数太多,不便于我们实现,所以我们可以选择继承他的子类DefaultTypeConverter,我们在这个类的子类中找到struts的类型转换类StrutsTypeConverter(点击类名DefaultTypeConverter然后ctrl+t就可以找他的子类了),这个类中有很清楚的两个方法convertFromString,convertToString,我们就可以继承这个类,重写这两个方法,实现我们自定义的类型转换了
定义好的类型转换器需要注册:
1:该类型转换器只能被特定的类使用(局部的,与javabean定义在同一个包中)
#局部的类型转换器,文件名的命名规则:javabean名称-conversion.properties
#键是字段名,值是类型转换器的类路径
2:该类型转换器可以被全局使用(全局的,定义在src下)
# 定义全局的类型转换器,文件的命名规则是xwork-conversion.properties
当我们自定义类型转换器并注册好后,我们在输入MM/dd/yyyy格式的日期时就不会出错了。
说明没有定义input结果视图
下面我们在struts.xml中定义结果视图 input
然后发布项目我们会发现问题是回到了regist页面但是没有显示数据
解决:使用struts2的标签,(加入<%@taglib uri=”/struts-tags” prefix=”s”%>)
这样就可以实现处理没有自定义类型转换器时的错误,并回显数据了
点击注册后,就不会出现错误页面而是回到注册页面,并把之前输入的数据回显到页面中并给出提示
这里的提示信息是英文的,我们可以通过在javabean,也就是User类所在的包里面写一个User.properties(注意文件名必须是javabean类名.properties)文件
这时候再去访问这个页面,然后输入错误格式的日期点击注册
一:数据转换:
根据转换的方向不同分为两种:1:把页面上的字符串类型的数据转成数据库的类型 insert,update,delete
2:把数据库中某种类型的数据转换成字符串显示在页面上 select
其实不难发现,我们如果只是简单的实现注册功能时,
<body> <form action="${pageContext.request.contextPath}/regist.action" method="post"> 用户名:<input type="text" name="username"><br/> 密码:<input type="password" name="password"><br/> 出生日期:<input type="text" name="birthday"><br/> 爱好:<input type="checkbox" name="hobby" value="吃">吃 <input type="checkbox" name="hobby" value="睡">睡 <input type="checkbox" name="hobby" value="玩">玩<br/> 已婚:<input type="checkbox" name="married" value="true"><br/> <input type="submit" value="注册"><br/> </form> </body>
像我们在页面输入的数字,符合yyyy-MM-dd这个形式的日期,还有页面中的多选框,当我们点击注册把这些数据存入数据库时并不会报错,
数据库中也成功存储了这些数据
这是因为Struts2自动帮我们实现了一些类型转换。
struts2实现的自动转换:
1:基本数据类型转换 2:本地格式的日期类型(yyyy-MM-dd)---Date 3:把值是String[]数组类型的转换成了用“,”间隔得字符串
虽然Struts2可以自动实现一些类型转换,可还是不够的,比如,如果我们在页面中输入MM/dd/yyyy这样形式的日期时
就会出现错误,因为Struts2不能将MM/dd/yyyy这样格式的字符串转换成日期格式
这时候只靠Struts2自动转换就不行了,我们可以找到Struts2实现自动转换上面三种数据类型的类,在Struts核心包struts2-core-2.3.15.3.jar中找到struts-default.xml文件,这个文件中定义了很多bean和interceptor,我们可以找到实现转换功能的类
回到MyEclipse中,ctrl+shift+t,可以看到这个类的源码,可以看到,这个类继承了DefaultTypeConverter类
我们继续找DefaultTypeConverter类,同样是ctrl+shift+t,
最后找到这个类实现了TypeConverter接口,
如果我们要实现输入MM/dd/yyyyy格式的数据时也能成功注册进去,我们可以自定义类型转换器,同样实现TypeConverter接口,但是因为这个接口中的转换方法参数太多,不便于我们实现,所以我们可以选择继承他的子类DefaultTypeConverter,我们在这个类的子类中找到struts的类型转换类StrutsTypeConverter(点击类名DefaultTypeConverter然后ctrl+t就可以找他的子类了),这个类中有很清楚的两个方法convertFromString,convertToString,我们就可以继承这个类,重写这两个方法,实现我们自定义的类型转换了
二:自定义类型转换器:
TypeConverter ---DefaultTypeConverter ---StrutsTypeConverter
package com.qianfeng.web.converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; /** * 自定义类型转换器(自定义的类型转换器只能实现一种类型和String类型之间的转换,如果需要在转别的类型需要再写一个类型转换器) * 1:把页面上的MM/dd/yyyy格式的日期转成Date类型 * 2:把Date类型的日期转成字符串 * */ public class MyConverter extends StrutsTypeConverter { private SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); //1:把页面上的MM/dd/yyyy格式的日期转成Date类型 //第一个参数时OGNL上下文,第二个参数时被转换的数据,第三个参数是转换的类型 //参数不用传进来,有拦截器帮我们实现注入 @Override public Object convertFromString(Map arg0, String[] arg1, Class arg2) { //判断有没有被转换的数据 if(arg1==null||arg1.length==0){ return null; } //得到被转换的数据 String data = arg1[0]; if(arg2==java.util.Date.class){ try { return sdf.parse(data); } catch (ParseException e) { e.printStackTrace(); } } return null; } @Override public String convertToString(Map arg0, Object arg1) { // 判断数据是否是Date类型的实例 if(arg1 instanceof Date){ Date d = (Date)arg1; return sdf.format(d); } return null; } }
定义好的类型转换器需要注册:
1:该类型转换器只能被特定的类使用(局部的,与javabean定义在同一个包中)
#局部的类型转换器,文件名的命名规则:javabean名称-conversion.properties
#键是字段名,值是类型转换器的类路径
2:该类型转换器可以被全局使用(全局的,定义在src下)
# 定义全局的类型转换器,文件的命名规则是xwork-conversion.properties
当我们自定义类型转换器并注册好后,我们在输入MM/dd/yyyy格式的日期时就不会出错了。
三:没有自定义类型转换器时的错误处理
如果我们没有自定义类型转换器,输入不符合Struts2自动转换的格式的数据时,就会报错,这样就会让用户看到上面的错误页面,这时候根据错误信息内容 No result defined for action com.qianfeng.web.action.UserAction and result input说明没有定义input结果视图
下面我们在struts.xml中定义结果视图 input
<package name="p1" extends="struts-default"> <action name="regist" class="com.web.action.UserAction" method="regist"> <result name="exists" type="redirect">/msg.jsp</result> <result name="success">/success.jsp</result> <result name="input">/regist.jsp</result><!-- 数据回显,回到原来的页面,并且显示出之前输入的数据 --> </action> </package>
然后发布项目我们会发现问题是回到了regist页面但是没有显示数据
解决:使用struts2的标签,(加入<%@taglib uri=”/struts-tags” prefix=”s”%>)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head></head> <body> <s:head></s:head><!-- 显示为红色 --> <!-- 实现数据的回显,必须使用struts2 的表单 struts2的form 和html的表单差不多 action:可以直接写动作 method:默认是 post enctype:表单编码的MIME类型 发生类型转换错误时为什么加入input结果视图就能实现回显? 拦截器conversionError实现的这个功能 注意:动作类必须继承 ActionSupport --> <s:form action="regist.action"> <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"></s:textfield> <s:password name="password" label="密码" showPassword="true"></s:password> <s:textfield name="birthday" label="出生日期"></s:textfield> <s:submit value="注册"></s:submit> </s:form> </body> </html>
这样就可以实现处理没有自定义类型转换器时的错误,并回显数据了
点击注册后,就不会出现错误页面而是回到注册页面,并把之前输入的数据回显到页面中并给出提示
这里的提示信息是英文的,我们可以通过在javabean,也就是User类所在的包里面写一个User.properties(注意文件名必须是javabean类名.properties)文件
这时候再去访问这个页面,然后输入错误格式的日期点击注册
相关文章推荐
- struts2页面上double类型的数据转换成整数
- Struts2 Chater 4&5 Struts2中的验证输入和数据类型的转换
- 细谈struts2(七)数据类型转换详解
- Struts2的知识整理总结(三)—— 数据封装和类型转换
- Struts2类型转换,数据验证
- Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解
- Struts2数据类型转换之批量数据转换
- day27-struts2---day02( 类型转换,数据校验,国际化,拦截器)
- Struts2 入门4 数据校验_类型转换_国际化
- struts2-OGNL和类型转换(structs 自动数据表单获取)
- Struts2数据类型转换(页面数据库数据类型转换)
- Struts2 基本数据类型转换的例子 详解析
- Struts2之简单数据类型转换
- Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解
- [ Struts2 ] 数据类型转换
- struts2(七)数据类型转换详解
- Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解
- Struts2基础学习之数据类型转换
- Struts2数据类型转换,数据验证
- java框架之struts2数据类型转换(1)