说到web开发那简直能说的太多了,而且这个也是java很常见的实际工作场景。之前这一块也零零散散说了很多,这里重温一下其中的知识。
静态资源访问路径
说到静态资源访问,我第一印象居然是之前spring+spring mvc的时候,webapp下web-inf里的html页。。虽然这么说挺不准确的,但是我记得静态资源都是要放在webapp下的。但是现在的spring boot,都已经没有webapp了。所以spring boot中访问静态资源也简单的多,其有四个默认的读取地点:
类路径下:/static (or /public or /resources or /META-INF/resources)
下面是我测试的demo:
四张图片的位置
下面我启动项目,不做任何额外的配置直接ip+端口+图片名访问
第一张图
第二张图
第三张图
第四张图
如上测试结果,事实证明这几个默认路径下的静态资源确实可以直接访问。
不过其实这里有一个小问题大家可能没注意,就是假如有一个和静态资源一样名称的接口呢,回如何返回?下面我们实际测试一下:
如图,下面我们访问一下看看会获取静态资源还是走到接口
优先走了接口
为什么会先走接口呢?是偶然还是必然?其实这个是必然的。因为这个请求解析原理:请求进来,先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源也找不到则响应404页面
所以说controller中的接口是优先于静态资源的。
静态资源访问前缀
首先默认的静态资源的访问是没有前缀的,就是从根路径访问的。
但是实际项目中经常我们要把静态资源单独拎出来。毕竟打个比方,有些时候我们系统要做token拦截校验的,但是静态资源应该是不需要校验的,所以就不能和常规的一些方法放一起,应该是有一个单独的路径。所以我经常用ip:port/xxx/imgs/**来保存静态资源,这个/imgs这一层就是我给所有的静态资源单独拎出来的一个前缀。
这个是怎么设置的呢?在配置文件中:
spring:
mvc:
static-path-pattern: /imgs/**
配置静态资源前缀:
然后我们重启项目然后访问下试试:
静态资源的前缀设置成功
当然了,这个静态资源本身的位置也可以指定。毕竟虽然默认的四个用起来也比较乱,而且排他性不强(比如明明想用static下放静态资源路径,但是如果随便放在了public下也可以访问到,这个其实不是想要的)。
下面是指定静态资源位置的配置:
spring:
resources:
static-locations: classpath:/lsj
指定类路径下lsj为静态资源的位置
下面我们类路径下创建lsj文件下并放个图片试试。
只有在lsj文件夹下才能访问
如上图,之前四个默认路径下的静态资源都访问不了了,只有配置文件中指定的lsj文件下的才可以。
其实这个原因也简单的很,因为spring boot的默认值static-locations就是嘴上面说的四个位置。而当我们主动去指定了以后,读取的时候会去读我们指定的,从而默认的四个不生效了。
当然了,还有一个好玩的配置:禁止访问项目中的静态资源,如下配置:
resources:
add-mappings: false 禁用所有静态资源规则
这个配置很简单,但是为什么这么配可以说一下,我们去源码中找原因:
源码
注意这里有这么个判断:
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
根据打印的话:默认资源处理已禁用。就知道这个是什么了。
然后这个变量:this.resourceProperties.isAddMappings()是绑定配置文件中我们配置的变量的。所以才有了如上的结果。
中间略过欢迎页等,毕竟我一直习惯前后端分离项目,所以不看这块了。
说一个扩展的小知识:@Bean注释的方法有参数,那么其所有的参数的值都会从容器中确定。
Restful接口风格
其实restful接口风格我个人感觉就是用请求方式来判断接口作用。除了能少绞尽脑汁的想一些方法名称,暂时我还没get到特别实用的性能。。
然后刚刚也说了,就是用请求方式的不同来走入不同的接口,比如/user
同样的这个接口,
- put提交就是添加用户
- delete提交就是删除用户
- get提交就是查找用户
- post提交就是删除用户
这四个接口都是一个接口路径/user,看上去优雅的很。
然后这个都是spring boot默认支持的,就是在接口上指定方式,或者直接用@GetMapping(“/xxx”)或@PostMapping(“/xxx”)这样的注解就行了,但是有一点:
表单提交是只有get/post的。
那么如何实现这个delete/put呢?其实就是表单中指明提交方法后加一个name是_method的参数把想要称为的请求方式提交过来。
然后虽然本质上还是post/get提交,但是可以用是spring boot一个现成的过滤器去读取这个_method并转成相应的方式。
这个需要spring boot打开这个过滤配置,如下:
spring:
mvc:
hiddenmethod:
filter:
enabled: true #开启页面表单的Rest功能
这里_method的值是spring boot默认指定了。如果想要改我们自己重写这个过滤器就可以了。
因为web这块东西很多,我打算分开记录,所以本篇文章就到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利!另外如果我文中某些措辞不严谨或者表述不清楚欢迎指出!
网友评论