【问题标题】:Confusion with RequestDispatcher saying the browser address bar does not change与 RequestDispatcher 混淆说浏览器地址栏没有改变
【发布时间】:2011-04-10 16:32:40
【问题描述】:

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

“Request Dispatcher” - 浏览器栏中的 URL 不会改变。

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

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

使用下面的代码,

  1. 我在 http://whatever.com/tmp3.jsp 上,这就是浏览器中的 URL 显示的内容。

  2. 点击按钮调用 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 中发布的示例。

标签: java jsp servlets


【解决方案1】:

这里发生了两件事:

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

第二步:

  • redirect 向浏览器发送一个特殊的标头,它向重定向指向的页面发出一个新请求
  • forward 在内部进行,在同一个请求中,浏览器永远不会明白它不是它所请求的资源

在您的示例中,URL 保持 /register,因为您使用了 forward。如果使用redirect,会先改成/register,再改回tmp.jsp

【讨论】:

  • @masato-san,您可能会发现在这样的交换中观察浏览器和服务器发送的 HTTP 标头很有用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多