在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应用程序。
答案 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。
只有在重定向网址的开头应用时才有效。
以下是应用程序服务器在幕后如何解释的规则:
首先:请注意重定向地址始终为CASE SENSITIVE - 即使在重定向网址的域段中也是如此。请参阅下面示例代码中的我的评论,通过示例了解哪些内容可行,哪些内容将失败。
如果重定向以'http://'开头,则指定的ABSOLUTE路径将用于重定向。
否则您的重定向网址将作为相对网址应用。
如果重定向URL以正斜杠字符'/'开头,则指示您的应用程序服务器构建与Web容器的URL RELATIVE!
例如:相对于localhost:8080
所以命令......
response.sendRedirect("/foo/stuff.htm")
来自servlet,或者
<a href="/foo/stuff.htm">Stuff page</a>
重定向网址开头的正斜杠的缺失(连同缺少协议签名)将指示应用服务器构建相对于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");
参见:https://www.safaribooksonline.com/library/view/head-first-servlets/9780596516680/ch04s27.html