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注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换 ...
随机推荐
- linux挂载iscsi出现的问题
挂载的时候我们可以使用永久挂载但是这里我们就需要注意了正常的永久挂载可能会导致系统起不来因为这里我们使用的是服务端的硬盘为网络设备而开机的读取中 会先读取/etc/fstab下的内容 之后再读取网络的 ...
- 目标检测 - TridentNet
转载: https://zhuanlan.zhihu.com/p/54334986 http://haha-strong.com/2019/07/25/20190725-TridentNet/ 开源代 ...
- shell练习题集合
1. 获取ip或MAC地址(方法不唯一) [root@cicd ~]# ip a| grep 'inet' | awk -F " +" '{print $3}'| awk -F & ...
- Cloudera Manager 概念
cloudera公司发布的CDH集群,使用Cloudera Manager来管理整个集群,使用过程中主要涉及到几个关键概念:cluster.service.role.host.直接上图,直观理解几个概 ...
- Jenkins之自动发送git变更到微信
当我们通过Jenkins构建job的时候,是可以获取到git Change Log 的信息, 即本次上线修改了什么功能,我们将这个信息发送到微信群相关人员可直接获取到上线变更信息, 这样就不需要人为的 ...
- 看看可爱c#中的delegate(委托)和event(事件)用法好不好
一.开篇忏悔 对自己最拿手的编程语言C#,我想对你说声对不起,因为我到现在为止才明白c#中的delegate和event是怎么用的,惭愧那.好了,那今天就趁月黑风高的夜晚简单来谈谈delegate和e ...
- Vue学习笔记(二)
1.引入组件需要注意的事项说明和步骤: 第一步,引入对应的组件: import Hello2 from './components/Hello2' 第二步: 需要注册该组件才可以使用 <scri ...
- CSS - clearfix清除浮动
首先,我们来解释一下为什么要使用 clearfix(清除浮动). 通常我们在写html+css的时候,如果一个父级元素内部的子元素是浮动的(float),那么常会发生父元素不能被子元素正常撑开的情况, ...
- 图像欧拉数计算 matlab实现
EUL = C - H 其中EUL表示欧拉数 C表示对象数 H表示孔洞数 欧拉数常用来识别数字: 识别数字 8 ,8 的欧拉数为 -1 ,不同于0,1,2,3,4,5,6,7,9 close all ...
- 集群架构01.Nginx初步安装配置
1.切换163yum 源,环境介绍 [root@moban ~]# cat /etc/redhat-release CentOS release 6.5 (Final) mv CentOS-Base. ...