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注解,他们的作用是把请求体中的参数取出来,给方法的参数绑定值. 假如方法的参数是自定义类型,就要用到类型转换 ...
随机推荐
- ubuntu18 bluebooth
QDBusPendingReply: type ManagedObjectList is not registered with QtDBus 19:36:14: The program has un ...
- 无法登录到Windows云服务器怎么办?
当您的云服务器无法远程登录时,我们首先建议您使用VNC方式登录. 是否可以通过控制台远程登录 远程登录失败时,请首先尝试能否通过管理控制台,使用VNC方式登录弹性云服务器. 登录管理控制台. 选择“计 ...
- Spring Security(3):配置与自动配置的介绍及源码分析
基于注解的配置(Java Configuration)从Spring Security 3.2开始就已经支持,本篇基于Spring boot注解的配置进行讲解,如果需要基于XML配置(Security ...
- elasticsearch启动日志报错not enough master nodes discovered during pinging (found [[]], but needed [-1]), pinging again
排查步骤 逻辑上讲是,一个节点去ping master节点,结果却没有得到回应,多次重试依旧失败.应该重点观察: 1.master启动后,IP是否可以有防火墙权限,设置防火墙规则或则直接关闭防火墙 ...
- AnroidStudio gradle版本和android插件的版本依赖
- 通用 spring cloud 微服务模板
说明文档 功能 1. 基于映射数据库一键生成 spring cloud 微服务 2. 通用 Controller ,无需编写代码即可完成基于数据库的服务 3. 动态多条件 CRUD + 分页 使用说明 ...
- Nginx 小入门记录 之 Nginx 配置文件解读(二)
上一小节主要是记录一些环境准备和Nginx的安装,接下来对Nginx基本配置进行记录. 查看配置文件安装记录 可以通过以下Linux命令进行查看: rpm -ql nginx rpm 是liunx的包 ...
- php-fpm的参数优化
查看php-fpm的内存占用 1.查看php-fpm的进程个数 ps -ef |grep "php-fpm"|grep "pool"|wc -l 2.查看每个p ...
- mybatis+mysql insert添加数据后返回数据主键id
1.根据useGeneratedKeys获取返回值,部分数据库不支持 修改mybatis xml <insert id="insertUser" useGeneratedKe ...
- table固定头部,tbody内容滚动
直觉的感受是修改thead与tbody,尝试了以下几种方法,但均告失败. 1. 将tbody设置为块状元素,然后设置表格的高度与溢出: 1. 将thead设置为绝对定位,然后设置表格的高度与溢出: 1 ...