gpt4 book ai didi

java - 为什么从 servlet 转发到 JSP 时必须使用正斜杠?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:38 26 4
gpt4 key购买 nike

当在 servlet 中使用请求调度程序转发到 JSP 时,为什么 JSP 必须用正斜杠表示,如下所示:

    getServletContext().getRequestDispatcher("/foo.jsp").forward(request, response);

如果我在没有正斜杠的情况下使用它,我会在 Tomcat 中得到一个异常。

但是当我使用请求调度程序重定向到 servlet 时,我可以省略正斜杠。如果有一个 servlet 映射到 url 模式,下面的代码片段可以正常工作:

getServletContext().getRequestDispatcher("bar").forward(request, response);

我知道 / 表示网络应用程序的根,但为什么它不是 servlet 所必需的,而只是 JSP 所必需的? Servlet 也属于特定的网络应用程序。

最佳答案

您错误地认为正斜杠表示 Web 应用程序的根目录。有时可能是这个意思,但并非总是如此。

正斜杠“/”字符用于 JSP 中的链接,例如:

<a href="/foo/stuff.htm">Stuff page</a>

并在 RequestDispatcher.forward() 的 servlet 中和 HTTPResponse.sendRedirect() URL 重定向的方法。

它只有在重定向 URL 的开头时才有效。

以下是您的应用程序服务器如何在幕后解释它的规则:

  1. 首先:请注意重定向地址始终区分大小写 - 即使在您的重定向 URL 的域部分中也是如此。请参阅我在下面的示例代码中的评论,通过示例说明什么会起作用,什么会失败。

  2. 如果重定向以“http://”开头,则指定的绝对路径将用于重定向。

    否则您的重定向 URL 将被应用为相对 URL。

  3. 如果重定向 URL 以正斜杠字符“/”开头,您的应用程序服务器会被指示构建一个与 Web 容器相关的 URL!

    例如:相对于localhost:8080

    所以命令...

    response.sendRedirect("/foo/stuff.htm")

    从 servlet 内部,或

    <a href="/foo/stuff.htm">Stuff page</a>

    从 JSP 内部,将带您到

    localhost:8080/foo/stuff.htm .

  4. redirection-url 开头缺少正斜杠(同时缺少协议(protocol)签名)将指示应用服务器构建其相对于原始请求 URL 的 url!即,用户在客户端输入浏览器的 URL。

    重要的是要注意这个构建的 URL 既不是

    • 相对于域

      也不是

    • 相对于网络容器!

    再说一次:应用服务器构造的 url 将相对于客户端请求的原始 url!

    例如:如果客户端提供了 URL

    http://www.example.com/level1/level2/stuff.htm

    然后命令...

    response.sendRedirect("foo/stuff.htm")

    从 servlet 或

    <a href="foo/stuff.htm">Stuff page</a>

    从 JSP 中,会将您重定向到

    http://www.example.com/level1/level2/foo/stuff.htm

    <p></p>

    <p>// WILL NOT WORK! Reason: Case sensitivity.
    response.sendRedirect("/teluskolearnings/login.jsp");</p>

    <p>// WILL WORK! Reason: Case sensitivity.
    response.sendRedirect("/TeluskoLearnings/login.jsp");</p>

    <p>// Will redirect to localhost:8080/login.jsp as the forward slash tells app
    // server to build the url RELATIVE TO THE APP SERVER.
    // So you will be pointed to '<a href="http://localhost:8080/login.jsp" rel="noreferrer noopener nofollow">http://localhost:8080/login.jsp</a>'.
    // This is not what we want.
    response.sendRedirect("/login.jsp");</p>

    <p>// Will redirect to localhost:8080/TeluskoLearnings/login.jsp
    // as the ABSENCE of forward slash tells app server to build the url
    // RELATIVE TO THE URL!
    // So you will be pointed to
    // '<a href="http://localhost:8080/TeluskoLearnings/login.jsp" rel="noreferrer noopener nofollow">http://localhost:8080/TeluskoLearnings/login.jsp</a>'.
    // This IS what we want.
    response.sendRedirect("login.jsp");</p>

    <p>// Will redirect to localhost:8080/TeluskoLearnings/foo/login.jsp
    // (you can see the redirection in the address bar, even if you get a
    // 404 - page not found) as the ABSENCE of forward slash (at the start) tells
    // app server to build the URL RELATIVE TO THE REQUESTED URL!
    // This also means that if the user entered
    // '<a href="http://localhost:8080/TeluskoLearnings/level1/level2/stuff" rel="noreferrer noopener nofollow">http://localhost:8080/TeluskoLearnings/level1/level2/stuff</a>"'
    // he will be pointed to
    // '<a href="http://localhost:8080/TeluskoLearnings/level1/level2/foo/login.jsp" rel="noreferrer noopener nofollow">http://localhost:8080/TeluskoLearnings/level1/level2/foo/login.jsp</a>'
    // (provided of course, that "/level1/level2/stuff" is captured inside the
    // urlPatterns parameter of the @WebServlet() annotation).
    response.sendRedirect("foo/login.jsp");<br/>
    </p>

参见:https://www.safaribooksonline.com/library/view/head-first-servlets/9780596516680/ch04s27.html

关于java - 为什么从 servlet 转发到 JSP 时必须使用正斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31371852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com