springmvc的类型转换

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

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

情境一:

而现在我们无法得知用

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

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

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

步骤一:

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

s:代表源数据类型

T:代表目标数据类型

 

  1. package cn.hmy.convertion;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.regex.Pattern;
  6. import org.springframework.core.convert.converter.Converter;
  7. public class MyConvertion implements Converter<String, Date>{
  8. public Date convert(String source) {
  9. /*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");*/
  10. SimpleDateFormat sdf=getDateFormat(source);
  11. try {
  12. return sdf.parse(source);
  13. } catch (ParseException e) {
  14. e.printStackTrace();
  15. }
  16. return null;
  17. }
  18. private SimpleDateFormat getDateFormat(String source) {
  19. //进行正则匹配
  20. //2016-12-14
  21. //2016/12/14
  22. //20161214
  23. if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", source)){
  24. return new SimpleDateFormat("yyyy-MM-dd");
  25. }else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", source)){
  26. return new SimpleDateFormat("yyyy/MM/dd");
  27. }else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", source)){
  28. return new SimpleDateFormat("yyyyMMdd");
  29. }else if(Pattern.matches("^\\d{4}年\\d{2}月\\d{2}日$", source)){
  30. return new SimpleDateFormat("yyyy年MM月dd日");
  31. }
  32. return null;
  33. }
  34. }

 

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

 

 

  1. <!-- 01.注册自定义的类型转换器 -->
  2. <bean id="myConvertion" class="cn.hmy.convertion.MyConvertion"></bean>
  3. <!--02.注册类型转换器的服务工厂 产生转换对象 -->
  4. <bean id="convertionservice" class="org.springframework.context.support.ConversionServiceFactoryBean">
  5. <property name="converters" ref="myConvertion"></property>
  6. </bean>
  7. <!--03. -->
  8. <mvc:annotation-driven conversion-service="convertionservice"/>

 

配置完成

 情景二:

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

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


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

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

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

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

 

情景三:

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

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

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

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

  1. //当出现类型转换异常时,跳回index.jsp
  2. @ExceptionHandler(TypeMismatchException.class)
  3. public ModelAndView getBack(HttpServletRequest request,Exception ex){
  4. ModelAndView mv=new ModelAndView();
  5. String birthday=request.getParameter("birthday");
  6. String age=request.getParameter("age");
  7. mv.addObject("birthday",birthday);
  8. mv.addObject("age",age);
  9. if(ex.getMessage().contains(birthday)){
  10. mv.addObject("birthdayerror","日期格式不正确");
  11. }
  12. if(ex.getMessage().contains(age)){
  13. mv.addObject("ageerror","年龄格式不正确");
  14. }
  15. mv.setViewName("/index.jsp");
  16. return mv;
  17. }

到此我们的类型转换已经结束

 

版权声明:本文为hmy-1365原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hmy-1365/p/6086304.html