路径
当我写后台的时候,路径这个概念到后期才梳理完毕,特别我们的url和文件名起的结构目录一样,更容易迷糊,所以写这篇文章来梳理一下
都有哪些路径
首先明确只有 两个路径
- war包内的本地路径(服务器容器路径)
- http的url路径(网络请求路径)
这些路径被分散到了 不同的配置文件里 和 代码 中
web.xml配置文件
web.xml作为Servlet或者说webapp的配置文件,首先对本地路径和网络路径进行了一次 映射
1 | <servlet> |
这里看到web.xml将 网络的根路径 映射给了 SpringMVC 的转发器类
SpringMVC对静态资源对处理
在通过web.xml进入SprigMVC之后,有两种方式能用户访问到静态资源,一种是映射,一种是容器目录。假设我们在Project的webapp目录下建立一种这样的目录关系 这里是本地目录
1 | ----webapp |
WEB-INF存在一个同级目录image,然后在springMVC的配置文件里进行了配置
1 | <mvc:resources mapping="/imageBack/**" location="image/"/> |
此时有两种方式可以访问到image目录 这里是网络URL目录
访问路径 | 使用机制 |
---|---|
url:port/project/image/image01.jpg | 使用的是容器文件地址 |
url:port/project/imageBack/image01.jpg | 使用的是SpringMVC静态资源映射 |
关于这两种机制的不同参考
- [什么是服务器容器][]
- [SpringMVC配置文件][]
那你会说,这有个吊区别啊。。。。搞得这么复杂。。。
如果我改变 image文件夹的存放位置 将image文件夹置于WEB-INF内部
1 | ----webapp |
由于WEB-INF作为webapp的安全目录,是无法通过Servlet容器的文件地址进行访问的
所以我们可以配置一个映射
1 | <mvc:resources mapping="/image/**" location="WEB-INF/image/"/> |
将安全目录中的文件夹映射出来,甚至将多个文件目录映射成一个URL目录
SpringMVC对JSP的处理
在SpringMVC对动态资源的处理,也就是通常所指的JSP通常是在Controller的类中
Controller里的映射
1 | @Controller |
如上所示我们可以看到
凡是带了Mapping的都是网络地址,而Controller里返回的String都是本地路径的一部分,那么本地完整的路径是什么呢?
JSP所处的实际路径
根据我们SpringMVC的配置,例如
1 | <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> |
以上Bean由Spring提供,并且会自动给Controller的返回值添加前缀后缀,根据这个配置两个文件所处的实际位置
文件名 | 请求URL | 容器中文件实际路径| |
---|---|---|
index.jsp | url:port/project/function | ../webapps/project/WEB-INF/pages/function/index.jsp |
sign.jsp | url:port/project/function/sign | ../webapps/project/WEB-INF/pages/function/sign.jsp |
以上
至此,再次强调SpringMVC和Servlet中路径只存在两种: 网络URL路径 和 服务器容器文件所在路径
而且注意在一切路径拼接的过程中,都是简单的字符串操作,多一个”/”和少一个”/”会造成不同的效果,需要自己定好一套规范,有人喜欢最后不带”/”,有人喜欢最后带,开头不带
为什么静态资源有两种访问机制(可以不看)
因为Servlet和SpringMVC根本不是一个概念上的东西,SpringMVC只是作为一个转发第三方控件,是基于Servlet的Webapp的一个第三方库,对于源生的Servlet来讲,你允许别人访问的资源应该放在WEB-INF外部,需要保护的资源应该放入WEB-INF,这才是传统的思路,而Spring的映射功能,是Spring自己想出来的和JavaEE的设计方法不太一样