14.SpringMVC核心技术-类型转换器
类型转换器
在前面的程序中,表单提交的无论是 int 还是 double 类型的请求参数,用于处理该请求 的处理器方法的形参,
均可直接接收到相应类型的相应数据,而非接收到 String 再手工转换。 那是因为在 SpringMVC 框架中,有默认的类型转换器。
这些默认的类型转换器,可以将 String 类型的数据,自动转换为相应类型的数据
但默认类型转换器并不是可以将用户提交的 String,转换为所有用户需要的类型。此时,就需要自定义类型转换器了。
例如,在 SpringMVC 的默认类型转换器中,没有日期类型的转换器,因为日期的格式太 多。
若要使表单中提交的日期字符串,被处理器方法形参直接接收为 java.util.Date,则需要 自定义类型转换器了。
自定义类型转换器
a)若要定义类型转换器,则需要实现Controller接口。该Controller接口有两个泛型:
第一个为待转换的类型,第二个为目标类型。而该接口的方法convert(),用于完成类型转换
// 创建一个 类型转换器,(String 转成 Date)(需要注册)
public class MyConverter implements Converter<String, Date> {
@Override
public Date convert(String dateStr) {
//这样只能 使一种 日期格式生效(所以需要判断一下 前台传来的 日期 是哪种格式的,然后创建相对应的 SimpleDateFormat)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"");
//sdf = getDateFormat(dateStr);
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
b) 注册类型转换器
<!-- 1.注册类型转换器 -->
<bean id="dataConverter" class="com.springmvc.converters.MyConverter"/> <!-- 2.对于类型转换器,并不是直接使用,而是通过 转换服务Bean 来调用类型转化器 -->
<!-- 注册转换服务Bean -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters" ref="dataConverter"></property>
</bean> <!-- 3.转换服务Bean 是由处理器适配器直接调用的。采用mvc的注解驱动 注册方式,可以将转换服务直接注入给处理器适配器 -->
<mvc:annotation-driven conversion-service="conversionService" />
接收多种日期格式的类型转换器
public class MyConverter implements Converter<String, Date> {
@Override
public Date convert(String dateStr) {
//这样只能 使一种 日期格式生效(所以需要判断一下 前台传来的 日期 是哪种格式的,然后创建相对应的 SimpleDateFormat)
SimpleDateFormat sdf = new SimpleDateFormat();
sdf = getDateFormat(dateStr);
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} //这里使用 判断 日期字符 是否符合格式,是哪种格式
private SimpleDateFormat getDateFormat(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat();
if(Pattern.matches("^\\d{4}-\\d{2}-\\d{2}$", dateStr)) {
sdf = new SimpleDateFormat("yyyy-MM-dd");
} else if(Pattern.matches("^\\d{4}/\\d{2}/\\d{2}$", dateStr)) {
sdf = new SimpleDateFormat("yyyy/MM/dd");
} else if(Pattern.matches("^\\d{4}\\d{2}\\d{2}$", dateStr)) {
sdf = new SimpleDateFormat("yyyyMMdd");
}
return sdf;
} }
类型转换失败后给出提示信息
else {
//如果不满足所有的正则表达式选项 ,则 抛出TypeMismatchException ,
//为什么要在这里抛出,因为 上面的 sdf.parse(dateStr);已经被try catch
throw new TypeMismatchException("",Date.class);
}
//因为出现 类型不匹配异常时,是在Controller 的 方法执行之前就出现了,所以 只能用注解的方式来捕获异常
@ExceptionHandler(TypeMismatchException.class)
public ModelAndView exceptionResolver(HttpServletRequest request,Exception ex) {
ModelAndView mv = new ModelAndView();
//根据异常中的 messsage 存储更加友好错误提示信息
String errorMessageAge = "";
String errorMessageDate = ""; String age = request.getParameter("age");
String birthday = request.getParameter("birthday"); //这样写还是有点问题,当年龄和 生日填写一致时,如都填写1,此时ex.message 包含 1,那么会执行errorMessageAge = "年龄填写错误"
if(ex.getMessage().contains(age)) {
errorMessageAge = "年龄填写错误" ;
} else if(ex.getMessage().contains(birthday)) {
errorMessageDate = "生日填写错误" ;
} //回显 表单数据
mv.addObject("age", age);
mv.addObject("birthday", birthday); mv.addObject("errorMessageAge", errorMessageAge);
mv.addObject("errorMessageDate", errorMessageDate);
//发生异常后,重新返回填写界面
mv.setViewName("/index.jsp"); return mv; }
14.SpringMVC核心技术-类型转换器的更多相关文章
- SpringMVC自定义类型转换器
SpringMVC 自定义类型转换器 我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据 ...
- 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...
- springmvc——自定义类型转换器
一.什么是springmvc类型转换器? 在我们的ssm框架中,前端传递过来的参数都是字符串,在controller层接收参数的时候springmvc能够帮我们将大部分字符串类型的参数自动转换为我们指 ...
- SpringMVC 自定义类型转换器
先准备一个JavaBean(Employee) 一个Handler(SpringMVCTest) 一个converters(EmployeeConverter) 要实现的输入一个字符串转换成一个emp ...
- springmvc的类型转换器converter
这个convter类型转换是器做什么用的? 他是做类型转换的,或者数据格式化处理.可以把数据在送到controller之前做处理.变成你想要的格式或者类型.方便我们更好的使用. 比如说你从前台传过来一 ...
- struts2视频学习笔记 13-14(自定义局部和全局类型转换器(转换Date格式))
课时13 自定义类型转换器 局部(对某个action类) package tutorial; import java.util.Date; public class HelloWorld { priv ...
- SpringMVC类型转换器、属性编辑器
对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器.类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到D ...
- SSM-SpringMVC-28:SpringMVC类型转换之自定义日期类型转换器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 例子很简易,要明白的是思路,话不多说,开讲 上篇博客不是说springmvc默认的日期转换格式是yyyy/M ...
- springmvc中的类型转换器
在使用springmvc时可能使用@RequestParam注解或者@RequestBody注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换 ...
随机推荐
- 5.性能测试工具比较:Jmeter和LR
性能测试工具较多,无法一一进行介绍,感兴趣者可自行搜索资料学习.需要说明的是工具使用方法和原理都大同小异,掌握一个,其他皆可快速上手. 下面就以服务端的性能测试工具为例,对市场上最常用,知名度较高,也 ...
- django安装xadmin中出现的报错汇总
报错一:ModuleNotFoundError: No module named 'django.core.urlresolvers' ModuleNotFoundError: No module n ...
- mfc通过信号量保证线程同步
1.声明一个全局handle,记住在cpp里也声明 extern HANDLE uiHandle; 2.创建信号量 uiHandle = CreateSemaphore(NULL,1,1,NULL); ...
- Druid Monitor监控Java Web和Java SE项目
Druid Monitor 对于数据源,大家已经接触了不少了.比如c3p0.dhcp.proxool等,之后又发现使用tomcat-jdbc可以大大的提高性能.但是针对于我们的高并发的系统来说,总希望 ...
- java工具类学习,系统中用户密码加密总结
现在项目,用户注册登录部分很少有涉及到了,原因:现在热门开发框架都已经在底层帮我们做了一套用户注册,密码加密,登录认证,权限控制,缓存数据等基本功能. 这有利于项目的快速完成,只需要搬砖码畜们专注于业 ...
- 使用mybatis的resultMap进行复杂查询
记录下mybatis的集合查询中碰到的问题 https://jaychang.iteye.com/blog/2357143 MyBatis ofType和javaType区别 https: ...
- 撸一个vue的双向绑定
1.前言 说起双向绑定可能大家都会说:Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更 ...
- 《剑指offer》树专题 (牛客10.25)
考察的知识点主要在于树的数据结构(BST,AVL).遍历方式(前序,中序,后序,层次).遍历算法(DFS,BFS,回溯)以及遍历时借助的数据结构如队列和栈.由于树本身就是一个递归定义的结构,所以在递归 ...
- 华为ENSP命令大全
实验命令___ENSP 一. 生成树STP 注:桥优先级取值越小,则优先级越高,通过配置优先级(开销值cost)可控制根桥选举.当根桥发生故障则会选举新的根桥,当故障恢复根桥重新选举.通过设置端口 ...
- FTP服务器搭建基础工具:Serv-U 14.0.2使用教程
安装教程 1.在本站下载好压缩包,将文件解压,双击运行“ServUSetup官方原版程序.exe”程序,弹出语言选择框,选择“中文(简体)”,点击“确定”开始安装 2.点击“下一步”进行安装 ...