情形

复习尚学堂java的mybatis第二天遇到了一系列问题,并以此来复习关于项目路径,服务器路径,绝对路径,相对路径以及转发和重定向的区别

一、转发与重定向

1.两者的区别

链接:https://blog.csdn.net/liubin5620/article/details/79922692

二、路径

我们以web开发的各种资源作为大环境探讨路径的问题和定义

项目路径:叫做项目根目录或者WEB应用程序的根目录,也就是idea中当前web项目中的web文件夹路径,为web,如下图所示:

服务器路径:tomcat软件文件夹下的 webapps文件夹,也就是tomcat/webapp文件夹,叫做服务器根目录或者web站点根目录我们的web项目最终打包上传到tomcat服务器上,并存在于webapps目录下,并且以项目名称作为文件夹

我们可以在idea中配置当前项目上传到服务器根目录下的项目文件夹名称,名称是可以更改的,可以与idea中的项目名称不同(最好一致)。这点idea与eclipse不同,eclipse项目在tomcat服务器根目录下的项目文件夹名称与在本地项目名相同(即ide中项目名相同),当然我们需要注意,假设我们更改了idea项目在服务器根目录下的文件夹名称,例如将/cmz_ReviewMybatis改为——>/ReviewMybatis,则会使用/cmz_ReviewMybatis不能访问到当前项目资源,需要使用/ReviewMybatis来访问,并且后续的资源访问也要使用/ReviewMybatis作为开始的url访问后续的资源,并且会影响重定向与静态资源访问的路径,具体下文会提到。如图所示:

复习项目打包上传到tomcat的过程

  1. 在idea中,如果项目不是用maven管理的,则将项目src目录下的所有java文件编译成为class文件,并放到项目文件夹web文件夹下的web-inf文件夹下的classes文件夹中(web(webapp)/web-inf/classes)其中resources文件夹中的资源文件例如spring等配置文件也会保存在classes文件夹下,而项目的依赖jar包则会上传到WEB-INF文件夹下的lib文件夹中
  2. 将项目根目录的文件夹web,重命名为项目的名称(这里为cmz_ReviewMybatis,后面的war_exploded不用管,不算名称,只是表示打包成war包而已),并将这个文件夹放到服务器根目录下,即放到webapps下,最终路径为webapps/cmz_ReviewMybatis。最终项目结构如图所示:

3.如果idea的项目采用maven进行管理,最终上传到服务器根目录中的项目结构会有所不同,classes文件夹不在web-inf文件夹下,maven项目在服务器根目录下的项目路径如图所示:

    4.PS:不论是maven做依赖管理还是不采用maven,所有项目所依赖的jar包都要上传到webapps/项目名称/web-inf/lib目录下的,有时候可能依赖管理会出现一些问题,导致一部分jar包没有上传到tomcat的该目录只是留在项目本地,从而导致tomcat启动后该项目一些服务报错,这是因为在tomcat服务器中的项目缺少jar包依赖的原因,我们需要将这些jar包上传到lib包即可,操作如下:

绝对路径以'/'开头的,从根目录下访问资源的路径为绝对路径,如:/a/b/c

相对路径只要不以'/'开头的,相对于当前资源的路径,,如:a/b/c或者../a/b/c或者../../a/b/c等。

三、转发、重定向、静态资源访问的路径

1、三者资源访问路径的根目录'/'不是同一个路径

请求分为客户端直接请求,服务器重定向并要求客户端请求、客户端直接访问静态资源请求。三种方式中,资源的请求路径也会有所不同,相对路径和绝对路径也会有所不同:

  • 如果请求是转发,/表示项目根目录,所有的请求都是以项目根目录作为参照点和起始点进行访问的,不论路径是绝对路径还是相对路径。
  • 如果请求是重定向,或者浏览器请求静态资源引用,/表示服务器根目录,所有的请求都是以服务器根目录作为起始点和参照点进行访问,不论路径是绝对路径还是相对路径
  • 也就是说,除转发,/表示项目根目录;其他所有请求例如重定向或者请求静态资源,/表示的都是服务器根目录。

首先我们要明确一点:客户端访问的url是以服务器根目录作为起始点访问的,虽然转发是以项目根目录作为起始点访问资源并且发生了跳转,但是这一步是发生在服务器内部的,客户端看不到,所以转发过后客户端的url不会因为服务器转发而发生变化。

