我正在阅读的所有在线参考文献和首页JSP& Servlet书都说明了RequestDispatcher和Redirect(即resoponse.sendRedirect())的特性,如:
“请求调度程序” - 浏览器栏中的网址不会更改。
“重定向” - 用户在浏览器中看到新网址。
但是根据我的测试,对于RequestDispatcher,我看到URL发生了变化,所以我不明白它们的真正含义。
使用以下代码,
我在http://whatever.com/tmp3.jsp
,这就是浏览器中的网址。
点击按钮调用servlet,然后将数据转发给服务器,然后服务器将响应发送回浏览器,因此浏览器中的URL现在显示为http://whatever.com/register
所以......网址发生了变化! (从... / tmp3.jsp到... /注册)
任何人都可以向我解释“浏览器中的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>
(适用的servlet)
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代码段) - 映射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>
答案 0 :(得分:5)
这里发生了两件事:
第二步:
在您的示例中,网址保留/register
,因为您使用了转发。如果您使用redirect
,它将首先更改为/register
,然后它将更改回tmp.jsp
答案 1 :(得分:0)
网址未从.../register
更改为tmp3.jsp
,而响应来自后者。使用Redirect
,您会在浏览器网址栏中看到.../tmp3.jsp
。