类型转换器

springMVC默认是把所有数据类型转换为String类型,如果我们自定义类型转换器, 从前台提交到controller中方法的表单数据会根据我们在方法参数中定义的类型来自动转换,不用再强制的去转换了:

自定义类型转换器

表单数据index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<form action="/converter.do" method="post">
  姓名:<input type="text" name="username">
  <br>
  年龄:<input type="text" name="age">
  <br>
  生日:<input type="date" name="birthday">
   <br>
  <input type="submit" value="提交">
</form>
</body>
</html>

Controller, Birthday为Date类型,如果不定义类型转换器的话,运行将会出错。

package com.davis.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;

@Controller
public class dataConverter {
  @RequestMapping("converter.do")
  public ModelAndView information(String username, int age, Date birthday)throws Exception{
      ModelAndView mv = new ModelAndView();
      mv.addObject("username",username);
      mv.addObject("age",age);
      mv.addObject("birthday",birthday);
      mv.setViewName("information");
      return mv;
  }
}

创建一个类实现Converter接口,该接口中的泛型,前面的类是待转换的类型,后面的是转换之后的类型。

package com.davis.converter;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class dateConverter implements Converter <String, Date> {
  @Override
  public Date convert(String source) {
      if(source!=null && !"".equals(source)){
          SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
          try {
              return sdf.parse(source);
          } catch (ParseException e) {
              e.printStackTrace();
          }
      }
      return null;
  }
}

配置springmvc.xml文件:

 <!--注册驱动-->
<mvc:annotation-driven conversion-service="conversionService"/>
  <!--注册类系转换器-->
  <bean id="converter" class="com.davis.converter.dateConverter"/>
  <!--注册类型转换服务的bean-->
  <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
      <property name="converters" ref="converter"/>
  </bean>
  

前台响应页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>information</title>
</head>
<body>
<h2>
  姓名:${username}<br>
  年龄:${age}<br>
  生日:${birthday}
</h2>
 </body>
</html>

这样子spring mvc会根据我们编写的类型转换器将jsp提交的String类型的数据转换为Date类型。

@DateTimeFormat注解

后来spring中新增了@DateTimeFormat注解,通过该注解可以进行日期类型的转换,这样子我们就不用单独编写日期类型的转换器了。@DateTimeFormat注解支持joda time,在jdk7之前的api中,关于日期处理相关的类都不太好用,而joda time提供非常好用的日期处理相关的api,因此joda time深受很多开发者的喜爱,在jdk8中已经将joda time的类纳入,就是之前说过的LocalDate等。

如果你使用的是jdk8(不含)之前的版本,并且要使用@DateTimeFormat注解的话,需要引入joda time相关的jar包:

 <dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.9</version>
</dependency>

只需在Date前面加上注解就行了@DateTimeFormat(pattern = “yyyy-DD-mm”)

package com.davis.controller;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;

@Controller
public class dataConverter {
  @RequestMapping("converter.do")
  public ModelAndView information(String username, int age, @DateTimeFormat(pattern = "yyyy-DD-mm") Date birthday)throws Exception{
      ModelAndView mv = new ModelAndView();
      mv.addObject("username",username);
      mv.addObject("age",age);
      mv.addObject("birthday",birthday);
      mv.setViewName("information");
      return mv;
  }
}

这里还可以将日期转换为LocalDate类型,不过需要注意的是,如果你要将日期转换为LocalDate类型,那么需要将这个属性写到javabean里面,不能使用controller中的方法参数的方式,此时会报出错误。

package com.davis.bean;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;

public class User {
  private String username;
  private int age;

  @DateTimeFormat(pattern = "yyyy-MM-dd")
  private LocalDate Birthday;

  public String getUsername() {
      return username;
  }

  public void setUsername(String username) {
      this.username = username;
  }

  public int getAge() {
      return age;
  }

  public void setAge(int age) {
      this.age = age;
  }

  public LocalDate getBirthday() {
      return Birthday;
  }

  public void setBirthday(LocalDate birthday) {
      Birthday = birthday;
  }
} 

在controller的方法参数中添加User

package com.davis.controller;
import com.davis.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class dataConverter {
  @RequestMapping("converter.do")
  public ModelAndView information(User user)throws Exception{
      ModelAndView mv = new ModelAndView();
      mv.addObject("username",user.getUsername());
      mv.addObject("age",user.getAge());
      mv.addObject("birthday",user.getBirthday());
      mv.setViewName("information");
      return mv;
  }
}