SpringMVC内部有类型转换器,当从Request中获取参数后,放入Controller中时,会根据Controller中指定的类型进行自动转换,当指的类型SpringMVC不能自动转换时,就需要自定义类转换器
项目目录树:
请求页面index.jsp
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <base href="<%=basePath %>"> <title>IndexPage</title> </head> <body> <c:out value="${ex.message }"></c:out> <form action="converter/converter"> name: <input type="text" name="name"><br> age: <input type="text" name="age"><br> Date: <input type="text" name="date"><br> <input type="submit" value="submit"> </form> </body> </html>
控制器ConverterController.java
package com.orange.controller; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.TypeMismatchException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping(value="/converter") public class ConverterController { @RequestMapping(value="/converter") public ModelAndView doConverter(String name, int age, Date date, ModelAndView mav){ mav.addObject("name", name); mav.addObject("age", age); mav.addObject("date", date); mav.setViewName("/showConverter.jsp"); return mav; } //注释式异常处理方式,当发生类型转换异常时,必须使用注解式异常处理,应该该异常在进入Controller之前就已经发生 @ExceptionHandler(value=TypeMismatchException.class) public ModelAndView exceptionResolver(Exception ex, HttpServletRequest request){ ModelAndView mav = new ModelAndView(); mav.addObject("ex", ex); mav.setViewName("/index.jsp"); return mav; } }
自定义类型转换器
package com.orange.converter; 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 MyDateConverter implements Converter<String, Date> { public Date convert(String source) { try { SimpleDateFormat sdf = getSimpleDateFormat(source); return sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); } return null; } private SimpleDateFormat getSimpleDateFormat(String source){ SimpleDateFormat sdf = null; if(Pattern.matches("^\d{4}-\d{2}-\d{2}$", source)){ sdf = new SimpleDateFormat("yyyy-MM-dd"); }else if(Pattern.matches("^\d{4}\d{2}\d{2}$", source)){ sdf = new SimpleDateFormat("yyyyMMdd"); }else if(Pattern.matches("^\d{4}/\d{2}/\d{2}$", source)){ sdf = new SimpleDateFormat("yyyy/MM/dd"); } return sdf; } }
注册类型转换器,配置spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 扫描注解 --> <context:component-scan base-package="com.orange.controller" /> <!-- 开启类型转换服务 --> <mvc:annotation-driven conversion-service="conversionService"/> <!-- 注册自定义类型转换器 --> <bean id="dateConverter" class="com.orange.converter.MyDateConverter"></bean> <!-- 注册类型转换服务 --> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters" ref="dateConverter"></property> </bean> </beans>
跳转后的页面showConverter.jsp
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK"> <base href="<%=basePath %>"> <title>showController Page</title> </head> <body> <c:out value="${name }"></c:out><br> <c:out value="${age }"></c:out> <c:out value="${date }"></c:out> </body> </html>
当输入信息正确时
当输入格式不支持时(自定义类型转换器支持yyyy-MM-dd,yyyyMMMdd,yyyy/MM/dd)
可以把异常信息展示到输入的页面