Spring Boot 2精髓 - (3) MVC

spring boot

MVC 框架会处理如下技术需求 :

  • HTTP URL 映射到 Controller某个方法
  • HTTP 参数映射到 Controller 方法的参数上,比如参数映射到某个 Java 对象,或者上 传附件映射到某个 File对象上:
  • 参数的校验;
  • MVC 错误处理
  • MVC 中如何调用视图
  • MVC 中如何序列化对象成 JSON
  • 拦截器等高级定制

集成MVC框架

引入依赖

1
2
3
4
<depeηdency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>

Beetl 模板

1
2
3
4
5
<dependency>
<groupid>com.ibeetl</groupid>
<artifactid>beetl-framework-starter</artifactid>
<version>1.1.15.RELEASE</version>
</dependency>

Web 应用目录结构

  • resources/templates 模板文件
  • resources/static 静态资源文件,如 JS、 css、图片

视图名自动在 templates 目录下找到对 应的模板名称,模板中使用的静态资源将在 static 目录下查找

Java 包名结构

  • Controller 一一 此包下包含了 MVC 的 Controller
  • Service 一一 此包下有业务处理代码
  • entity 一一 包含了业务实体
  • conf 一一 包含了一些配置类,比如用于配置数据源的 DataSourceConfig

Controller

类上声明@Controller, 标注这是一个 Controller

@RequestMapping 映射 HTTP 请求到特定的方法处理类.
@RequestMapping 既可以作用在方法上 , 也可以作用在类上

返回的是 JSON 字符串,如果想直接返回内容而不是视图名 ,则需要在方 法上使用@ResponseBody

URL映射到万法

@RequestMapping来映射 URL

