14.SpringMVC核心技术-类型转换器

类型转换器

  在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参,

  均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换。 那是因为在 SpringMVC 框架中,有默认的类型转换器。

  这些默认的类型转换器,可以将 String 类型的数据,自动转换为相应类型的数据

  但默认类型转换器并不是可以将用户提交的 String,转换为所有用户需要的类型。此时,就需要自定义类型转换器了。

  例如,在 SpringMVC 的默认类型转换器中,没有日期类型的转换器,因为日期的格式太 多。

  若要使表单中提交的日期字符串,被处理器方法形参直接接收为 java.util.Date,则需要 自定义类型转换器了。

  

  自定义类型转换器

    a)若要定义类型转换器,则需要实现Controller接口。该Controller接口有两个泛型:

    第一个为待转换的类型,第二个为目标类型。而该接口的方法convert(),用于完成类型转换

 1 // 创建一个 类型转换器,(String 转成 Date)(需要注册)
 2 public class MyConverter implements Converter<String, Date> {
 3     @Override
 4     public Date convert(String dateStr) {
 5         //这样只能 使一种 日期格式生效(所以需要判断一下 前台传来的 日期 是哪种格式的,然后创建相对应的 SimpleDateFormat)
 6         SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"");
 7         //sdf = getDateFormat(dateStr);
 8         try {
 9             return sdf.parse(dateStr);
10         } catch (ParseException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14         return null;
15     }

    

    b) 注册类型转换器

 1 <!-- 1.注册类型转换器 -->
 2     <bean id="dataConverter" class="com.springmvc.converters.MyConverter"/>
 3
 4     <!-- 2.对于类型转换器,并不是直接使用,而是通过  转换服务Bean 来调用类型转化器 -->
 5     <!-- 注册转换服务Bean -->
 6     <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
 7         <property name="converters" ref="dataConverter"></property>
 8     </bean>
 9
10     <!-- 3.转换服务Bean 是由处理器适配器直接调用的。采用mvc的注解驱动 注册方式,可以将转换服务直接注入给处理器适配器 -->
11     <mvc:annotation-driven conversion-service="conversionService" />

  接收多种日期格式的类型转换器

  

 1 public class MyConverter implements Converter<String, Date> {
 2     @Override
 3     public Date convert(String dateStr) {
 4         //这样只能 使一种 日期格式生效(所以需要判断一下 前台传来的 日期 是哪种格式的,然后创建相对应的 SimpleDateFormat)
 5         SimpleDateFormat sdf = new SimpleDateFormat();
 6         sdf = getDateFormat(dateStr);
 7         try {
 8             return sdf.parse(dateStr);
 9         } catch (ParseException e) {
10             // TODO Auto-generated catch block
11             e.printStackTrace();
12         }
13         return null;
14     }
15
16     //这里使用 判断 日期字符 是否符合格式,是哪种格式
17     private SimpleDateFormat getDateFormat(String dateStr) {
18         SimpleDateFormat sdf = new SimpleDateFormat();
19         if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)) {
20             sdf = new SimpleDateFormat("yyyy-MM-dd");
21         } else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)) {
22             sdf = new SimpleDateFormat("yyyy/MM/dd");
23         } else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)) {
24             sdf = new SimpleDateFormat("yyyyMMdd");
25         }
26         return sdf;
27     }
28
29 }

  类型转换失败后给出提示信息

  

 1
1 else {
2             //如果不满足所有的正则表达式选项 ,则 抛出TypeMismatchException  ,
3             //为什么要在这里抛出,因为 上面的 sdf.parse(dateStr);已经被try catch
4             throw new TypeMismatchException("",Date.class);
5         }

//因为出现 类型不匹配异常时,是在Controller 的 方法执行之前就出现了,所以 只能用注解的方式来捕获异常
 2     @ExceptionHandler(TypeMismatchException.class)
 3     public ModelAndView exceptionResolver(HttpServletRequest request,Exception ex) {
 4         ModelAndView mv = new ModelAndView();
 5         //根据异常中的 messsage 存储更加友好错误提示信息
 6         String errorMessageAge = "";
 7         String errorMessageDate = "";
 8
 9         String age = request.getParameter("age");
10         String birthday = request.getParameter("birthday");
11
12         //这样写还是有点问题,当年龄和 生日填写一致时,如都填写1,此时ex.message 包含 1,那么会执行errorMessageAge = "年龄填写错误"
13         if(ex.getMessage().contains(age)) {
14             errorMessageAge = "年龄填写错误" ;
15         } else if(ex.getMessage().contains(birthday)) {
16             errorMessageDate = "生日填写错误" ;
17         }
18
19         //回显 表单数据
20         mv.addObject("age", age);
21         mv.addObject("birthday", birthday);
22
23         mv.addObject("errorMessageAge", errorMessageAge);
24         mv.addObject("errorMessageDate", errorMessageDate);
25         //发生异常后,重新返回填写界面
26         mv.setViewName("/index.jsp");
27
28         return mv;
29
30
31     }
时间: 2024-10-07 07:22:03

14.SpringMVC核心技术-类型转换器的相关文章

springMVC相关—类型转换器

数据类型转换      1. 自定义类型转换器实现Converter<S,T>接口并加入到SpringMVC的IOC容器中, 1 /* 2 @Compent加入到ioc容器中 3 数据类型转化器Myconwerter类继承Converter<原类型,目标类型> 4 */ 5 @Component 6 public class MyConverter implements Converter<String, Student>{ 7 @Override 8 public S

springmvc 自定义类型转换器

springmvc除了自带的部分类型转换之外,还可以自定义类型转换器,按照以下步骤: 1.写一个类实现Converter接口 package com.hy.springmvc.entities; import org.springframework.core.convert.converter.Converter; import com.google.gson.Gson; public class DepartmentConvertor implements Converter<String,

springMVC自定义类型转换器(date类型转换)

//日期的月份不能写成小写mm,因为在日期中还有分钟mm,这两者不能相同. 1.创建一个类实现Convert接口,实现convert方法 public date convert(String source){ if(source!=null&&!source.equals(""){ SimpleDateFormat sdf=getSimpleDateFormat(source); return sdf.parse(source); } } public Date get

SpringMVC类型转换器

SpringMVC自定义类型转换器,String转Date 首先创建自定义转换器类,实现Converter接口 public class Convert implements Converter<String,Date> { public Date convert(String s) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); System.out.println("aaaa

springmvc:自定义类型转换器代码编写

字符串转换日期: 1.自定义一个类 1 /** 2 * 字符串转换日期 3 */ 4 public class StringToDateConverter implements Converter<String, Date> { 5 6 /** 7 * String source 传入进来字符串 8 * @param source 9 * @return 10 */ 11 @Override 12 public Date convert(String source) { 13 //判断 14

springmvc 类型转换器 自定义类型转换器

自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题:

SpringMVC类型转换器、属性编辑器

对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet,卸下请求中的数据 DisptacherServlet将请求中的数据发送给Controller 获取Controller需要接收的参数类型,将参数类型和请求数据发送给DataBinder DataBinder将参数类型和请求数据再发给TypeConverter,由Ty

学习SpringMVC(十七)之自定义类型转换器

本节的主要内容就是将表单提交的字符串转化为对象 在index.jsp中: <span style="font-size:18px;"><h2>SpringMVC 自定义转换器</h2> <form action="springmvc/testConversion"> Employee:<input type="text" name="employee"> <in

springmvc中的类型转换器

在使用springmvc时可能使用@RequestParam注解或者@RequestBody注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换器,否则就报错. 原文地址:https://www.cnblogs.com/moris5013/p/10765218.html