springMVC-7-数据处理转换
我们为什么要对数据进行处理?
需求:在上个crud中我们如果需要每次修改的时候都要把时间也记录下来
解决:在jsp中新增一个input,在employee中新增一个Data字段
问题:input输出来的数据是String,而在employee中的字段是Data数据
这个时候就需要:
- 数据转换
- 数据格式化
- 数据校验
数据转换
数据校验
自定义类型处理器
jsp中发送数据
<form action="/employee" method="post">
<%--输入一个这样的数据last-name-email-gender-department-department.id:
我们就能获取到实例化的employee--%>
Employee:<input type="text" name="employee">
<input type="submit" value="提交">
</form>
control中接收数据
@RequestMapping(value = "/employee",method = RequestMethod.POST)
public String add(@RequestParam("employee") Employee employee){
System.out.println(employee);
return "redirect:/input";
}
可以知道中间需要一个String转换为employee的转换器
/*
* 1、需要添加注解组件
* 2、需要在springmvc配置文件中配置
* */
@Component
public class EmployeeConverter implements Converter<String, Employee> {
@Override
public Employee convert(String source) {
//last-name-email-gender-department-department.id
if(source!=null){
String[] values = source.split("-");
if (values!=null&&values.length == 4){
String lastName = values[0];
String email = values[1];
Integer gender = Integer.parseInt(values[2]);
Department department = new Department();
department.setDepartmentId(Integer.parseInt(values[3]));
Employee employee = new Employee(null, lastName, email, gender, department);
System.out.println(source+"--> converter-->"+employee);
return employee;
}
}
return null;
}
}
这个转换器需要配置到springmvc配置文件的注解驱动里面
<!--此处注入conversion-service属性-->
<mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
<!--配置conversionService:
把这个配置之后还需要把这个注入到注解驱动的一个属性-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--把自定义的转换器注入到converter属性中来-->
<property name="converters" ref="employeeConverter"/>
</bean>
mvc:annotation-driven学习
会自动注册:
RequestMappingHandlerMapping 、
RequestMappingHandlerAdapter
ExceptionHandlerExceptionResolver 三个bean。
还可以
- 支持使用 ConversionService 实例对表单参数进行类型转换
- 支持使用 @NumberFormat、@DateTimeFormat 注解完成数据类型的格式化
- 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
- 支持使用 @RequestBody 和 @ResponseBody 注解
@DateTimeFormat使用
在spring-mvc配置文件配置了mvc:annotation-driven之后
在对应的pojo中
//直接就实现了string到Date
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthDate;
@NumberFormat使用
同上
@NumberFormat(pattern = "#,###,###.#")
private Float salary;
@InitBinder实现手动映射数据
由 @InitBinder 标识的方法,可以对 WebDataBinder 对 象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定
@InitBinder方法不能有返回值,它必须声明为void。
@InitBinder方法的参数通常是是 WebDataBinde
比如下面这个方法就可以使映射过来的lastName数据被忽略
@InitBinder
public void initBinder(WebDataBinder dataBinder){
dataBinder.setDisallowedFields("name");
}
数据格式化
数据校验
1、如何校验?
JSR表示Java Specification Requests,Java 规范提案。JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation。用于验证bean属性注入值类型,格式等有效性。
添加依赖
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
constraint
@Null | 被注释的元素必须为null |
---|---|
@NotNull | 被注释的元素不能为null |
@AssertTrue | 被注释的元素必须为true |
@AssertFalse | 被注释的元素必须为false |
@Min(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@Max(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@DecimalMin(value) | 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 |
@DecimalMax(value) | 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 |
@Size(max,min) | 被注释的元素的大小必须在指定的范围内。 |
@Digits(integer,fraction) | 被注释的元素必须是一个数字,其值必须在可接受的范围内 |
@Past | 被注释的元素必须是一个过去的日期 |
@Future | 被注释的元素必须是一个将来的日期 |
@Pattern(value) | 被注释的元素必须符合指定的正则表达 |
被注释的元素必须是电子邮件地址 | |
@NotEmpty | 被注释的字符串必须非空 |
Hibernate Validator 附加的 constraint
@Length | 被注释的字符串的大小必须在指定的范围内 |
---|---|
@Range | 被注释的元素必须在合适的范围内 |
注意点:
- 数值检查建议使用在Stirng,Integer类型,不要使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null 。
使用@Valid
用于修饰@Component
组件类,结合上面的属性级别constraint注解,给类属性字段加一层数据校验。一般搭配@ConfigurationProperties类级别注解使用,校验外部配置值的有效性。
- @Validated所在包路径:org.springframework.validation.annotation.Validated
2、页面出错转到那个页面?
3、错误消息如何显示?如何国际化?
springMVC-7-数据处理转换的更多相关文章
- 160912、工具类:spring+springmvc自定义编码转换
一.自定义的类(注意其中的属性,web.xml中的配置就是根据这个类的) import org.springframework.web.filter.OncePerRequestFilter; imp ...
- springMvc的日期转换之二
方式一:使用@InitBinder注解实现日期转换 前台页面: 后台打印: 方式二:处理多种日期格式类型之间的转换 采用方式:由于binder.registerCustomEditor(Date.cl ...
- springmvc 请求和响应的json和Object的转换
就是两个注解的使用@RequestBody和@ResponseBody注解的使用,然后springmvc解析进行转换然后注入 例子: @RequestMapping("/...") ...
- springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换
需求 php调用java接口时,因为php那边的属性都是下划线风格,java这边的属性都是驼峰的风格.配置springmvc的json转换,在requestBody的时候(调用对象的set 方法)将j ...
- springMVC的一些工具类
springMVC的一些工具类,主要有转换器,读取器 读取文件: package cn.edu.hbcf.common.springmvc; import java.util.HashMap; imp ...
- Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建(转)
这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 如果还没有搭建好环境( ...
- Eclipse+Spring+SpringMVC+Maven+Mybatis+MySQL+Tomcat项目搭建
---恢复内容开始--- 1. 建表语句及插入数据 CREATE TABLE `book_user` ( user_id INT(11) NOT NULL AUTO_INCREMENT, user_n ...
- SpringMVC知识一锅烩
Spring简介 SpringMVC和Struts2一样都是属于表现层的框架,将前段发出的请求分发给对应的后端处理器即Controller 处理流程 用户请求被前端控制前拦截,然后根据对应的拦截路径去 ...
- SpringMVC从认识到细化了解
目录 SpringMVC的介绍 介绍: 执行流程 与strut2的对比 基本运行环境搭建 基础示例 控制器的编写 控制器创建方式: 请求映射问题: 获取请求提交的参数 通过域对象(request,re ...
- eclipse下SpringMVC+Maven+Mybatis+MySQL项目搭建
这篇文章主要讲解使用eclipse对Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建过程,包括里面步骤和里面的配置文件如何配置等等都会详细说明. 接下来马上进入项目搭建 ...
随机推荐
- 像Swing这种已经不太用的技术,大学还在教,到底要不要学?
一直以来,写日常问题.前沿技术和架构思考类的文章比较多,今天为什么突然来说说Swing这个陈年老技术呢? 因为在CSDN上看到了这样的一篇文章: 可以看到作者对于学Swing还是挺愤怒的,不过确实Sw ...
- 【NX二次开发】Block UI 属性类型
Block UI 属性类型的读写总结: 帮助文件 NXOpen::BlockStyler::UIBlock::GetProperties() String类型 //设置值 this->块ID- ...
- Serverless Web Function 实践教程(一):快速部署 Node.js Web 服务
作为目前广受欢迎的 Web 服务开发语言,Node.js 提供了众多支持 HTTP 场景的相关功能,可以说是为 Web 构建而生.因此,基于 Node.js,也诞生了多种 Web 服务框架,它们对 N ...
- WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格.数量.型号和优惠券等.在客户挑选商品的过程中,这些交易数据逐渐形成:待客户提交订单时,交易数据被商家接收,形成双方认可的 ...
- js笔记9
1.面向对象 js一开始就是写网页特效,面向过程的,作者发现这样写不好,代码重复利用率太高,计算机内存消耗太大,网页性能很差,所以作者就受到了java和c语言的影响,往面向对象靠齐.js天生有一个Ob ...
- C、C++、python、Java、php、C#六种编程语言大PK 哪个好学习?
作为程序员吃饭的工具,编程语言之间也形成了某种鄙视链,各大论坛里弥漫着剑拔弩张的气氛,众口难调.也难怪有很多初学者会有疑惑,为什么会有这么多编程语言,我到底应该学什么语言? 其实各种语言都各有千秋.接 ...
- C++实现二分法详解
二分法是在一个排好序的序列(数组,链表等)中,不断收缩区间来进行目标值查找的一种算法,下面我们就来探究二分法使用的一些细节,以及常用的场景: 寻找一个数: 寻找左侧边界: 寻找右侧边界. 一.二分法的 ...
- 柔性数组(Redis源码学习)
柔性数组(Redis源码学习) 1. 问题背景 在阅读Redis源码中的字符串有如下结构,在sizeof(struct sdshdr)得到结果为8,在后续内存申请和计算中也用到.其实在工作中有遇到过这 ...
- POJ 3026 Borg Maze 广搜(BFS)+最小生成树
题意:从S出发,去抓每一个A,求总路径最短长度.在S点和A点人可以分身成2人,不过一次只能让一个人走. 思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板. 一次性A了.不过觉得在判断 ...
- CentOS7 安装搭建docker环境
一.Docker简介 Docker 版本 :版本分为:社区版CE 企业版EE 社区版分为stable和edge俩种发行方式: stable版本:是季度版发行(三月一更新) edge版本:是月度版发行 ...