11. WEB 工程路径专题


11.1 工程路径问题

  1. 先看一个问题 web/index.html

在这里插入图片描述

  1. 创建index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>base 标签</title>
</head>
<body>
<h1>注册用户~~</h1>
<!--
    解读:
    1. 可以看到,我们原来的访问一个web资源的路径非常的麻烦
    2. 目前我们访问的是 ok的资源
    3. 我们可以使用相对路径来解决
    4. http://localhost:8080/webpath/ok => ok
    5. 如果你action="ok" 等价 http://localhost:8080/webpath/ok
-->
<form action="ok"
      method="post">
    u: <input type="text" name="username"/><br><br>
    <input type="submit" value="注册用户"/>
</form>
<h1>讨论区~</h1>
<form action="ok"
      method="post">
    讨论内容: <textarea cols="50" rows="5"></textarea><br><br>
    <input type="submit" value="发布讨论"/>
</form>
<h1>回复区~</h1>
<form action="ok"
      method="post">
    回复内容: <textarea cols="50" rows="5"></textarea><br><br>
    <input type="submit" value="回复"/>
</form>
</body>
</html>
  1. 问题分析

在这里插入图片描述

11.2 工程路径解决方案

11.2.1 解决方案:相对路径

  1. 说明: 使用相对路径来解决, 一个非常重要的规则:页面所有的相对路径,在默认情况下,都会参考当前浏览器地址栏的路径 http://ip:port/工程名/ + 资源来进行跳转。所以我们可以直接这样写

在这里插入图片描述

在这里插入图片描述


  1. 相对路径带来的问题举例 => 示意图

在这里插入图片描述


  1. 如果需要指定页面相对路径参考的的路径,可以使用 base 标签来指定

11.2.2 解决方案:base 标签

11.2.2.1 base 基本介绍
  1. base 标签是 HTML 语言中的基准网址标记,它是一个单标签,位于网页头部文件的 head标签内
  2. 一个页面最多只能使用一个 base 元素,用来提供一个指定的默认目标,是一种表达路径和连接网址的标记
  3. 常见的 url 路径形式分别有相对路径与绝对路径,如果 base 标签指定了目标,浏览器将通过这个目标来解析当前文档中的所有相对路径,包括的标签有 (a、img、link、form)
  4. 也就是说,浏览器解析时会在路径前加上 base 给的目标,而页面中的相对路径也都转换成了绝对路径。使用了 base 标签就应带上 href 属性和 target 属性
11.2.2.2 base 应用实例
  1. 需求: 演示 base 标签的使用,说明: 先演示和 html 相关的路径跳转,再演示和 Servlet 路径转发,一步步来
  2. 创建 web\a.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>a.html</title>
</head>
<body>
<h1>这是a.html~~~~~</h1>
<!-- 相对路径
    1. href="d1/d2/b.html" 等价于 http://localhost:8080/项目名/d1/d2/b.html
-->
<a href="d1/d2/b.html">跳转到/d1/d2/b.html</a>
<br/><br/>
<!--
解析:
3. 在实际开发中,往往不是直接访问一个资源的而是在服务端进行转发或者重定向来访问资源
4. 演示转发定位 b.html
5. href="servlet03" http://localhost:8080/webpath/servlet03
-->
<a href="servlet03">转发到/d1/d2/b.html</a>
</body>
</html>
  1. 创建 web\d1\d2\b.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>b.html</title>
    <!--
        解读
        1. 如果没有<base href="http://localhost:10000/hspedu_servlet/">
        2. 当点击 返回a.html 超链接,将会以当前浏览器的地址为路径来确定 路径
        3. 如果增加了<base href="http://localhost:10000/hspedu_servlet/">
        4. 将以 base 指定的href的地址为路径,来确定 超链接的路径
    -->
    <!--<base href="http://localhost:10000/hspedu_servlet/">-->
    <!--简写形式-->
    <!--使用base 标签搞定
    解读
    1. 下面的 base href="http://localhost:8080/webpath/"
    2. 表示的含义就是当前这个页面的访问所有资源都是以 http://localhost:8080/webpath/ 参照

    -->
    <!--<base href="http://localhost:8080/webpath/">-->
    <!--上面的写法可以简化一把-->
    <!--
        解读
        1. base 标签是哪个在解析? => 浏览器
        2. 浏览器在解析 第一个 /时候,会解析成 http://localhost:8080/
        3. 浏览器 href="/webpath/" =解析=> href="http://localhost:8080/webpath/"
        4. 浏览器 <a href="a.html">返回a.html~</a> , 参考 base => 最后
          href="http://localhost:8080/webpath/a.html"

    -->
    <base href="/webpath/">

