springmvc的类型转换

 一、springmvc的类型转换

(一)默认情况下,springmvc内置的类型转换器只能

    将“yyyy/MM/dd”类型的字符串转换为Date类型的日期

  情境一:

    而现在我们无法得知用

    户会输入什么日期格式的数据,所以,内置的类型转换器无法转换其他日期格式的类型

    为了方便程序,减少代码量,我们抽离出自己的类型转换器

    此种方法也有弊端,就是讲几个类唯一的继承权用在了类型转换器上,但也是没有办法的办法

  步骤一:

    定义自己的类型转换器  继承一个父接口 Converter<S, T>

    s:代表源数据类型

    T:代表目标数据类型

package cn.yxj.convertion;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Pattern;

import org.springframework.core.convert.converter.Converter;

public class MyConvertion implements Converter<String, Date>{

    public Date convert(String source) {

        /*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");*/
        SimpleDateFormat sdf=getDateFormat(source);
        try {
            return sdf.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

    private SimpleDateFormat getDateFormat(String source) {
        //进行正则匹配
        //2016-12-14
        //2016/12/14
        //20161214
        if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source)){
            return new SimpleDateFormat("yyyy-MM-dd");
        }else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", source)){
            return new SimpleDateFormat("yyyy/MM/dd");
        }else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", source)){
            return new SimpleDateFormat("yyyyMMdd");
        }else if(Pattern.matches("^\\d{4}年\\d{2}月\\d{2}日$", source)){
            return new SimpleDateFormat("yyyy年MM月dd日");
        }
        return null;
    }

}

步骤二、在配置文件中注册自定义类型转化器,将该类交由spring容器管理

<!-- 01.注册自定义的类型转换器 -->
     <bean id="myConvertion" class="cn.yxj.convertion.MyConvertion"></bean>

     <!--02.注册类型转换器的服务工厂  产生转换对象  -->
     <bean id="convertionservice" class="org.springframework.context.support.ConversionServiceFactoryBean">
       <property name="converters" ref="myConvertion"></property>
     </bean>
     <!--03.  -->
     <mvc:annotation-driven conversion-service="convertionservice"/>

配置完成

(二) 情景二:

      当我们在前台输入如下信息 ,年龄为string不能装配成后台的int类型转向400错误页面,

      面对这种情况我们更想看到的是回到初始页面

  

  解决方案:这种情况就是出现了类型转换异常

  我们就采用异常处理机制,其实再出现类型转换异常时,请求就不会再进入处理器方法,而是被我们自定的的异常处理方法所捕获

  在处理器类中加入异常处理方法,完成重定向的功能

//当出现类型转换异常时,跳回index.jsp
        @ExceptionHandler(TypeMismatchException.class)
        public ModelAndView getBack(HttpServletRequest request,Exception ex){
            ModelAndView mv=new ModelAndView();
            mv.setViewName("/index.jsp");
            return mv;
        }

(三)情景三:

    完成上述操作后,我们现在再来思考一个问题,如果表单上有很多条数据,用户提交失败,重定向后之前所填的数据完全丢失,那用户的内心估计是崩溃的

    这是我们就应该来考虑“数据回显”的问题了,最好,我们可以提示出那条数据出错了

    下面我们就重新优化异常处理机制

    首先我们查看一下异常的消息,我们会发现一个规律,利于我们进行特定数据异常的定位 所以下面我们使用ex.getMessage().contains(birthday)

//当出现类型转换异常时,跳回index.jsp
        @ExceptionHandler(TypeMismatchException.class)
        public ModelAndView getBack(HttpServletRequest request,Exception ex){
            ModelAndView mv=new ModelAndView();
            String birthday=request.getParameter("birthday");
            String age=request.getParameter("age");
            mv.addObject("birthday",birthday);
            mv.addObject("age",age);
            if(ex.getMessage().contains(birthday)){
                mv.addObject("birthdayerror","日期格式不正确");
            }
            if(ex.getMessage().contains(age)){
                mv.addObject("ageerror","年龄格式不正确");
            }
            mv.setViewName("/index.jsp");
            return mv;
        }

