与RequestDispatcher混淆说浏览器地址栏不会改变

时间:2010-09-10 11:03:32

标签: java jsp servlets

我正在阅读的所有在线参考文献和首页JSP& Servlet书都说明了RequestDispatcher和Redirect(即resoponse.sendRedirect())的特性,如:

“请求调度程序” - 浏览器栏中的网址不会更改。

“重定向” - 用户在浏览器中看到新网址。

但是根据我的测试,对于RequestDispatcher,我看到URL发生了变化,所以我不明白它们的真正含义。

使用以下代码,

  1. 我在http://whatever.com/tmp3.jsp,这就是浏览器中的网址。

  2. 点击按钮调用servlet,然后将数据转发给服务器,然后服务器将响应发送回浏览器,因此浏览器中的URL现在显示为http://whatever.com/register

  3. 所以......网址发生了变化! (从... / tmp3.jsp到... /注册)

    任何人都可以向我解释“浏览器中的URL不会改变”的含义吗?

    示例:

    (适用tmp​​3.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>
    

2 个答案:

答案 0 :(得分:5)

这里发生了两件事:

  • 首先将表单提交给servlet,总是更改URL
  • 然后您选择重定向或转发到视图 - 即另一个(或相同的)JSP

第二步:

  • 重定向会向浏览器发送一个特殊标头,并将一个新请求发送到重定向指向的网页
  • 转发在内部,在同一请求中进行此操作,浏览器永远不会理解它不是它请求的资源

在您的示例中,网址保留/register,因为您使用了转发。如果您使用redirect,它将首先更改为/register,然后它将更改回tmp.jsp

答案 1 :(得分:0)

网址未从.../register更改为tmp3.jsp,而响应来自后者。使用Redirect,您会在浏览器网址栏中看到.../tmp3.jsp