</head>
<body>
<h1>这是/d1/d2/b.html</h1>
<!--
    解读
    1. 返回a.html => 使用前面的相对路径http://localhost:8080/webpath/d1/d2/
    2. ../../a.html => http://localhost:8080/webpath/a.html
    3. 相对路径会让这个项目相互调用的关系变得复杂
    4. 使用base 标签搞定

-->
<!--<a href="../../a.html">返回a.html~</a>-->
<a href="a.html">返回a.html~</a>
</body>
</html>
  1. 创建 Servlet03.java , 来测试和 Servlet 的转发相关的路径知识点
package com.xjs.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @Author: 谢家升
 * @Date: 2022/3/5-03-05-14:51
 * @Version: 1.0
 */
public class Servlet03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //这里我们希望通过转发来定位 b.html
        //解读:
        //1.在服务器端 解析第一个 / 时,会被解析成 http://ip:port/项目名/ 然后再拼接后面的部分
        //  特别提示:上面的 项目名 ==> application context 【按照tomcat配置的】
        //2. /d1/d2/b.html => 被解析成 http://ip:port/项目名/d1/d2/b.html
        System.out.println("Servlet03进行转发~~");
        //request.getRequestDispatcher("/d1/d2/b.html").forward(request, response);

        //3. 在服务器进行转发时,没有 / 就按照默认的方式参考定位 http://ip:port/项目名/
        // 建议仍然使用上面的写法 /d1/d2/b.html
        request.getRequestDispatcher("d1/d2/b.html").forward(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

  1. 完成测试,重点是理解base 标签的作用

11.2.3 作业布置

在这里插入图片描述

在这里插入图片描述
【login.html】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<h1>用户登录</h1>
<!--
请写出 login.html 在不通过Servlet转发情况下, 如何 通过表单提交, 找到 user.html, 把所有的写法列出来
1. 完整的url  http://localhost:8080/webpath/views/user/user.html
2. 使用相对路径 action="views/user/user.html" => 使用当前浏览器的 地址栏 ip:port/工程路径/ + ...
3. action="/webpath/views/user/user.html"
   浏览器对第一个 / 进行解析 为 http://localhost:8080/ + webpath/views/user/user.html
   同样是一个完整url
4. 这里提一句: 我们使用服务器渲染技术,可以动态得到 /工程路径 , 后面再说
-->
<!--<form action="/webpath/hi" method="post">-->
    <form action="/webpath/redirect" method="post">
    u: <input type="text" name="username"><br/>
    <input type="submit" value="登录">
</form>
</body>
</html>

【user.html】

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户页面</title>
    <!--
        1. 使用相对路径: <a href="../../login.html">点击返回登录</a>
        2. 使用相对路径是比较麻烦,即使成功,还需要考虑是直接定位到这个资源还是请求转发到这个资源
        3. 使用base 标签给一个固定的相对路径
        4. <base href="/webpath/"> 该标签是浏览器解析 http://localhost:8080/webpath/
        5. 在 base 得到的url 路径基础上 <a href="login.html">点击返回登录</a> =>
           http://localhost:8080/webpath/login.html
        6. 一定要自己 玩一把

    -->
    <base href="/webpath/">
</head>
<body>
<h1>用户页面</h1>
<a href="login.html">点击返回登录</a>
</body>
</html>
public class HiServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这里请求转发到 /views/user/user.html
        //System.out.println("HiServlet 被调用....");

        //使用转发
        //注意 第一个 / 被服务器解析成  /webpath/
        //    因为请求转发是发生服务器端,所以通过 /webpath/views/user/user.html
        //    可以定位该资源
        request.getRequestDispatcher("/views/user/user.html")
                .forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

11.3 WEB 工程路径注意事项和细节

11.3.1 注意事项和细节说明

  1. Web 工程的相对路径和绝对路径

    相对路径是

    . 表示当前目录
    .. 表示上一级目录
    ③ 资源名 表示:当前目录/资源名

    绝对路径是: http://ip:port/工程路径/资源路径

  2. 在实际开发中,路径都使用绝对路径,而不是相对路径

  3. 在 web 中 / 斜杠 如果被浏览器解析,得到的地址是:http://ip[域名]:port/ 比如: <a href="/">斜杠</a>

  4. 在 web 中 / 斜杠 如果被服务器解析,得到的地址是:http://ip[域名]:port/工程路径/,你也可以理解成 /工程路径/ 下面的几种情况就是如此:

<url-pattern>/servelturl</url-pattern>
servletContext.getRealPath("/"); //==> 是得到执行路径/工作路径
request.getRequestDispatcher("/");
  1. 在 javaWeb 中 路径最后带 / 和 不带 / 含义不同,一定要小心,比如 <a href="/a/servlet03">表示网址,而 </a> : servlet03 表示资源
  2. 特别说明:重定向 response.sendRediect("/"); 这条语句虽然是在服务器执行的,但是,服务器是把斜杠 / 发送给浏览器解析。因此得到地址 http://ip[域名]:port/

小结: 在编写资源路径时,考虑这么几点:

  1. 这个路径 前面有没有 /
  2. 这个路径 在哪里被解析 [服务器还是浏览器] ,如果前面有 / ,并且是在 浏览器被解析的 被解析成 http://ip:port/ ,如果在服务器端被解析,被解析成 /工程路径/
  3. 如果这个路径,前面没有 / ,并且在浏览器被解析,则以浏览器当前的地址栏 去掉资源部分,作为一个相对路径
  4. 这个路径,最后有没有 / ,如果最后有/ 表示路径, 如果没有 / 表示资源

11.3.2 作业布置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class RedirectServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("RedirectServlet 重定向4 被调用....");
        //这里如何通过重定向来定位 /views/user/user.html
        //1. 分析出 重定向是发生在 浏览器
        //2. 写法1: response.sendRedirect("http://localhost:8080/webpath/views/user/user.html");
        //3. 写法2: response.sendRedirect("/webpath/views/user/user.html");
        //4. 写法3: response.sendRedirect("views/user/user.html");
        //5. 写法4: response.sendRedirect(contextPath + "/views/user/user.html");
        //6. 推荐写法是 第4个写法,比较灵活,而且定位资源是稳定的.
        String contextPath = getServletContext().getContextPath();//contextPath=/webpath
        response.sendRedirect(contextPath + "/views/user/user.html");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

11.4 优化 WEB 工程路径

  • 前面的 base 案例中,我们可以对路径进行优化
  • 代码演示 web\d1\d2\b.html

在这里插入图片描述

  • 这里, 简单演示一下,后面我们还要说
  • => 使用 jsp / thymeleaf 加入标签,动态获取即可

在这里插入图片描述


在这里插入图片描述

<%--
  Created by IntelliJ IDEA.
  User: 谢家升
  Date: 2022/3/5
  Time: 13:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  $END$ 动态的获取到工程路径: <%=request.getContextPath()%>
  </body>
</html>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用与更新说明 1.5.8 Beta 2018-01-28 一、增加了几个变量 %DomainNoPoint%为当前扫描目标域名去掉. wwwbaiducom %DomainUnderLine%为当前扫描目标域名将.换成下划线www_baidu_com %DomainCenterAndTldUnderLine%为当前扫描目标域名主体与后缀并将.换成下划线baidu_com %LastSubPath%为当前目标url最后一级目录 baidu.com/admin/data/ 则%LastSubPath%为data (注:此变量需要为Url加入/结尾,如未存在子目录则程序自动抛弃此行字典。) 1.5.7 Beta 2018-01-26 一、增加字典变量功能 目标域名为www.baidu.com的话 四个变量 分别是 %Domain% 为当前扫描目标域名www.baidu.com %SubDomain% 为当前扫描目标子域名www %DomainCenter% 为当前扫描目标域名主体baidu %DomainCenterAndTld% 为当前扫描目标域名主体与后缀baidu.com 二、给非head访问增加返回长度功能通过返回长度可有效识别一些通过关键字无法识别的自定义404页面 三、修复若干bug并取消了启动弹框 1.5.6 Beta 2017-08-30 一、修复关闭后进程不推出的问题 二、修复cookie支持兼容问题 1.5.5 Beta 2017-08-19 一、修改开始按钮的显示状态为动态(根据线程状态判断) 二、恢复暂停按钮 1.5.4 Beta 2017-08-14 一、接受建议调整功能可以自由输入http头不止支持useragent和cookie 二、接受建议调整界面自定义404的输入框挪到左侧 三、接受建议取消暂停按钮将开始和停止按钮合并 1.5.3 Beta 2017-08-09 一、接受建议让结果表格自动下滑 二、接受建议修改对延时扫描时间的小数支持 三、修复多URL扫描的多处bug 1.5.2 Beta 2017-08-06 一、接受建议加入cookie功能 二、接受建议修改对URL的处理方法去掉多余的’/’ 三、对3xx结果显示跳转后地址http://www.xxx. xxx/admin/index.php ——–> login_redir.php 1.5.1 Beta 2017-08-05 一、修改若干细节 1.5 Alpha 2017-07-28 一、修复延时扫描处多个bug 二、优化线程 三、修复从快捷方式启动后都取字典失败的问题 四、扫描前URL编码解决部分误报问题 1.4 至安全学员内测版2017-07-21 一、修改最大并发连接为100 二、对输入Url进行智能处理获取最后一个’/’的目录进行扫描 三、增加工作线程数显示控制停止后开始前的线程是否全部退出检查 1.3 Alpha 2017-07-20 一、增加停止按钮 二、增加暂停按钮 三、拼接字典时自动根据字典类型增加/ 符号使扫描结果更精准 1.2 Alpha 2017-07-18 一、精确扫描结果识别跳转页面 二、对输入参数进行判断 1.1 Alpha 2017-07-18 一、增加列表内容不同常用状态码使用不同颜色的功能绿色为200 红色为403 二、增加点击列头后对列表内容排序的功能 三、增加右键导出结果功能 四、美化部分文本内容 五、点击开始会自动重置工具方便重复使用不必重新打开 六、增加自选加载字典模式可多选! 1.0 Alpha 2017-07-17 秉承着为人民服务的想法还有就是Windows下我确实没有什么功能比较全又稳定的此类工具了此前用过破壳扫描器和dirburte 都不稳定经常崩,御剑虽好但是缺少很多小功能。 不扯这些了介绍一下功能吧 一、先说说并发线程数吧,虽然默认是20 但是加大也无妨看你自己的各个参数设置和机器网络等配置了。 二、超时时间自己视情况而定也不必多介绍了。 三、这个随机xff头和xr头套用百度上一段话能懂得自然懂得不懂得也无所谓很少能碰见需要用到的这种情况勾选后每次访问都会随机生成这两个IP值如果线程开的大可能比较耗cpu。 1、X-Forwarded-For是用于记录代理信息的,每经过一级代理X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外),代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中,来自4.4.4.4的一个请求,header包含这样一行X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要学就学灰太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值