只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources)
则可以直接通过: 当前项目根路径/ + 静态资源名
进行静态资源的访问,这都是Springboot已经约定好的配置。
原理
: 请求进来的时候,先去找Controller看能不能处理,不能处理的所有请求又都交给静态资源处理器,静态资源也找不到则响应404页面。
而 resources 下的 templates 目录,只能通过控制器来进行访问比如:
访问: 当前项目根路径/hello 才能访问到 success.html 的内容
有时候我们为了区分静态资源请求和其他动态请求,所以一般我们都会设置一个静态资源的访问前缀,这个功能我们只需要修改配置文件即可(默认无前缀):
spring:
mvc:
static-path-pattern: /res/** # 静态资源访问前缀
自此静态资源的访问路径为: 当前项目 + /res/ + 静态资源名
但是访问前缀的配置会导致 Favicon、welcome page功能失效
默认的静态资源存放目录就是上面提到的 called /static (or /public or /resources or /META-INF/resources) 这都是Springboot项目约定好的配置,如果需要自定义静态资源存放目录,也可以通过修稿配置文件的方式实现:
spring:
mvc:
static-path-pattern: /res/**
resources:
static-locations: [classpath:/haha/]
这样只有haha目录下存放的才是能通过访问路径得到的静态资源,其他存放静态资源的目录都失效。
将我们常用的JQuery等前端实用库通过Maven依赖的方式引入 官网地址: 点击跳转
<dependency>
<groupId>org.webjarsgroupId>
<artifactId>jqueryartifactId>
<version>3.5.1version>
dependency>
这样我们也可以以访问静态资源的方式访问引入的JQuery: http://localhost:8080/webjars/jquery/3.5.1/jquery.js
只要在静态资源目录下放置 index.html 文件,这个文件就会被当成欢迎页,只要访问项目的根路径就会访问到该文件。
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致welcome page功能失效
resources:
static-locations: [classpath:/haha/]
值得注意的是: 但是不可以配置静态资源的访问前缀,否则导致 index.html不能被默认访问
只要将favicon.ico 放在静态资源目录下即可
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致 Favicon 功能失效
将传递的参数存放在请求路径中,如果使用@PathVariable 标注Map集合,那么传递过来的所有参数都会以键值对的方式存放进去。
@GetMapping("/car/{id}/owner/{username}")
public String getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@PathVariable Map<String,String> pv){
}
可以使用@RequestHeader注解获取请求中对应请求头的值,如果标注的是一个Map集合,那么请求中所有请求头的信息都会以键值对的方式存放在这个Map集合中
@GetMapping("/car/{id}/owner/{username}")
public String getCar(@PathVariable("id") Integer id,
@PathVariable("username") String name,
@RequestHeader("User-Agent") String userAgent,
@RequestHeader Map<String,String> header){
}
@RequestParam注解获取以查询字符串的方式传递过来的值,如果传递的键对应多个值则可以标注一个List集合,会将所有键对应的值存放到List集合中,也可以标注一个Map集合这样所有的值会以键值对的方式存储进这个Map集合
@GetMapping("/car")
public String getCar(@RequestParam("age") Integer age,
@RequestParam("inters") List<String> inters,
@RequestParam Map<String,String> params){
}
可以使用 @CookieValue注解进行Cookie值的获取,根据Cookie的键获取其对应的值,也可以标注一个Cookie类型,这样会将对应键Cookie的信息全部封装进去。
@GetMapping("/car")
public String getCar(@CookieValue("_ga") String _ga,
@CookieValue("_ga") Cookie cookie){
}
可以使用@RequestBody注解获取Post请求中请求体的值,获取到类似 name=zhangsan&age=44的数据类型
@PostMapping("/save")
public Map postMethod(@RequestBody String content){
Map<String,Object> map = new HashMap<>();
map.put("content",content);
return map;
}
可以使用@RequestAttribute 注解获取请求域中的数据
@GetMapping("/goto")
public String goToPage(HttpServletRequest request){
request.setAttribute("msg","成功了...");
request.setAttribute("code",200);
return "forward:/success"; //转发到 /success请求
}
@ResponseBody
@GetMapping("/success") // required = false 指定是否为必传
public Map success(@RequestAttribute(value = "msg",required = false) String msg,
@RequestAttribute(value = "code",required = false)Integer code,
HttpServletRequest request){
// 代码的方式获取
Object msg1 = request.getAttribute("msg");
return map;
}
请求方式 /cars/sell;low=34;brand=byd,audi,yd
/boss/1;age=20/2;age=20 分号前面是访问路径后面是矩阵变量
SpringBoot默认是禁用了矩阵变量的功能,手动开启:原理。对于路径的处理。UrlPathHelper进行解析。
开启矩阵变量,
方式一,配置类继承WebMvcConfigurer接口,实现configurePathMatch方法
@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不移除分号后面的内容。矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
方式二,不继承WebMvcConfigurer接口:
@Configuration(proxyBeanMethods = false)
public class WebConfig {
//1、WebMvcConfigurer定制化SpringMVC的功能
// 开启矩阵变量 这样不用继承接口
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
// 不移除分号后面的内容,矩阵变量功能就可以生效
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
};
}
}
直接注意的是: caec/path 不能直接固定请求路劲,后面的path必须是可变动的路径
@GetMapping("/cars/{path}")
public Map carsSell(@MatrixVariable("low") Integer low,
@MatrixVariable("brand") List<String> brand,
@PathVariable("path") String path){ // 拿到访问路径
Map<String,Object> map = new HashMap<>();
map.put("low",low);
map.put("brand",brand);
map.put("path",path);
return map;
}
处理 /boss/1;age=20/2;age=10
以顺序从左到右获取其中的值并重命名到pathVar指定的键中
@GetMapping("/boss/{bossId}/{empId}")
public Map boss(@MatrixVariable(value = "age",pathVar = "bossId") Integer bossAge,
@MatrixVariable(value = "age",pathVar = "empId") Integer empAge){
Map<String,Object> map = new HashMap<>();
map.put("bossAge",bossAge);
map.put("empAge",empAge);
return map; // 返回一个json字符串 里面有两个属性
}