Servlet&JSP—路径的总结


持续学习&持续更新中…

学习态度:守破离


引言

Servlet和JSP中的路径有很多需要使用路径的地方,有很多初学者搞不太清楚,为了方便自己和他人,写一篇文章来探讨一下,抛砖引玉。

该篇文章会持续更新和完善,如果发现作者有什么不对的地方,欢迎评论留言批评

Servlet中的路径

Servlet中使用到路径的地方有两处:

  1. 转发
  2. 重定向

下面一个一个来看。

一、重定向

重定向可以重定向至任何网站(项目)。
重定向不是一次请求,浏览器地址栏中的URL会改变

重定向的分类:


首先声明两个概念:

(1) 本地服务器:当前正在运行的项目(正在编码的项目)所处的计算机

(2) 服务器软件:Tomcat


重定向至当前项目

比如说当前正在运行的项目context path为lp_resume

重定向至当前项目的其他资源或路径有两种写法:

  1. 使用context_path
response.sendRedirect("/lp_resume/website.html");

由于context path有可能会修改,因此也可以使用动态路径写法:

response.sendRedirect(req.getContextPath() + "/website.html");
  1. 写全路径
response.sendRedirect("http://localhost:8080/lp_resume/website.html");

重定向至同一本地服务器同一服务器软件中的项目

重定向时,如果不给浏览器全路径(http://host:port/context/xxx)的话,必须给浏览器一个context path,比如下面这样:

response.sendRedirect("/lp_resume/website.html");

其中/lp_resume就是context path。

原因在于:如果不给浏览器全路径的话,浏览器会自动推断出response.sendRedirect("path")path所属的http://host:port

假设当前正在运行的项目(正在编码的项目)A和另外一个项目B一起被部署在同一计算机下的同一Tomcat中,那么这两个项目就处于同一http://host:port

因此我们就可以直接在A项目中,写如下代码重定向至B项目的public.html:

resp.sendRedirect("/B/public.html");

重定向至其他网站(项目)

一般只有写全路径一种写法:

response.sendRedirect("https://www.baidu.com/");

二、转发

转发只能转发至当前自己的项目。
转发是一次请求,浏览器地址栏中的URL不会改变

牢记几点
  • 1:http://host:port/context/对应项目中的webapp目录
    即:http://localhost:8080/lp_resume/对应lp_resume项目下的webapp目录(根目录)。

  • 2:转发只能使用相对路径

    • 相对路径以“/”开头的话,是指直接相对于"webapp"根目录。
    • 相对路径不以“/”开头的话,是指相对于此时浏览器地址栏中的路径。
举例验证

在webapp目录下新建三个JSP文件,每个Servlet的内容就是其文件名:

  • a.jsp
  • b/b.jsp
  • c/c/c.jsp

在这里插入图片描述

再新建三个Servlet:

  • AServlet
  • BServlet
  • CServlet

在这里插入图片描述

AServlet:

@WebServlet("/a_servlet")
public class AServlet extends HttpServlet {
    
    
}

BServlet:

@WebServlet("/b/b_servlet")
public class BServlet extends HttpServlet {
    
    
}

CServlet:

@WebServlet("/c/c/c_servlet")
public class CServlet extends HttpServlet {
    
    
}

浏览器访问AServlet、BServlet、CServlet时,浏览器地址栏中的路径:

  • 访问AServlet: // 浏览器路径:http://localhost:8080/context_path/a.jsp
  • 访问BServlet: // 浏览器路径:http://localhost:8080/context_path/b/b_servlet
  • 访问CServlet: // 浏览器路径:http://localhost:8080/context_path/c/c/c_servlet

在AServlet中,使用如下代码就可以转发成功:

// 浏览器路径:http://localhost:8080/context_path/a.jsp
// 当前处于根目录/,因此可以直接访问根目录下的所有文件
//        req.getRequestDispatcher("a.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("b/b.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("c/c/c.jsp").forward(req, resp); // T

但是,BServlet和CServlet要想转发成功必须分别这样写:

BServlet:

// 浏览器路径:http://localhost:8080/context_path/b/b_servlet
// 处于/b/目录,可以直接访问b.jsp
req.getRequestDispatcher("b.jsp").forward(req, resp);
        // 当前处于根目录下的b目录下,因此需要跳出b目录
//        req.getRequestDispatcher("../a.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("../b/b.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("../c/c/c.jsp").forward(req, resp); // T

CServlet:

// 浏览器路径:http://localhost:8080/context_path/c/c/c_servlet
// 处于/c/c/目录
// 可以直接跳转至c.jsp
req.getRequestDispatcher("c.jsp").forward(req, resp);
        // 当前处于 "根目录/c/c/"目录下,因此需要跳出/c/c目录
//        req.getRequestDispatcher("../../a.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("../../b/b.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("../../c/c/c.jsp").forward(req, resp); // T

因此我们现在就知道了,转发时,相对路径是指相对于此时浏览器地址栏中的路径

并且知道了http://localhost:8080/context_path/对应webapp目录

值得一提的是,转发时无论AServlet、BServlet还是CServlet都可以这样写:

        // 相对路径(带/)(/代表webapp根目录)
//        req.getRequestDispatcher("/a.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("/b/b.jsp").forward(req, resp); // T
//        req.getRequestDispatcher("/c/c/c.jsp").forward(req, resp); // T

因为如果以“/”开头的话,是指直接相对于"webapp"根目录。

JSP中的路径

  • JavaWeb开发中,jsp和html中的URL应该使用以/context_path开头的绝对路径

  • 由于context path有可能会更改,所以应该使用动态的context path

在这里插入图片描述


  • 指令中的路径使用相对路径

include指令的本质是copy

假设有个JSP文件处于webapp/common目录下,那么有两种写法:

写法一:

<!--  相对于自身所处的目录下  -->
<%@ include file="head.jsp" %>

写法二:

<!--  ‘/’ 指直接相对于webapp根目录  -->
<%@ include file="/common/head.jsp" %>

web.xml中的路径

web.xml使用的是转发

	<!-- 配置首页 -->
    <welcome-file-list>
        <welcome-file>user/front</welcome-file>
    </welcome-file-list>

相当于:

        // 假设现在浏览器地址栏是:http://localhost:8080/lp_resume/
        // 那么下面就会转发到:http://localhost:8080/lp_resume/user/front
        // 转发相对于此时浏览器地址栏中的URL进行转发
        request.getRequestDispatcher("user/front").forward(request, response);

    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/404.jsp</location>
    </error-page>

相当于:

        // 假设现在浏览器地址栏是:http://localhost:8080/lp_resume/
        // 那么此时就会去访问webapp/WEB-INF/404.jsp
        // 因为如果以"/"开头的话,是指直接相对于"webapp"根目录
        request.getRequestDispatcher("/WEB-INF/404.jsp").forward(request, response);

本文完,感谢您的关注支持!


猜你喜欢

转载自blog.csdn.net/weixin_44018671/article/details/121068114