Bal*_*usC 157
首先,术语"重定向"在Web开发世界中是向客户端发送空HTTP响应的动作,Location其中只有一个标题,其中客户端必须发送全新的GET请求.所以基本上:
some.jsp.Location: other.jsp标头发回HTTP响应other.jsp(这反映在浏览器地址栏中!)other.jsp.您可以使用webbrowser的内置/插件开发人员工具集来跟踪它.在Chrome/IE9/Firebug中按F12,然后选中"网络"部分进行查看.
正是以上所述是通过sendRedirect("other.jsp").在RequestDispatcher#forward()不发送重定向.相反,它使用目标页面的内容作为HTTP响应.
some.jsp.other.jsp.但是,根据原始HTTP请求some.jsp,浏览器地址栏中的URL保持不变.
这RequestDispatcher在MVC范例中非常有用,并且/或者当您想要隐藏JSP直接访问时.您可以将JSP放在/WEB-INF文件夹中,并使用Servlet哪些控件,预处理和后处理请求./WEB-INFURL不能直接访问文件夹中的JSP ,但Servlet可以使用它来访问它们RequestDispatcher#forward().
例如,你可以在一个JSP文件/WEB-INF/login.jsp和LoginServlet其上映射url-pattern的/login.当您调用时http://example.com/context/login,doGet()将调用servlet .你可以在那里做任何预处理的东西,最后转发请求,如:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)
提交表单时,通常需要使用POST:
<form action="login" method="post">
Run Code Online (Sandbox Code Playgroud)
这样servlet doPost()将被调用,你可以在那里做任何后期处理(例如验证,业务逻辑,登录用户等).
如果有任何错误,那么您通常希望将请求转发回同一页面并在输入字段旁边显示错误,依此类推.你可以使用RequestDispatcher这个.
如果a POST成功,您通常需要重定向请求,以便在用户刷新请求时不会重新提交请求(例如,按F5或在历史记录中导航).
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
Run Code Online (Sandbox Code Playgroud)
一个重定向从而指示客户端触发一个新的GET给定的URL请求.刷新请求只会刷新重定向的请求而不是初始请求.这将避免"双重提交"和混乱以及糟糕的用户体验.这也称为POST-Redirect-GET模式.
Abh*_*war 100
requestDispatcher - forward()方法
当我们使用forward方法时,请求被转移到同一服务器内的其他资源以进行进一步处理.
在转发的情况下,Web容器在内部处理所有进程,并且不涉及客户端或浏览器.
当在requestdispatcher对象上调用forward时,我们传递请求和响应对象,因此我们的旧请求对象出现在将要处理我们的请求的新资源上.
在视觉上我们无法看到转发的地址,它是透明的.
使用forward()方法比发送重定向更快.
当我们使用forward重定向并且我们想在新资源中使用相同的数据时,我们可以使用request.setAttribute(),因为我们有可用的请求对象.
的sendRedirect
在sendRedirect的情况下,请求被转移到另一个资源到不同的域或不同的服务器以进行进一步处理.
当您使用sendRedirect时,容器会将请求传输到客户端或浏览器,因此sendRedirect方法中给出的URL作为对客户端的新请求可见.
在sendRedirect调用的情况下,旧请求和响应对象将丢失,因为它被浏览器视为新请求.
在地址栏中,我们可以看到新的重定向地址.它不透明.
sendRedirect较慢,因为需要一次额外的往返,因为会创建全新的请求并丢失旧的请求对象.需要两个浏览器请求.
但是在sendRedirect中,如果我们想要使用,我们必须将数据存储在会话中或传递URL.
哪一个好?
它取决于哪种方法更有用的场景.
如果您希望控制转移到新服务器或上下文并将其视为全新任务,那么我们将转到发送重定向.通常,如果在浏览器重新加载网页时可以安全地重复操作不会影响结果,则应使用forward.
Asa*_*aph 19
该RequestDispatcher接口允许您执行服务器端转发/包含,而sendRedirect()客户端重定向.在客户端重定向中,服务器将发回HTTP状态代码302(临时重定向),这导致Web浏览器为GET重定向位置处的内容发出全新的HTTP 请求.相反,在使用RequestDispatcher接口时,新资源的包含/转发完全在服务器端处理.
Job*_*ews 13
forward() 和 sendRedirect() 方法之间的主要重要区别在于,在 forward() 的情况下,重定向发生在服务器端,对客户端不可见,但在 sendRedirect() 的情况下,重定向发生在客户端并且是可见的给客户。
这两种方法中的任何一种都可能“更好”,即更合适,这取决于您想要做什么。
服务器端重定向速度更快,因为您无需往返浏览器即可从不同页面获取数据。但是在浏览器中看到的 URL 仍然是原始地址,因此您在那里创建了一些不一致。
客户端重定向更通用,因为它可以将您发送到完全不同的服务器,或更改协议(例如,从 HTTP 到 HTTPS),或两者兼而有之。并且浏览器知道新的 URL。但是在服务器和客户端之间需要额外的来回。
| 归档时间: |
|
| 查看次数: |
128212 次 |
| 最近记录: |