Struts2中的数据类型转换

当我们使用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)文件

这里写图片描述

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

这里写图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值