ch04-Web开发框架 Web MVC
Spring MVC👍
- model-view-controller
- 模型(model):存储内容,指数据、领域类
- 视图(view):显示内容
- 控制器(controller):处理用户输入
领域类
ModelAttribute
-
@ModelAttribute(name = <key>)
1
2
3
4
5
6
7
- 注解返回值为`value`
- 方法被Spring自动调用
### 方法级别
@ModelAttribute(“attributeName”)
public SomeObject methodName() {
// 创建并返回 SomeObject 对象
}
1 |
|
@GetMapping(“/path”)
public String methodName(@ModelAttribute(“attributeName”) SomeObject object) {
// 处理请求
}
1 |
|
@GetMapping(“/path”)
public String methodName(@ModelAttribute SomeObject object) {
// 处理请求
}
1 |
|
Taco.java
- @NotNull
@Size(min=5, message=“Name must be at least 5 characters long”):表单规范not null
1 | package tacos; |
- @data:等效于code->generator->get/set
- 需要安装lombok插件
枚举类Ingredient.java
1 | package tacos; |
控制器的实现DesignTacoController
-
@Slf4j:lombok的注解,log对象创建的简化
-
@RequestMapping(“/design”) “ :请求的映射,控制器可以处理以design为前缀的url,如design/a
-
@Controller:@Component类似,请求spring实例化该类
-
@GetMapping:处理浏览器发出的get请求
- return design:逻辑视图名,自动匹配真正的视图名,在resource下templates找一个叫design.html的视图,然后渲染视图,需要添加依赖
1 | <dependency> |
- Spring Boot的自动配置功能会发现thymeleaf在类路径中,因此会为Spring MVC自动创建支撑thymeleaf视图的Bean
- thymeleaf与Servlet request属性协作(与spring model解耦)
- @ModelAttribute(name = “tacoOrder”):定义了一个key-value,key为name,value为return,会被在get方法被调用前自动调用
- @SessionAttributes(“tacoOrder”):指定tacoorder是session类型的对象:一次会话,多次请求,希望对象在会话过程中一直存在
1 | package tacos.web; |
design.html
1 | <!-- tag::all[] --> |
OrderController.java
- @RequestMapping(“/orders”):处理orders前缀
- @GetMapping(“/current”):处理current后缀
- /orders/current
- @Slf4j:等效生成下图,代码中可以对日志进行处理
- log.info(“Order submitted: {}”, order); 可以打印log信息
1 | package tacos.web; |
处理表单提交
- Converter
- ✓ 将String转换成Ingredient
- redirect重定向
toco的转化器converter
- key为id,value为ingredient
- 用来做参数的转换
- 只需要将这个类实例化在上下文中,spring会在合适的时候对对象进行这样的转换
1 | package tacos.web; |
路径参数@PathVariable
请求参数(查询参数)@RequestParam
表单参数,默认,对应model,可以使用@Valid校验
json请求体,@RequestBody
Spring MVC获取参数的几种方式👍
- 表单 (form)参数,转成model (成员类型可能会用到Converter进行类型转换),可以使用@Valid校验
- 路径参数,@PathVariable,例子:/book/{id}
- 请求参数(查询参数),@RequestParam,例子: /challenge?mode=2&id=13412431234
- json请求体,@RequestBody,会用到HttpMessageConverter消息转换器,Rest API
- HttpMessageConverter:json与java对象互转
Spring MVC的请求处理过程👍
- Web容器开发的基本单元是Servlet,请求先到servlet。
- mapping根据url把请求转到controller,其中spring框架会做参数解析。
- controller接受请求,数据解析,拿到数据后转到业务层
- 业务层:处理,数据持久化,访问数据库层
- 数据库层:数据库访问层Dao,分关系型数据库和非关系型数据库,返回控制器层
- 控制器层返回数据到DispatcherServlt,DispatcherServlt拿到数据和逻辑视图名
- 逻辑视图名与特定的页面渲染的第三方库,渲染视图,返回浏览器端
- DispatcherServlt:spring自己实现的,用途就是截获request
Spring MVC的请求映射注解👍
@RequestMapping
@GetMapping :获取
@PostMapping :提交数据、创建新资源
@PutMapping :更新资源
@DeleteMapping :删除资源
@PatchMapping
重定向👍
控制器处理完成后可以返回逻辑视图名,也可以重定向到其他url
- http状态码:302
- 控制器
return redirect:
Servlet规范
- 实现
- tomcat
- jetty
- 最小开发单元
- Web容器的实现规范,与Spring无关
- Web容器/服务器,里面放Servlet对象
Servlet对象
Request(可以带很多property属性,key-value数据结构)
Response
校验表单输入
- JavaBean Validation API
- spring-boot-starter-validation(有Hibernate针对 JavaBean Validation API的实现)
- 领域类上添加校验规则
- 控制器中声明校验:@Valid
- 修改表单视图以展现校验错误
1 | <!-- tag::validationStarter[] -- |
更多视图模板库
Thymeleaf
FreeMarker
Groovy Templates
JSP
Mustache
使用视图控制器(View Controller)
- 如果一个控制器非常简单,不需要填充模型或处理输入
- 接口WebMvcConfigurer,用于配置
- 简单的从请求URL到视图 ✓ registry.addViewController(“/”).setViewName(“home”); //GET请求
- 接口WebMvcConfigurer也可实现到启动类中