Tomcat部署SpringMvc项目出现无法访问静态资源的问题
Tomcat部署SpringMvc项目出现无法访问静态资源的问题
最近在做一个web项目,在本地部署Tomcat服务器的时候可以访问静态资源,但是在服务器端却没有办法访问静态资源,网上找了很多博客,都不适用于我的情况,最后在师兄协助下解决了问题。
首先来看我的项目结构
webapp下存放的是静态资源statics和WEB-INF文件夹。
以下是我的jsp页面资源路径和mvc静态资源配置。
在本地运行效果:
部署在阿里云服务器效果:
实际上在本地运行的时候我使用Idea配置了一个选项
这使得我可以不通过项目名访问到我的项目,
本地可以通过
http://localhost:8080/createsite/index
http://localhost:8080/index
访问项目页面
而服务器则只能通过
http://xx.xx.xx.xx:8080/createsite/index
访问页面
但是我最初不知道相关配置的真正功能,导致无法访问静态资源。
最后发现静态资源必须通过项目名访问
如果使用绝对路径,我的相关URL经过mvc配置
http://47.103.11.5:8080/css/reset.css
会变为
http://47.103.11.5:8080/statics/css/reset.css
所以将相关部分改为
之后,静态资源便可访问。
但是Idea的配置是怎么回事呢?这就要涉及Tomcat的运行原理了。
Tomcat是一个基于组件的服务器,他的构建组件都是可以配置的,Tomcat各个组件是在$TOMCAT_HOME/conf/server.xml文件中配置的。
<Server>
<Service>
<Connector/>
<Engine>
<Host>
<Context/>
</Host>
</Engine>
</Service>
</Server>
下面来说一下每个元素的作用:
server元素表示整个Catalina servlet容器。顶层类元素,可包含多个service元素
Service元素可包含一个Engine和多个Connector元素
一个Connector元素将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户端。
Engine元素表示与特定Catalina服务相关联的整个请求处理机器它接收并处理来自一个或多个Connector的所有请求,并将完成的响应返回给Connector,以便最终传输回客户端。
host元素表示一个虚拟主机,它是服务器(如“www.mycompany.com”)的网络名与运行tomcat的特定服务器的关联。每个虚拟主机下都可以部署(deploy)一个或者多个Web App,每个Web App对应于一个Context,有一个Context path
context元素表示在特定虚拟主机中运行的web应用程序。每个web应用程序都基于一个web应用程序存档(WAR)文件,或者一个包含相应解包内容的对应目录
结构图:
实际上Idea的改动就是在此app的host下添加了Context,令path="/",docBase为webapps下的项目文件夹
做出以上改动后,服务器上部署的项目也可以免项目名访问了!