SpringMVC自动配置概览
SpringBoot主要借助自动装配完成了很多简化的开发步骤。下面介绍SpingBoot简化了哪些SpringMVC开发
- 视图解析器
- 静态资源的访问
- 支持HttoMessageConverter消息转换报文
- 静态index.html支持
- 自定义的favicon图标
等
静态资源的访问
静态资源目录
类路径就是指我们的resources目录
类路径下:
/static
(or /public
or /resources
or /META-INF/resources
都可以直接访问
static | 一般放静态资源(图片)(欢迎页面)等 |
---|---|
public | |
resources | |
templates | 放置html页面针对thymeleaf模板引擎 |
原理
静态资源映射/**
请求进来先去匹配控制器(Controller中的请求映射)没有找到再去查找对应的 中的静态资源。
设置静态资源映射路径
#表示所有请求通过/res/** 进行匹配静态资源
#为静态资源加上前缀才可以访问
spring:
mvc:
static-path-pattern: /res/**
#表示指定一个文件夹作为静态资源目录
resources:
static-locations: [classpath:/haha/]
欢迎页
再静态资源目录下编写一个index页面。默认页就会自己去查找该页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>SpringBoot的index页面,默认是欢迎页</h1>
</body>
</html>
通过结果看到没有去指定准确页面。默认的欢迎页显示的是index页面
favicon.ion图标
直接将该图标放入SpringBoot的静态资源目录可以进行自动配置访问
注意index页面和favicon图标使用的时候不能结合一起使用
#表示所有请求通过/res/** 进行匹配静态资源
#为静态资源加上前缀才可以访问
spring:
mvc:
static-path-pattern: /res/**
四种请求方式的发送
我们再学习RestFul风格的时候知道了
可以进行相同的请求,不同的请求方式。从而实现不同的功能
浏览器可以直接发送get,post但是不能发送put和delete
此时需要借助代码来完成匹配PUT和DELETE的请求
操作
开启页面表单的rest功能
spring:
mvc:
hiddenmethod:
filter:
enabled: true #开启页面表单的Rest功能
页面中的添加隐藏指
<form action="/method" method="get" >
<button type="submit">get提交</button>
</form>
<form action="/method" method="post" >
<button type="submit">post提交</button>
</form>
<form action="/method" method="post" >
<input type="hidden" name="_method" value="PUT" >
<button type="submit">put提交</button>
</form>
<form action="/method" method="post" >
<input type="hidden" name="_method" value="DELETE" >
<button type="submit">delete提交</button>
</form>
测试
@ResponseBody
@GetMapping("/method")
public String method(){
return "get";
}
@ResponseBody
@PostMapping("/method")
public String postmethod(){
return "post";
}
@ResponseBody
@PutMapping("/method")
public String putmethod(){
return "put";
}
@ResponseBody
@DeleteMapping("/method")
public String deletemethod(){
return "delete";
}
Rest原理(表单提交要使用REST的时候)
-
表单提交会带上**_method=PUT**
-
请求过来被HiddenHttpMethodFilter拦截
-
- 请求是否正常,并且是POST
-
-
- 获取到**_method**的值。
- 兼容以下请求;PUT.DELETE.PATCH
-
-
-
- 原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值。
- 过滤器链放行的时候用wrapper。以后的方法调用getMethod是调用****requesWrapper的
-
请求/响应处理
基本注解
SpringBoot是基于Spring进行操作的,很多MVC的注解SpringBoot也是同样可以使用的。下面来一起复习一遍吧
@PathVariable()
@RequestMapping("/path/{id}")
// 使用该注解对应restful风格路径
public String pathVariable(@PathVariable("id") int id){
return "";
}
@RequestHeader
@RequestMapping("/getHeader")
//获取指定的请求头值
public String requestHeader(@RequestHeader("") String headervalue,
// 获取所有的请求头值放入header集合中
@RequestHeader Map<String,String> header){
return "";
}
@RequestParam()
@RequestMapping("/getPrame")
// 获取指定的请求值
public String requestParam(@RequestParam("") String paramvalue,
// 获取所有的请求值放入param集合中
@RequestParam Map<String,String> param){
return "";
}
@cookievalue
@RequestMapping("/getcookie")
// 获取指定的cookie值 返回值可以是String或cookie类型
public String requestCookie( @CookieValue("_ga") String _ga,
@CookieValue("_ga") Cookie cookie){
return "";
}
@RequestBody()
@PostMapping("/save")
public Map postMethod(@RequestBody String content){
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}
将所有的请求组合成一个字符进行输出
@RequestAttribute()
获取请求域中的值
请求域是多个请求通过转发,还在一个请求作用域中的共存数据
与请求参数是不同的概念
参数使用
SpringBoot根据Spring进行开发的,所以SpringMVC的参数SpringBoot也是同样可以使用
ServletAPI
我们可以使用ServletAPI作为参数进行获取请求中的值
复杂参数
Map
Model(map、model里面的数据会被放在request的请求域
RedirectAttributes( 重定向携带数据)
JavaBean参数
会进行自动的匹配,将请求中的值传递给javaBean
响应处理
@RequestBody
可以将响应结果不经过视图解析器,返回一个json处理
底层存在一个内容协商,可以去改变返回的形式,xml或json等数据格式
对于请求处理和响应处理源码解析存在于硅谷的雷神视频中特别优秀,建议看一看。我怕我描述的不明白这里就没有去写原理
试图解析器与模板引擎
视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染。
因为SpringBoot一般打成直接执行的jar包。如果使用jsp打成的jar包可能不能访问
JSP搭建
当然我们可是可以进行配置JSP,从而实现搭建的
添加WEB模块
编写SpringBoot的配置
指定试图解析器的处理方式
spring:
mvc:
view:
prefix: /WEB-INF/
suffix: .jsp
结果
试图解析原理流程
1、目标方法处理的过程中,所有数据都会被放在 ModelAndViewContainer 里面。包括数据和视图地址
2、方法的参数是一个自定义类型对象(从请求参数中确定的),把他重新放在 ModelAndViewContainer
3、任何目标方法执行完成以后都会返回 ModelAndView(数据和视图地址)。
**4、**processDispatchResult 处理派发结果(页面改如何响应)
-
1、render(mv, request, response); 进行页面渲染逻辑
-
- 1、根据方法的String返回值得到 View 对象【定义了页面的渲染逻辑】
-
-
- 1、所有的视图解析器尝试是否能根据当前返回值得到View对象
- 2、得到了 redirect:/main.html --> Thymeleaf new RedirectView()
-
-
-
- 3、ContentNegotiationViewResolver 里面包含了下面所有的视图解析器,内部还是利用下面所有视图解析器得到视图对象。
- 4、view.render(mv.getModelInternal(), request, response); 视图对象调用自定义的render进行页面渲染工作
-
-
-
-
- RedirectView 如何渲染【重定向到一个页面】
- 1、获取目标url地址
-
-
-
-
-
- **2、**response.sendRedirect(encodedURL);
-
-
视图解析:
-
- 返回值以 forward: 开始: new InternalResourceView(forwardUrl); --> 转发****request.getRequestDispatcher(path).forward(request, response);
- 返回值以 redirect: 开始: new RedirectView() --》 render就是重定向
-
- 返回值是普通字符串: new ThymeleafView()—>
自定义视图解析器+自定义视图; 大厂学院。
Thymeleaf搭建
SpringBoot是支持Thymeleaf的模板引擎的。所以默认再静态的目录下就可以进行指定
查看目录结构
添加Thymeleaf依赖
//这个依赖是为Thymeleaf模板引擎提供的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
直接在静态资源目录下放入HTML页面进行指定
thymeleaf就是html页面作为的模板引擎
自动配好的策略
-
1、所有thymeleaf的配置值都在 ThymeleafProperties
-
2、配置好了 SpringTemplateEngine
-
3、配好了 ThymeleafViewResolver
-
4、我们只需要直接开发页面
底层的试图解析器
public static final String DEFAULT_PREFIX = "classpath:/templates/";
public static final String DEFAULT_SUFFIX = ".html"; //xxx.html
针对详细的Thymeleaf使用我再之后会进行查找编写的
针对详细的Thymeleaf使用我再之后会进行查找编写的