我们结合例子说明。

案例

step1.构建一个servlet,转发到index.jsp

//注解中用@表示注解声明,注解中Servlet资源的路径url为虚拟路径,也就是说我们的PeopleServlet的资源存放在项目的web/homework/people文件
//夹下,并以selAll命名,虚拟路径虽然不存在在实际的项目根目录下,但是是可以实际访问到的。我们可以把它认为是实际存在与项目根路径下的,
//也就是web/下。
@WebServlet(value = {"/homework/people/selAll"})
public class PeopleServlet extends HttpServlet {private PeopleService peopleServlet = new PeopleServiceImpl();@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {List<People> peopleList = peopleServlet.show();req.setAttribute("list", peopleList);//相对路径//只要不以/开头的都是相对路径,相对路径是从当前资源所在的虚拟文件夹出发,找到其他资源的过程// 绝对路径//只要路径中以/开头的都叫做全路径,从项目根目录web出发找到其他资源的过程//如果请求是转发,/表示项目根目录,也就是idea中当前web项目中的web文件夹路径,为web//由于我们的servlet目前资源在web/homework/people下,所以如果要跳转到index.jsp(位置在web/index.jsp下)//需要向上跳跃两个目录,写成../../index.jsp,或者写绝对路径/index.jsp。// PS:如果请求是重定向,或者浏览器请求静态资源引用,如css,href,img,script。其中/表示的是tomcat文件夹下的// webapps文件夹,也就是tomcat/webapp文件夹,叫做服务器根目录。我们的项目是放在webapp下// PS:也就是说,除了请求是转发,/表示项目根目录,其他所有请求例如重定向或者请求静态资源,/表示的都是服务器根目录。req.getRequestDispatcher("/index.jsp").forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}
}

2.构建index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
<html><head><title>$Title$</title></head><body><img src="/cmz_ReviewMybatis/image/a.png"><br/><table><tr><th>编号</th><th>姓名</th><th>年龄</th></tr><c:forEach items="${list}" var="peo"><tr><td>${peo.id}</td><td>${peo.name}</td><td>${peo.age}</td></tr></c:forEach><br/></table>$END$</body>
</html>

step3.在web.xml中添加欢迎页面了列表

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><welcome-file-list><welcome-file>index.jsp</welcome-file><welcome-file>index.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.html</welcome-file></welcome-file-list>
</web-app>

(1)上述为转发以及静态资源访问路径的正确书写,在启动tomcat后直接访问欢迎页面,图片会进行加载,但是由于我们没有访问Servlet的url,所以表中的数据并不会出现

(2)我们直接访问PeopleServlet,PeopleServlet会获取到表中人员数据,并将数据放进Request中进行转发,转发回到index.jsp中。所以index.jsp将图片和数据库人员数据显示完全。

(3)如果我们在index.jsp中将img的路径替换为images/a.png后,

  • <1>直接访问主页index.jsp,是可以访问到图片资源的,因为是静态资源访问并且访问路径是相对路径,所以资源访问的起始点是服务器根目录,所以会在localhost:9090/cmz_ReviewMybatis/images/a.png下访问,结合项目在服务器根目录下的目录结构,显然是可以访问到的。
  • <2>如果我们访问localhost:9090/cmz_ReviewMybatis/homework/people/selAll,也就是访问servlet,并转发到index.jsp,则可以访问到数据库数据,但是访问不到图片了,因为访问的是静态资源并且是相对路径,所以参照点和起始点是服务器根目录,所以会在localhost:9090/cmz_ReviewMybatis/homework/people/images/a.png下寻找,但是在服务器中资源并不放在这个位置,而放在localhost:9090/cmz_ReviewMybatis/images/a.png这个位置,所以自然访问不到。

(4)如果我们将图片资源路径设置为/images/a.png

  • <1>直接访问主页,访问不到图片
  • <2>通过转发回到index.jsp访问资源,仍然获取不到图片资源

总结

对于相对路径和绝对路径来说,我们最好书写绝对路径,如果书写相对路径,则要想好该相对路径转化为绝对路径是什么。并且要根据请求是转发还是非转发请求来对相对路径选择不同的参照点,转发的起始点/是项目根目录,而重定向或者静态资源请求的起始点/则是服务器根目录。

面试——路径、转发与重定向的区别相关推荐