结束

时间: 2024-10-08 13:27:46

springmvc的类型转换的相关文章

SpringMVC之类型转换Converter

SpringMVC之类型转换Converter 1.1     目录 1.1      目录 1.2      前言 1.3      Converter接口 1.4      ConversionService接口 1.5      ConverterFactory接口 1.6      GenericConverter接口 1.6.1     概述 1.6.2     ConditionalGenericConverter 接口 1.2     前言 在以往我们需要SpringMVC为我们自

SpringMVC日期类型转换问题三大处理方法归纳

前言 我们在SpringMVC开发中,可能遇到比较多的问题就是前台与后台实体类之间日期转换处理的问题了,说问题也不大,但很多人开发中经常会遇到这个问题,有时很令人头疼,有时间问题暴露的不是很明显,然后逐渐对问题进行跟踪,会发现是日期类型转换失败"映射"不到对应的持久类的日期属性上造成的,由此我还特意写过一篇博文:SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法.感

SpringMVC日期类型转换问题处理方法归纳

前言 我们在SpringMVC开发中,可能遇到比较多的问题就是前台与后 台实体类之间日期转换处理的问题了,说问题也不大,但很多人开发中经常会遇到这个问题,有时很令人头疼,有时间问题暴露的不是很明显,然后逐渐对问题进行 跟踪,会发现是日期类型转换失败"映射"不到对应的持久类的日期属性上造成的,由此我还特意写过一篇博文:SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

【Spring学习笔记-MVC-8】SpringMVC之类型转换

作者:ssslinppp       1. 摘要 这里仅仅是一个简单的类型转换示例,重点在于说明SpringMVC类型转换的方法.配置及流程: 基本功能说明: 1. 前台传递的数据格式形如:"zhangSan:888": http://localhost:8080/SpringMVCTest/test/conversionTest.action?person=zhangsan:666 2. 将"zhangSan:888"字符串转换为Person对象: 具体过程: 定

springmvc参数类型转换三种方式

SpringMVC绑定参数之类型转换有三种方式:     1. 实体类中加日期格式化注解      @DateTimeFormat(pattern="yyyy-MM-dd hh:MM") private Date creationTime;     2.在Controller类的方法中加入一段代码 /** * 在controller层中加入一段数据绑定代码 * @param webDataBinder */ @InitBinder public void initBinder(WebD

SpringMVC数据类型转换的两种方式

1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中 2.配置自定义转换器到FormattingConversionServiceFactoryBean工厂中! 注意ID好像只能为conversionService 这样通过请求到达目标Handler之前对请求参数进行字符串修改,将Handler入参格式的数据返回,实现转换器的作用 2.相同的原理,用filter拦截请求 自定义filter实现Filter接口:在web.xml里注册filter:用

【Spring学习笔记-MVC-8.1】SpringMVC之类型转换@initBinder

作者:ssslinppp       1. 摘要 类型转换器常用于转换double.float.date等类型. 上文讲解了Converter类型转换器,这属于Spring 3新支持的类型转换器: 本文主要介绍@InitBinder,可参考如下链接: 参考: http://blog.csdn.net/axin66ok/article/details/17938095 功能说明: 当表单提交double.date等类型时,我们需要将其转换为java可识别的date,double等,如在浏览器中输入

SpringMVC——类型转换和格式化、数据校验、客户端显示错误消息

在介绍类型转换和格式化之前,我首先来介绍 <mvc:annotation-driven />. 需要导入的 schema: xmlns:mvc="http://www.springframework.org/schema/mvc" 一.作用: 1.会自动注册 RequestMappingHandlerMapping.RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三个 Bean. 若配置该注

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

跟我学SpringMVC目录汇总贴.PDF下载.源码下载 http://jinnianshilongnian.iteye.com/blog/1752171 跟开涛学SpringMVC 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 第三章 DispatcherServlet详解 第四章 Controller接口控制器详解(1) 第四章 Controller接口控制器详解(2) 第四章 Controller接口控制器详解(3) 第四章 Controller接口控制器详解(