博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JavaWeb开发】"web应用程序的根目录"与"web站点的根目录"的分析
阅读量:3928 次
发布时间:2019-05-23

本文共 3504 字,大约阅读时间需要 11 分钟。

在参考了这篇博文后我陷入了迷惑,什么是web应用程序的根目录?什么又是web站点的根目录?为何在我的intellij idea上跑的web项目根本没用到web站点根目录呢?

先声明:本博客的web环境是java EE 之 Web Application 4.0,tomcat 版本为9;算是最新版本的普通web项目了,如果有什么不一样的地方,那一定是版本的错

1 开门见山

新建一个tomcat web项目,配置tomcat的虚拟目录,取默认值(/项目名_war_exploded)

在这里插入图片描述
那么如果你的tomcat的默认站点(即http://localhost:8080)没有更改的话,这个项目的

  • web站点根目录为:http://localhost:8080
  • web应用的根目录为:http://localhost:8080/WebPathDemo_war_exploded

小注意:根目录跟目录的概念不要混淆:

根目录代表的是从最底层目录访问到当前目录,即绝对路径;
目录代表的是当前目录(当前所在文件夹的名称)。

2 查看web应用的根目录的方法

第一种方式查看:

转到tomcat的Server,我们的URL就相当于web应用的根目录(去掉“/”才算当前目录)
在这里插入图片描述
第二种方式查看:
在sevlet中使用request.getContextPath();查看,查看的是web应用的相对目录

package org.hc.webpathdemo;@WebServlet("/WebPath")public class WebPath extends HttpServlet {
private static final long serialVersionUID = -8249667430606104921L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到web应用的相对地址 String contextPath = request.getContextPath();// 得到“/WebPathDemo_war_exploded” System.out.println("得到web应用的相对地址为:" + contextPath); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); }}

浏览器访问http://localhost:8080/WebPathDemo_war_exploded/WebPath

控制台输出结果为得到web应用的相对地址为:/WebPathDemo_war_exploded

request.getContextPath();告诉了我们web应用的相对目录,相对于谁呢?相对于web站点根目录http://localhost:8080

那么一切似乎清晰了,"web应用的根目录"就是在"web站点的根目录"后加入tomcat配置的虚拟目录 (Deployment的Application Context的设置的地址);

3 搞清楚什么时候是根据web站点根目录作为相对目录,什么时候是根据web应用根目录作为相对目录

3.1 如何访问资源

访问一个资源,一定是相对于web应用根目录的,比如在我这个项目中,一定是

http://localhost:8080/WebPathDemo_war_exploded/资源名(servlet或者html、jsp),才能访问资源。

  1. 比如我访问demo1下的index1.jsp,是必须要带上web应用根目录在前方的
    在这里插入图片描述
  2. 直接使用web站点根目录访问,是访问不到的
    在这里插入图片描述

3.2 a标签,jsp的include,form表单等究竟相对于哪个目录?

拿a标签举例子:

1.web目录下有两个jsp:

在这里插入图片描述
2.代码:
index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    index.jsp	我是index.jsp
index1.jsp

index1.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    index1.jsp	我是index1.jsp

3.这样我在index里点a标签可以跳到index1,是理所当然的。

在这里插入图片描述在这里插入图片描述
在a标签里直接写跳转的资源名,如index.jsp,观察地址栏发现,它相对的路径是
http://localhost:8080/WebPathDemo_war_exploded/,也就是web应用根目录

4.更改a标签跳转地址为/index1.jsp

index1.jsp

查看结果:

在这里插入图片描述
在a标签里写跳转的“/”+资源名,如/index.jsp,观察地址栏发现,它相对的路径是
http://localhost:8080/,也就是web站点根目录,前面已经说过了,资源只有web应用根目录才能访问,相对于站点是访问不到资源的。

那么如果非要相对于站点如何访问呢?需要加入web应用的相对目录,这样写:

index1.jsp

3.3 根据“/”判断是相对于站点还是应用

综上所述,a标签内的相对于web站点根目录还是web应用根目录的判断条件是,最前方有没有“/”

  • 无“/”,代表是相对于web应用根目录,即http://localhost:8080/tomcat配置的虚拟目录/
  • 有“/”,代表是相对于web站点根目录,即http://localhost:8080/

jsp的include、form表单等等也是如此的判断条件。

4.什么是虚拟目录?

tomcat的配置中Deploment的Application context是配置当前项目的虚拟目录,它是实际物理路径的映射。我们可以通过http://localhost:8080/WebPathDemo_war_exploded/demo1/index1.jsp访问一个jsp,那么这个jsp必须在我的本地物理路径上存在,才能访问成功,那么tomcat究竟去哪里寻找这个jsp呢?

答案就在编译后产生的artifacts中,tomcat将实际物理路径映射成了简单的虚拟目录,可以更方便的访问物理路径

编译后打开out(或target)/artifacts

在这里插入图片描述
可以看到项目中所有需要发布的资源都集中在out(或target)/artifacts/WebPathDemo_war_exploded这个文件夹中(部分人的out可能是target),artifacts就是发布项目的关键,可以从项目结构中对它进行重命名。
在这里插入图片描述
这里就是tomcat配置的虚拟目录所真正访问到的实际物理路径

总结

1.资源一定是相对于web应用根目录才能访问

2.web站点根目录一般默认为:http://localhost:8080
3.web应用根目录一般默认为:

  • web站点根目录/web应用目录
  • http://localhost:8080/tomcat配置的虚拟目录

4.根据“/”来判断是相对于web站点根目录还是web应用根目录:

  • 无“/”,代表是相对于web应用根目录
  • 有“/”,代表是相对于web站点根目录

5.tomcat虚拟目录一般默认为:/项目名_war_exploded

6.tomcat虚拟目录实际上为本机上实际物理路径的映射,默认为:

  • 项目所在根目录\out(或target)\artifacts\项目名_war_exploded
  • 例如我的项目:D:\idea\WebPathDemo\out\artifacts\WebPathDemo_war_exploded

如果对你有所帮助,请点个赞支持一下作者,如果有不一样的见解,请在下方评论,作者会及时更正。

转载地址:http://ooign.baihongyu.com/

你可能感兴趣的文章
在JAVA教学中需要加强对学生编程思想的引导
查看>>
Test Coverage- 一个值得我们思考的问题
查看>>
敏捷测试人员的十条法则
查看>>
究竟什么是敏捷软件测试?
查看>>
Lisa和Janet告诉你:敏捷团队的人员分布
查看>>
SSH2框架访问WEB应用异常解决之:AnnotationProcessor
查看>>
Best Practice Techniques for Code Reviews
查看>>
详解Session的生命周期
查看>>
Session有效时间的控制
查看>>
程序员编程生产力相差10倍意味着什么?
查看>>
Eclipse和PyDev构建Python开发环境
查看>>
德雷福斯(Dreyfus)技能获取模型
查看>>
你如果无法度量它,就无法管理它
查看>>
You Can't Manage What You Don't Measure
查看>>
7 Software Testing Myths
查看>>
测试人员的问题分析能力
查看>>
推荐阅读10本书:提升个人管理能力和领导力
查看>>
敏捷测试的特点
查看>>
一篇谈论Scrum的好文章
查看>>
对软件开发核心目的的思考
查看>>