  1. 请求转发与重定向的区别和执行流程

    请求转发与重定向的区别和执行流程 文章目录 请求转发与重定向的区别和执行流程 1 请求转发与重定向区别 2 现实生活的例子 2.1 重定向 2.2 请求转发 3 重定向-流程图.代码.结果 3.1 流 ...

  2. 请求转发和重定向的区别以及什么时候使用

    请求转发和重定向的区别以及什么时候使用 转发过程(不改变网址) 客户浏览器发送http请求-->web服务器接受此请求-->调用内部的一个方法在容器内部完成请求处理和转发动作-->将 ...

  3. 转发和重定向的区别?

    实际发生位置不同,地址栏不同 转发是发生在服务器的 转发是由服务器进行跳转的,细心的朋友会发现,在转发的时候,浏览器的地址栏是没有发生变化的,在我访问Servlet111的时候,即使跳转到了Servl ...

  4. 转发与重定向的区别,特点

    为什么80%的码农都做不了架构师?>>>    重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求, 而浏览器将不会 ...

  5. java 根据客户端重定向_Java Web笔记 - 转发与重定向的区别与在FireBug客户端的表现...

    1.转发: RequestDispatcher的forward(request, response)称为请求转发. request的getRequestDispatcher和getRequestDis ...

  6. 转发和重定向的区别[来源于网络]

    转发和重定向的区别 不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题. 重定向:以前的request中存放的变量全部失效,并进入一个 ...

  7. java零到一:Servlet和JSP-7:转发、重定向的区别 和状态管理

    1.转发和重定向的区别 请求对象和响应对象的作用域:请求对象到响应对象完成;         (1)转发所涉及的组件可以共享request,response           对象,而重定向不可以 ...

  8. “转发和重定向”的区别以及选择

    一.转发和重定向的区别 request.getRequestDispatcher()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址:服务器内部转发,整个过程处于同一个请求当中.re ...

  9. java重定向的作用,java转发和重定向的区别

    重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重定向方式的含义是第一个页面通知浏览器发送 ...

  10. Servlet转发和重定向的区别

    文章目录 前言 一.转发和重定向是什么? 二.两者者的区别 1.转发 2.重定向 总结 前言 主要是探究servlet跳转也面的两个方式转发和重定向的区别 一.转发和重定向是什么? 当我们在登录页面的 ...

最新文章

  1. 生态伙伴 | 轻计划入驻飞书,轻松管理你的项目
  2. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图
  3. python小白-day4递归和算法基础
  4. servlet需要和ajax,如何使用Servlet和Ajax?
  5. APP视觉稿该怎么切图和标注
  6. [Linux]共享内存
  7. Pytest-ordering自定义用例执行顺序
  8. 百度网盘空间调整:这类用户2TB变100GB!
  9. Practical Mathematical Handwriting
  10. 移动网络安全_中国移动研究院威胁情报区块链应用获区块链技术网络安全应用创新大赛全国一等奖...
  11. 计算机里的音乐怎么设置,realtek高清晰音频管理器怎么设置
  12. 基于PyTorch的深度学习--创建卷积神经网络-面向对象的神经网络
  13. 阿里云CDN回源OSS产生流量计费说明
  14. Java FTP下载文件
  15. 下载 idm 迅雷 网盘 磁力
  16. 参加考试时不要使用计算机,2016年计算机等级考试上机操作应试技巧
  17. 9个精品AI开源免费实战项目助你掌握AI工程师基本技能
  18. android蓝牙查看电池容量_安卓手机如何查看电池损耗?
  19. 【音视频相关】nvidia-smi 命令扩展及问题分析举例(dmon/pmon/GPU性能相关)
  20. EtherCAT--01简介

热门文章

  1. 笔记本锁定计算机功能键,笔记本电脑键盘锁定键是哪个
  2. 如何写一篇数据分析报告3 - 分析背景是什么
  3. L2十档行情逐笔成交数据实战技巧
  4. 三星a60android9,三星A6060官方港版安卓9固件rom线刷包:TGY-A6060ZHU1ASH3
  5. 回溯法之旅行商问题解题思路详解
  6. hive —— 分区表
  7. Altium designer--LM317/LM337封装图
  8. 如何通过域名查询IP地址
  9. mysql update无效_Mysql update记录无效如何解决
  10. My Fifty-First Page - 组合总和 - By Nicolas