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

时间:2015-07-12 19:47:13

标签: java jsp

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

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

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

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

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

我知道/表示web-app的根,但为什么servlet不需要它,而只需要JSP? Servlet也属于特定的Web应用程序。

2 个答案:

答案 0 :(得分:0)

所有servlet对象都在容器中的相同位置运行,但是jsp会转到不同的位置。

部署后的SERVLET位置 你会在这里找到所有的servlet Apache的Tomcat的7.0.55 \ web应用\测试\ WEB-INF \类\ COM \它\的servlet

MainController.class

ABC.class

部署后的JSP位置

Apache的Tomcat的7.0.55 \工作\卡塔利娜\本地主机\测试\组织\阿帕奇\ JSP

apiTester_jsp.class

答案 1 :(得分:0)

您错误地认为正斜杠意味着网络应用的根源。它有时可能意味着,但并非总是如此。

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

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

以及用于网址重定向的RequestDispatcher.forward()HTTPResponse.sendRedirect()方法的servlet。

只有在重定向网址的开头应用时才有效。

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

  1. 首先:请注意重定向地址始终为CASE SENSITIVE - 即使在重定向网址的域段中也是如此。请参阅下面示例代码中的我的评论,通过示例了解哪些内容可行,哪些内容将失败。

  2. 如果重定向以'http://'开头,则指定的ABSOLUTE路径将用于重定向。

    否则您的重定向网址将作为相对网址应用。

  3. 如果重定向URL以正斜杠字符'/'开头,则指示您的应用程序服务器构建与Web容器的URL RELATIVE!

    例如:相对于localhost:8080

    所以命令......

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

    来自servlet,或者

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

    从JSP内部开始,将带你到

    localhost:8080/foo/stuff.htm

  4. 重定向网址开头的正斜杠的缺失(连同缺少协议签名)将指示应用服务器构建相对于ORIGINAL REQUESTED 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

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

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

    // 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 'http://localhost:8080/login.jsp'. // This is not what we want. response.sendRedirect("/login.jsp");

    // 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 // 'http://localhost:8080/TeluskoLearnings/login.jsp'. // This IS what we want. response.sendRedirect("login.jsp");

    // 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 // 'http://localhost:8080/TeluskoLearnings/level1/level2/stuff"' // he will be pointed to // 'http://localhost:8080/TeluskoLearnings/level1/level2/foo/login.jsp' // (provided of course, that "/level1/level2/stuff" is captured inside the // urlPatterns parameter of the @WebServlet() annotation). response.sendRedirect("foo/login.jsp");

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