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注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换 ...
随机推荐
- 07Flutter ListView基础列表组件、水平列表组件、图标组件
ListView: ListView:参数 scrollDirection:Axis.horizontal:水平列表.Axis.vertical垂直列表 padding:内边距 ...
- linux简单命令3---帮助命令
1:帮助命令:man 命令: 2:这个帮助用的比较多(还是中文):命令 --help 3:shell帮助 4:详细命令(比man更详细)帮助,用的少,比较麻烦:info
- java.lang.IllegalStateException: No primary or default constructor found for class java.time.LocalDate
转载自:https://blog.csdn.net/Coder_Arley/article/details/81910705 springboot中报错如下: springmvc也可以使用类似处理方法 ...
- Nginx sticky模块实现session粘滞
一:下载,解压nginx sticky模块. 1 2 3 # cd /usr/local/src # wget http://nginx-sticky-module.googlecode.com/fi ...
- Flutter 状态管理 flutter_Provide
项目的商品类别页面将大量的出现类和类中间的状态变化,这就需要状态管理.现在Flutter的状态管理方案很多,redux.bloc.state.Provide. Scoped Model : 最早的状态 ...
- cocos2dx图片加密解密(npk方式)
话不多说,直接开始: 准备的工具: 链接:https://pan.baidu.com/s/1Om4kBNWcG2jL_RTsHqqzpQ 提取码:bv7i npkCreate.exe是加密图片的工具, ...
- Vulnhub-XXE靶机学习
------------恢复内容开始------------ 前两天在微信公众号上看见了这个XXE靶场,就想试一试,虽然网上关于这个的文章已经写了太多太多了,但还是要写出来划划水,233333333, ...
- 【VS开发】MFC中调用C函数模块的解决方案
[VS开发]MFC中调用C函数模块的解决方案 标签(空格分隔): [VS开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:最近调试基于MFC的程序 ...
- 最新 完美世界java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.完美世界等10家互联网公司的校招Offer,因为某些自身原因最终选择了完美世界.6.7月主要是做系统复习.项目复盘.Leet ...
- 最新 新华网java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.新华网等10家互联网公司的校招Offer,因为某些自身原因最终选择了新华网.6.7月主要是做系统复习.项目复盘.LeetCo ...