SpringBoot 第三篇 MVC架构
2019.02.25 SpringBoot 集成 MVC 框架
文章目录
SpringBoot 集成MVC框架
- 引入依赖。
Spring-boot-starter-web 自动配置MVC框架。
可以添加 Beetl、thymeleaf、freeMarker、jsp、Groovy、velocity、mustache等。 - web应用目录结构。
resources/templates目录下存放Web的模板。
resources/static 目录下模板文件使用的静态资源文件。 - 包结构。
controller、service、entity、conf、until。
使用@Controller 。
1. 类上 声明 @Controller ,便能处理用户的 HTTP 请求。
注意:
@ResponseBody 注解直接将返回的对象输出给客户端。
需要注意的是:
- 返回的对象是 String类型的话,结果仍是 String类型。
- 返回的对象是其他类型的话,会使用 Jackson 序列化对象为 Json对象。
2.项目中报错
There was an unexpected err (type=NOT Acceptable,status=406).
Could not find acceptable representation
上述报错的原因是:返回类型与期望类型不一致。
在默认建立的SpringBoot项目中,请求资源的URL需要注意
- 期望返回的是JSON,请求资源的后缀就要是 *.json;
- 期望返回的是HTML,请求资源的后缀就要是 *.html。
客户端请求服务,服务响应客户端。(Controller类)
- @RequestMapping
- value / path :请求的路径,支持简单的表达式、正则等。
@PathVariable 匹配路径上的参数。经常与 path 使用在一起。
Ant 通配符: * 任意符 ** 任意路径 ? 单个字符。
优先匹配:无通配符的 > ?> * > **
- method. get / post 等。
- consumes 对应请求HTTP头,Content-Type “application/json”。
- produces 对应请求HTTP头,设置浏览器可以接收的内容。
- params 与 header ,从请求参数或者HTTP头中提取值来进一步确定调用方法。
- 方法参数
- @PathVariable 从URL中获取参数映射到方法参数。
- Map 结构的 model & modelandview
model 的内容
model 用于参数,MVC框架调用方法前,直接自动自动创建,并可以携带者内容返回视图。
addAttribute(指定名称,Java变量);
addAttribute(Java变量); 默认名称 Java 变量的首字母小写。
mergeAttribute(); 可添加多个,遇到重复的时候将忽略。
addAllAttribute(); 可添加多个,遇到重复的时候将覆盖。
modelandview 的内容
addObject(); 添加变量。
setViewName(); 设置视图的名称。
- JavaBean 接收 Http 参数。
@RequestParam 对请求URL中参数的设置
value /name: 对应参数的名称。
required: true / false 。 一旦设置为 true ,但请求URL中没有则报 400
defaultVlaue:指定默认的字符串。类型是字符串。 - @RequestBody 请求的是 Json 数据。
- MultipartFile文件上传 以及 MultipartFile[] 多文件上传
- @ModelAttribute 作用在Controller方法上,此方法会先被调用,并将结果作为Model属性,之后再调用Controller方法。
- @InitBinder 用在方法上,会注册多个转化器。
验证框架
JSR-303、Bean 等可以继承。默认使用的是 hibernate-validator
WebMvcConfigurer
WebMvcConfigurer 全局定制SpringBoot的特性。
拦截器、跨域访问设置、格式化、视图映射 等。
拦截器 addInterceptors
- preHandle :调用方法之前。
- postHandle:调用方法之后,页面渲染前。
- afterCompletion:页面渲染完成调用。
跨域访问设置
什么是跨域访问 ?
A页面使用Ajax获得B页面中的内容,显示在A页面中,如果A页面与B页面不是同源的(域名、协议、端口号均相同的称为同源。
),发起跨域请求时,浏览器会对请求域返回的响应信息检查HTTP头,如果Access-Control-Allow-Origin包含自身域则允许访问。如果Access-Control-Allow-Origin返回no,则是跨域访问会报错。
格式化 addFormatters
注册Controller ,addViewControllers
没有必要为一个URL指定一个Controller方法。
视图技术(集成的视图引擎)
- FreeMarker 自动添加视图后缀 ftl ;
- Beetl 看到视图后缀 btl ;
- Jackson 重定向返回前端的这个 ObjectMapper。
ObjectMapper 类由 jsckson 提供,可以自定义。