SpringMVC学习笔记六:类型转换器及类型转换异常处理
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)


可以把异常信息展示到输入的页面
SpringMVC学习笔记六:类型转换器及类型转换异常处理的更多相关文章
- SpringMVC学习笔记六:使用Formatter解析或格式化数据
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6832903.html Converter可以将一种类型转换成另一种类型,是任意Object之间的类型 ...
- SpringMVC学习笔记六:使用 hibernate-validator注解式数据校验
对客户端传过来的参数,在使用前一般需要进行校验. SpringMVC框架内置了Validator验证接口,但是实现起来太麻烦.我们一般使用 hibernate-validator进行数据校验. 1:j ...
- SpringMVC 学习笔记(六)拦截器
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- SpringMVC学习笔记(六)
一.SpringMVC文件的上传 1.1.需要导入两个jar包 1.2在SpringMVC配置文件中加入 <!-- upload settings --> <bean id=&quo ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
- springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定
springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定 标签: springmvc springmvc学习笔记12-springmvc注解开发之包装类型參数绑定 需求 实现方 ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
随机推荐
- dockerfile保留字指令
FROM 基础镜像,当前新镜像是基于哪个镜像的 MAINTAINER 镜像维护者的姓名和邮箱地址 RUN 容器构建时运行的命令 EXPOSE 当前容器对外暴露的端口 WORKDIR 指定在创建容器后, ...
- Cannot find tomcat目录/bin/setclasspath.sh This file is needed to run this program
首先如果直接使用 root 用户来启动 tomcat 的话,是可以正常启动的. 但是我们在 Linux 中使用普通用户启动 tomcat 报了如下错误 Cannot find /developer/a ...
- MVC思想概叙
随着应用系统的逐渐增大,系统的业务逻辑复杂度是以几何的方式增长,在这种情况下,如果依然把所有的业务逻辑都放在JSP页面中,那将成为一场恶梦. MVC思想将应用中各个组件按照功能来进行分类,不同的组将使 ...
- [PHP防火墙]输入内容存在危险字符,安全起见,已被本站拦截
之前在很多的网站都看到了360webscan的攻击拦截脚本,正好分析并学习一下. 下载地址:http ://webscan.360.cn/protect/down?domain = blog.dybo ...
- sql plus笔记
指令请走这边 因为sql plus缓冲区有限 所以要查看输出有时会不太方便 使用spool语句将输出写入文件 sql>spool 要保存的完整路径 ; ; ; sql output; ; ; s ...
- Java远程调用Linux脚本
参考:http://blog.csdn.net/xiao_jun_0820/article/details/26254813 http://blog.csdn.net/a19881029/artic ...
- CodeForces 263E Rhombus
洛谷题目页面传送门 & CodeForces题目页面传送门 给定一个$n$行$m$列的矩阵,第$i$行$j$列为$a_{i,j}$,以及一个常数$s\in\left[1,\left\lceil ...
- pandas(一)
pandas.io 1.概述,主要从txt,json,pkl,csv,excel中读取数据,读取的数据最终转化为pandas.core.frame.DataFrame类型的df 先来看总的api fr ...
- APUE 书中 toll 函数
今天看unix环境高级编程时,随着书上的源码打了一遍,编译时提示 toll函数未定义, 找了半天(恕我对上下文不了解).看了英文版和源代码文件才知道, 中文版打印错了: toll => atol ...
- 使用 try-with-resources 优雅关闭资源
桂林SEO:我们知道,在 Java 编程过程中,如果打开了外部资源(文件.数据库连接.网络连接等.redis),我们必须在这些外部资源使用完毕后,手动关闭它们. 因为外部资源不由 JVM 管理,无法享 ...