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>IndexPagetitle> 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{ 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 Pagetitle> 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)
可以把异常信息展示到输入的页面