Spring MVC
SpringMVC是基于MVC思想的JAVA WEB实现框架,是Spring家族的一员,它基于前置控制器来接收并分发请求,支持参考验证、请求参数封装、拦截、Restful等功能,是目前较为流行的MVC框架
本系列学习笔记包含如下的课程内容:
- MVC思想
- Hello案例
- 请求和响应处理
- 文件上传和下载处理
- 参数验证
- 请求拦截
- RESTful风格
- 日志
Bean Validation
在web项目开发的过程中,有相当多的请求是带有参数的,而这些参数需要进行各种的校验.
比如:- 非空 -> 该填的有没有填 - 长度 -> 填了的是否超出字段上线. - 格式 -> 邮箱格式,手机格式,身份证等. - 有效区间段 - 唯一性 -> 邮箱格式,手机格式,身份证只能登记一次
典型的误区
初学者可能以为在 页面/前端 使用javascript 校验过了,那么在服务器端就无需校验了.
原因:
浏览器端有非常多的手段/方式来屏蔽/禁用 js 脚本.这样一来,校验的代码/逻辑再多也是白写.
原则:
- 所有来自客户端的请求都是不可信的,服务器端必须做所有的参数校验.
- 浏览器端有条件还是要写校验的逻辑,因为可以减少服务器端接收无效请求的概率.
传统的写法
写起来代码量很大,且效率低下.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16String name = user.getName();
if(name == null || name.trim().equals("") ){
errors.put("name", "name不能为空!");
}else{
if(name.trim().length()>20 ){
errors.put("name", "name长度不能超过20!");
}else{
if(name 不满足某个格式){
errors.put("name", "name格式不正确!");
}else{
if(userService.getByName(name.trim()) != null){
errors.put("name", "用户名已被使用!");
}
}
}
}
- JSR-303 是JAVA EE 6 中的一项子规范,称为Bean Validation,官方参考实现是Hibernate Validator.
- 此实现与Hibernate ORM 没有任何关系, JSR303 用于对Java Bean 的属性值值进行验证。
- Spring MVC 支持 JSR-303,可以在控制器中对表单提交的数据方便地验证。
使用步骤
配置 pom.xml
1 | <!--JSR303--> |
配置 MessageSource
1 |
|
准备校验逻辑
- 彻底理解需求
- 整理请求参数列表
- 整理校验逻辑
准备资源文件
基于 i18n 国际化技术,需要提供多语言环境下的各种资源文件
validationMessages_en.properties
1 | user.name.invalid=Username must be between 6 and 12 |
validationMessages_zh.properties
1 | user.name.invalid=用户名必须在6到12之间 |
定义校验封装类
1 | import org.hibernate.validator.constraints.NotEmpty; |
控制器
1 | "add", method = RequestMethod.POST) (value = |
自定义转换方法getErrorMap:
1 | /** |
页面
1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %> |
FAQ
要基于数据库的查询来校验
思路1:自定义注解类
详见官网文档,写起来较复杂,不推荐新人使用.
思路2:使用代码访问数据库进行校验
写起来简单易读,适合新人使用,比如:
1 | "/register", method = RequestMethod.POST) (value = |
附录
JSR303提供
注解类 | 说明 |
---|---|
@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) | 必须符合指定的正则表达式 |
Hibernate Validator提供
注解类 | 说明 |
---|---|
必须是电子邮箱地址 | |
@Length | 字符串的长度必须在指定的范围内 |
@NotEmpty | 必须非空(有空格就不算Empty) |
@NotBlank | 字符串的必须非空(单纯空格算Blank) |
@Range | 必须在指定范围内 |
Spring MVC提供
注解类 | 说明 |
---|---|
@Valid | 数据需要校验 |
Log4j
在练习期间可以使用
System.out.println()
的方法,但是在实际项目的开发过程中,需要使用日志技术
pom.xml
1 | <dependency> |
log4.properties
1 | #log level |
使用日志
1 | private static final Logger LOGGER = Logger.getLogger(AdminController.class); |