【发布时间】:2011-04-10 16:32:40
【问题描述】:
我正在阅读的所有在线参考和头等 JSP&Servlet 书都说明了 RequestDispatcher 和 Redirect 的特性(即 resoponse.sendRedirect() ),例如:
“Request Dispatcher” - 浏览器栏中的 URL 不会改变。
“重定向” - 用户在浏览器中看到新 URL。
但根据我的测试,对于 RequestDispatcher,我看到 URL 发生了变化,所以我不明白它们的真正含义。
使用下面的代码,
我在
http://whatever.com/tmp3.jsp上,这就是浏览器中的 URL 显示的内容。点击按钮调用 servlet 作为回报,它将数据转发到服务器,然后服务器将响应发送回浏览器,因此浏览器中的 URL 现在显示为
http://whatever.com/register
所以.. 网址已更改! (从 .../tmp3.jsp 到 .../register)
谁能向我解释“浏览器中的 URL 不变”是什么意思?
例子:
(tmp3.jsp)
<html>
<head>
</head>
<body>
${message}
<!-- click button to send request to servlet -->
<form method="POST" action="register">
<input type="submit" value="click!">
</form>
</body>
</html>
(小服务程序)
package com.masatosan.tmp;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Tmp extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("message", "processed!");
String address = "/tmp3.jsp";
request.getRequestDispatcher(address).forward(request, response);
}//end doPost()
}//end class
(web.xml sn-p) - 映射 servlet 和 URL
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.masatosan.tmp.Tmp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/register</url-pattern>
</servlet-mapping>
【问题讨论】:
-
我会将 JSP 放在
/WEB-INF文件夹中,并一直使用/register。 -
@BalusC: 将 jsp 文件放在 /WEB-INF 下的原因是什么?我认为 /WEB-INF 包含类和库,而 jsp 文件类似于 webapps/webContent/foo.jsp ?
-
隐藏 JSP 以防止直接访问。这样你就可以得到更好的 URL。您已经在 GET 请求上将请求分派到 JSP 文件。那么为什么不一直使用 servlet 作为控制器呢?另见"Hidden features" of JSP/Servlet。更多有用的信息和链接可以在Servlets tag info page找到。
-
太棒了,我不再需要在我的网站上公开 .jsp 了!谢谢!
-
实际上,您不应该将
doGet()请求委托给doPost()。如果所有doGet()所做的都是将请求分派给JSP,那么可能最高从doPost()到doGet()。毕竟,GET 应该只用于预处理请求,而 POST 用于后处理请求。无论如何,这些链接包含许多有用的信息和提示以及其他有用的链接。祝你好运。顺便说一句,令我惊讶的是,您似乎没有尝试我在 this answer 中发布的示例。