一、项目结构
当这个项目部署到tomcat上后,结构会变成这样
理解:
如果是eclipse,部署之后项目会出现在tomcat的webapps目录下
如果是idea,部署之后项目会出现在设置的out目录下
我们会发现,项目部署到tomcat之后,工程目录里面的(1)java和(2)resources文件夹看不到了,那么去哪里了呢?
我们点开WEB-INF为文件夹:
lib文件夹里面是项目的jar包,pages文件就是项目WEB-INF/pages里面的页面,
我们会发现这里多了一个classes文件夹,点开看看:
我们会发现java文件夹里面的java和resources文件夹里面的文件都到这个classes文件夹里面来了。
理解:
这说明了,项目部署到tomcat后,
src下面的java和resources目录下面的资原回编译后,
放到tomcat/webapps/项目名/WEB-INF/classes文件夹下面。
这个classes其实就是所谓的classPath路径.
这也就解释了,为什么我们可以在java代码里面,通过
.class.getClassLoader().getResource("system/properties/constant.properties").getPath()获取到对应文件的路径。
因为.class.getClassLoader()是获取类加载器,类加载器肯定是在classPath(classes)路径下的,
所以这里的根目录是classes,resources文件夹下的所有资源都在classes目录下。
二、关于WEB-INF的理解
(1)、WEB-INF文件夹里面的资源外部是不能直接访问的,所有这里面pages包里面的页面也不能直接被访问,这就是为什么在使用status2框架的时候,我们需要这样来写:
当我们在页面上导航栏href:"${base}/apply/trainDailyLeftPage.do",的时候,就会请求这个action,然后转发到这个jsp页面。
三、关于请求资源路径问题:
(1)、客户端路径
客户端路径是指运行在浏览器上的路径。比如:表单、超链接、js(location.href)、Ajax(url)、
CSS和JS的引入以及重定向等。
路径分为绝对路径和相对路径,相对路径又分为相对主机的路径和相对于当前请求的路径。
<1>、绝对路径:
<a href="http://localhost:8080/javaee/jsp/b.jsp">绝对路径</a><br/>
<2>、相对于主机的路径(“/”开头的地址)
<a href="/javaee/jsp/b.jsp">这是以"/"开头的相对地址超链接</a><br/>
<3>、 当前请求(浏览器的请求)的路径(不以"/"开头的)
<a href="b.jsp">这是不以"/"开头的相对地址超链接</a><br/>
这三种方式中,
我们最常用的是第二种,也是最好最稳定的,“/”是代表tomcat的webapps为根目录
第三种是以当前请求目录为根目录,用起来还需要考虑目标是上一级(..)的问题m不太方便。
重定向、表单等客户端发起的请求路径,都是同样的道理,反正一般用相对路径,
"/"就代表了tomcat容器的webapps目录为根目录。
比如我们的静态资源base64.js放在webapp目录的js文件夹里面,
我们在jsp页面上请求这个js文件的时候,src="/项目名/js/base64.js"
(2)、服务端路径:
服务端路径是指在服务器上面运行的请求,比如请求转发(常用)、请求包含等。
服务端的路径有两种:相对于当前应用的路径和相对于当前请求的路径。
<1>、请求转发:
如果路径开头是"/",就代表根目录从tomcat/项目名开始,比如上面那个转发action
实际请求地址就是tomact/webapps/项目名/WEB-INF/pages/production/{通配符}.jsp
四、资源获取路径
(1)、ServletContext获取资源
ServletContext获取资源的路径是相对系统的绝对路径
servletContext.getRealPath("路径");参数中的路径必须是相对路径,可以“/”开头,也可以不使用“/”开头,
但无论是否使用“/”开头都是相对当前应用路径,建议以"/"开头
(2)、classLoader.getResourceAsStream(“路径”)获取资源
网上说一堆,其实就是从classPath目录开始(以tomcat/webapps/项目名/WEB-INF/classes/为根目录开始)
(3)、类名.class.getResourceAsStream
和上面的(2)一样,只是写法不同,从classPath开始找。
五、总结:
1、java web项目,部署到tomcat容器里面后,项目会在tomcat/webapps/ 目录下
2、java工程里面的resoures文件夹和java文件夹里面的所有资源。
会编译后出现在tomcat/webapps/项目名/WEB-INF/classes里面。
这个classes文件夹,实际上就是我们平时说的classPath。
3、一些静态资源,放在webapp目录下(javaWeb工程里面的webapp文件夹,实际上就是要发布到tomcat的工程目录。),
所以就在tomcat/webapps/目录下。和WEB-INF文件夹是同级关系。
4、当客户端(浏览器)请求资源的时候,"/"代表的是tomcat/webapps/,资源路径就要以这个为根路径来找。
5、当服务器请求资源的时候,“/”代表的是tomcat/webapps/项目名/。
6、this.classLoader.getResourceAsStream和类名.class.getResourceAsStream的方式,其实就是从classPath(classes)为根
目录来查找资源的意思。
7、理解项目部署之后,我们javaWeb工程的各个文件到底在什么地方,对于我们了解如果请求资源是重中之重,了解以后,很多
疑惑都会迎刃而解。