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)
可以把異常信息展示到輸入的頁面