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

Struts2中的数据类型转换

2016-10-20 19:15 232 查看
当我们使用Struts2框架实现一个简单的注册功能时,页面中输入的内容都是String类型的,而我们的数据库中却是各种类型的,这时候就需要进行数据类型转换

一:数据转换:

根据转换的方向不同分为两种:

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)文件



这时候再去访问这个页面,然后输入错误格式的日期点击注册

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息