RequestMapping 属性:

  • value,请求的 URL 的路径,支持 URL模板、正则表达式
    • 注解PathVariable作用在方法参数上,用来表示参数的值来自于 URL 路径
    • 有通配符的低于没有通配符的, 比如/user/add.json 比/user/*.json优先匹配
    • 有“*”通配符的低于有““通配符的
    • 使用${}来获得系统的配置或者环境变量
  • method, HTTP 请求方法,有 GET、 POST、 PUT 等
    • GET,用来获取 URL 对应的内容
    • POST,用来向服务器提交信息, 语义上新增操作
    • HEAD,同 GET,但不返回消息体,通常用于返回 URL 对应的元信息,如过期时间等
    • PUT, 同POST,用来向服务器提交信息,但语义上更新操作
    • DELETE,删除对应的资源信息
    • PATCH方法, 类似PUT方法,表示信息的局部更新
      简化的@RequestMapping
    • @GetMapping
    • @PostMapping
    • @PutMapping
    • @DeleteMapping
    • @PatchMapping
  • consumes,允许的媒体类型(Media Types),如 consumes="application/ison", 对应于请求的HTTP的 Content-Type
  • produces,相应的媒体类型,如 produces="application/json", 对应于 HTTP 的 Accept宇段
  • params ,请求的参数 ,如 params="action=update"

方法参数

Controller方法可以接受多种类型参数

  • @PathVariable,可以将URL中的值映射到方法参数中
  • Model, Spring 中通用的 MVC 模型,也可以使用 Map 和 ModelMap 作为渲染视图的模型
  • ModelAndView,包含了模型和视图路径的对象
  • JavaBean,将 HTTP 参数映射到 JavaBean 对象
  • MultipartFile,用于处理文件上传
  • @ModelAttribute,使用该注解的变量将作为 Model的一个属性
  • WebRequest 或者 NativeWebRequest,类似 Servlet Request,但做了一定封装
  • java.io.InputStream 和 java.io.Reader,用来获取 Servlet API 中的 lnputStream/Reader
  • java.io.OutputStream/java.io.Writer,用来获取 Servlet API 中的 OutputStream/Writer
  • HttpMethod, 枚举类型 , 对应于 HTTP Method,如 POST、 GET
  • @MatrixVariable,矩阵变量
  • @RequestParam, 对应于 HTTP请求的参数,自动转化为参数对应的类型
  • @RequestHeader,对应于 HTTP请求头参数,自动转化为对应的类型
  • @RequestBody, 自动将请求内容转为指定的对象 , 默认使用 HtψMessageConverters 来转化
  • @RequestPart,用于文件上传,对应于 HTTP 协议的 multipart/form-data
  • @SessionAttribute, 该方法标注的变量来自于 Session 的属性
  • @RequestAttribute,该标注的变量来自于 request 的属性
  • @InitBinder,用在方法上,说明这个方法会注册多个转 化 器,用来个性化地将 HTTP 请求参数转化成对应的 Java对象,如转化为日期类型、浮点类型、JavaBean等,当然,也可以实现 WebBindinglnitializer接口来用于 SpringBoot应用所需要的 dataBinder
  • BindingResult和 Errors, 用来处理绑定过程中的错误

验证

JSR-303

注解用来验证 Bean 的属性:

  • 空检查
    • @Null, 验证对象是否为空
    • @NotNull, 验证对象不为空
    • @NotBlank, 验证字符串不为空或者不是空字符串, 比如””和””都会验证失败
    • @NotEmpty, 验证对象不为 null,或者集合不为空
  • 长度检查
    • @Size(min=, max=),验证对象长度,可支持字符串、集合
    • @Length, 字符串大小
  • 数值检测
    • @Min,验证数字是否大于等于指定的值
    • @Max,验证数字是否小于等于指定的值
    • @Digits,验证数字是否符合指定格式,如@Digits(integer=9,fraction=2)
    • @Range,验证数字是否在指定的范围内,如@Range(min=l, max=lOOO)
  • 其他
    • @Email, 验证是否为邮件格式,为 null 则不做校验
    • @Pattern, 验证 String对象是否符合正则表达式的规则

group, 只有 group匹配的时候,校验注解才能生效

@Validated

参数使用@Validated注解,将触发 Spring的校验, 井将验证结果存放到 BindingResult对象中

BindingResult 包含了验证结果,提供了如下方法 :

  • hasErrors,判断验证是否通过 :
  • getAllErrors,得到所有的错误信息,通常返回的是 FieldError列表

自定义校验

@Constraint 注解声明用什么类来实现验证

验证注解必须要提供如下信息 :

  • message, 用于创建错误信息,支持表达式,如“错误, 不能超过(max) 小时”
  • groups,验证规则分组, 比如新增和修改的验证规则不一样,分为两个组,验证注解必须提供
  • payload, 定义了验证 的有效负荷

WebMvcConfigurer

拦截器

addlnterceptors 设置多个拦截器

跨域访问

addCorsMappings

格式化

addFormatters

注册 Controller

addViewController

ddRedirectViewController

视图技术

Freemarker

Freemarker 会自动添加后缀 负l 来寻找匹配 的 userlnfo.ftl 模板

Beetl

语法和使用习惯参考了 JS

Jackson

JSON的序列化和反序列化

Redirect

重定向请求

foward

用来在 Controller执行完毕后,再执行另外一个 Controller 的方法

通用错误处理

Controller中抛出的异常默认交给了/error来处理,应用程序可以将/error映射 到一个特定的 Controller 中处理来代替 Spring Boot 的默认实现 , 应用可 以继承 AbstractEirnr°Controller 来统一处理系统的各种异常

AbstractErrorCon位oiler 提供 了多个方法可以从 request 中获取错误信息:

  • timestamp, 错误发生的时间
  • status, 对应于 HTTP Status, 如 404
  • error, 错误消息, 如 BadRequest、 NotFound
  • message, 详细错误信息
  • exception, 如果应用抛出有异常,exception是字符串,代表异常的类名
  • path,请求的 URI
  • errors, @Validated 校验错误的时候 , 校验结果信息放到这里

@Service 和@Transactional

Service中处理 业务逻辑, 定义一个业务的接口

@Transanhl来让 Service参与事务管理

事务上下文 : 对于 Service 调用,如果处于同一个事务上下文,那么对数据库的操作会在一个事务中。事务上下文的开启是从 Contralle「中调用坦问 ice 方法的时候自动开启的, 并在调用此方法后自动结束从而提交事务,或者根据抛出的 RuntimeException 来自动回滚,调用过程中调用的其他 Service 方法都会处于这个事 务上下文中。
可以在事务上下文中再次开启一个新的事务上下文,这时候通过注解@ Transactiona1 (propagation = Propagation.REOUIRES_NEW)完成,比如在 AuditService 中,审计服务无 论业务调用是否成功,都必须把审计信息存储到数据库中,因此 AuditService 可以配置 为开启新的事务上下文 。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :