JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么)

1 开门见山

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

那么如果你的tomcat的默认站点(即http://localhost:8080)没有更改的话,这个项目的两个重要的根目录就出来了

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

注意:只有web应用才能访问应用里的资源

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

第一种方式查看: 转到tomcat的Server,我们的URL就相当于web应用的根目录(去掉“/”就算当前目录)

第二种方式查看: 在sevlet中使用request.getContextPath();查看,查看的是web应用的相对目录

@WebServlet("/WebPath")
public class WebPath extends HttpServlet {
   
   @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配置的虚拟目录 (第一张图里设置的东西);

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

3.1 如何访问资源

访问一个资源,一定是相对于web应用根目录的,比如在我这个项目中,一定是 http://localhost:8080/WebPathDemo_war_exploded/ + 资源路径(servlet或者html、jsp),才能访问资源。

比如我访问demo1下的index1.jsp,是必须要带上web应用根目录在前方的

3.2判断“/”是相对于web站点还是web应用根目录进行访问

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

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

比如说: 下面的" / "被浏览器解析成http:// ip:端口/ 所以我们这样写会被浏览器解析成http://localhost:8080/index.jsp很显然,少了web应用的根目录,我们无法访问

<a href="/index1.jsp">index1.jsp</a>

我们可以采用另外的方式解决此问题:

4.Servlet配置url路径问题

不管是注解还是xml的配置都是一样的这里我们用注解进行讲解

@WebServlet(urlPatterns ="/WebPath")

其中的第一个" / " ,最终会被浏览器解析为web应用的根目录路径http://localhost:8080/WebPathDemo_war_exploded/,不仅是注解,还有请求转发也是这样解析为web应用根目录路径。

注意:java中,将" / " 解析成web应用根目录又与前文的jsp和html中的a标签、form表单等等恰恰相反,个人认为可以这么理解

  • 将" / " 解析成web应用根目录是java和xml的特点

  • 将" / " 解析成web站点根目录是JSP和HTML的特点

 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/html/a.html");

遇到无法访问的路径怎么办

  • 先检查代码的web路径问题

  • 如果没有问题可能是浏览器缓存的问题,在开发者模式中勾选禁用缓存并检查网页源代码是否与你的代码相同

虚拟目录

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

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

Javaweb中如何读入配置文件问题

在此我们采用JDBC的druid工具类进行举例

public class JDBCUtilsByDruid {

   private static DataSource dataSource;

   public static void main(String[] args) throws SQLException {
       Connection connection = JDBCUtilsByDruid.getConnection();
       System.out.println(connection);
  }
   //在静态代码块完成 dataSource初始化,注意此处为了好看一点已省略try-catch
   static {
      Properties properties = new Properties();
       //JavaSe的正常情况直接读入
         properties.load(new FileInputStream("src\\druid.properties"));
       //如果是JavaWeb方式访问的话不能使用FileInputStream,要先获取当前类的加载器的路径再获取配置资源
           properties.load(JDBCUtilsByDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
           dataSource = DruidDataSourceFactory.createDataSource(properties);
       
  }

这是一张真正的web路径所在的out文件夹下的结构

  1. 就是JDBCUtilsByDruid.class.getClassLoader()所获取的classes

  2. 那么刚刚获取的classes.getResourceAsStream("druid.properties")才是真正的配置文件

琐碎知识点

  • java中通过调用api等获取到的路径path是最后带 / 的,它代表是一个路径而不是资源

  • 在路径问题中,/ 和 \ 都可以用作路径分隔符,用于分隔路径中的各个部分。但是,它们在不同的操作系统中的使用方式不同。

    在类 Unix 系统(如 Linux 和 macOS)中,/ 是标准的路径分隔符。例如,一个绝对路径可能是 /home/user/documents/file.txt。

    而在 Windows 系统中,\ 是标准的路径分隔符。例如,一个绝对路径可能是 C:\Users\User\Documents\file.txt。

    但是!!!在 Java 程序中,\ 是一个转义字符,为了避免出现转义问题。所以可以在代码中使用 / 作为路径分隔符。Java 会自动将它转换为当前操作系统的标准路径分隔符。

本文参考的原文链接:https://blog.csdn.net/qq_42495847/article/details/105706900

JavaWeb中Servlet、web应用和web站点的路径细节("/"究竟代表着什么)的更多相关文章

  1. JavaWeb中servlet读取配置文件的方式

    我们在JavaWeb中常常要涉及到一些文件的操作,比如读取配置文件,下载图片等等操作.那我们能不能采用我们以前在Java工程中读取文件的方式呢?废话不多说我们来看看下我们以前在Java工程中读取文件是 ...

  2. javaWeb中servlet开发——监听器

    监听的定义 对application的监听 application是servletContext接口的对象,表示的是整个上下文环境,如果要想实现对application监听则可以使用如下两个接口: s ...

  3. javaWeb中servlet开发(5)——WEB开发模式:Mode I与Mode II

    1.servlet开发 2.model I模式 客户端通过访问JSP,调用里面的javabean,而通过javabean调用处理数据库的操作,javabean中有专门处理数据库的操作,数据库主要以DA ...

  4. 关于JavaWeb中Servlet的总结

    Servlet知识结构图 Servlet是JavaWeb服务器端的程序,一般一个Servlet处理一种特定的请求.Servlet编写好后,需要指定其所处理的请求的请求路径,也可以认为Servlet是一 ...

  5. javaWeb中 servlet 、request 、response

    1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...

  6. javaWeb中servlet开发(3)——Servlet生命周期

    生命周期:是一个程序的存在周期,servlet由于是受容器的管理,所以容器来决定其生命周期 1.servlet生命周期 2.servlet生命周期对应的方法 3.servlet生命周期代码 publi ...

  7. javaWeb中servlet开发(2)——servlet与表单

    1.重写doGet方法 public class InputServlet extends HttpServlet{ public void doGet(HttpServletRequest req, ...

  8. javaWeb中servlet开发(1)——helloworld

    1.servlet 1.1 servlet简介 1.2 servlet流程 不管是servlet还是jsp,所有的程序都是在服务器端处理的,所以必须了解一个servlet基本流程 servlet和JS ...

  9. javaWeb中servlet开发——过滤器

    servlet开发--过滤器(filter) servlet有三种,分为简单servlet.过滤器servlet.监听servlet 简单servlet是作为一种程序所必须的开发结构保存的,继承htt ...

  10. javaweb中Servlet配置到Tomcat

    1.tomcat容器来运行Servlet程序 在javase中,都是在控制台中运行java代码,而且提供了一个main方法,代码运行的入口.在javaee中,想要运行java代码,不是通过控制台程序来 ...

随机推荐

  1. 关于Docker compose值IP与域名的映射 之 extra_host

    公司的所有项目都是采用Docker容器化部署,最近有一个项目需要使用定时任务调用第三方Api,正式web环境服务器的网络与第三方网络是通畅的,但是当将代码发布到正式环境,调用接口却显示 System. ...

  2. 商品获价API调用说明:获取商品历史价格信息 代码分享

    接口名称:item_history_price 公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中)(获取测试key和secret接入) secre ...

  3. 如何训练个人的ChatGpt4

    如何在自己的计算机上安装类似 ChatGPT 的个人 AI 并在没有互联网的情况下运行它 本文旨在为任何人安装此软件.最初它有一个视频,伴随着操作方法,但是事情变化很快,我的三次尝试只是推迟了我发表这 ...

  4. c++基本数据结构

    基本数据结构: 一.线性表 1.顺序结构 线性表可以用普通的一维数组存储. 你可以让线性表可以完成以下操作(代码实现很简单,这里不再赘述): 返回元素个数. 判断线性表是否为空. 得到位置为p的元素. ...

  5. SpringBoot 集成 Quartz + MySQL

    Quartz 简单使用 Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/de ...

  6. 使用Java接入小程序订阅消息!

    更新完微信服务号的模板消息之后,我又赶紧把微信小程序的订阅消息给实现了!之前我一直以为微信小程序也是要企业才能申请,没想到小程序个人就能申请. 消息推送平台推送下发[邮件][短信][微信服务号][微信 ...

  7. Midjourney 提示词工具(10 个国内外最好最推荐的)

    Midjourney,是一个革命性的基于人工智能的艺术生成器,可以从被称为提示的简单文本描述中生成令人惊叹的图像.Midjourney已经迅速成为艺术家.设计师和营销人员的首选工具(包括像我这样根本不 ...

  8. 自定义Python版本ESL库访问FreeSWITCH

    环境:CentOS 7.6_x64Python版本:3.9.12FreeSWITCH版本 :1.10.9 一.背景描述 ESL库是FreeSWITCH对外提供的接口,使用起来很方便,但该库是基于C语言 ...

  9. Prism Sample 7 Modules LoadManual

    这种模块是手动载入的,需要的时候手动加载. 在app.xaml.cs中注册为按需加载,代码 protected override void ConfigureModuleCatalog(IModule ...

  10. 当我再次用Kotlin完成五年前已经通过Kotlin完成的项目后

      > 近日来对Kotlin的使用频率越来越高, 也对自己近年来写过的Kotlin代码尝试进行一个简单的整理. 翻到了自己五年前第一次使用Kotlin来完成的一个项目([贝塞尔曲线](https ...