forward()
和之间的概念差异是sendRedirect()
什么?
首先,术语"重定向"在Web开发世界中是向客户端发送空HTTP响应的动作,Location
其中只有一个标题,其中客户端必须发送全新的GET请求.所以基本上:
客户端发送HTTP请求some.jsp
.
服务器使用Location: other.jsp
标头发回HTTP响应
客户端发送HTTP请求other.jsp
(这反映在浏览器地址栏中!)
服务器发回HTTP响应,内容为other.jsp
.
您可以使用webbrowser的内置/插件开发人员工具集来跟踪它.在Chrome/IE9/Firebug中按F12,然后选中"网络"部分进行查看.
正是以上所述是通过sendRedirect("other.jsp")
.在RequestDispatcher#forward()
不发送重定向.相反,它使用目标页面的内容作为HTTP响应.
客户端发送HTTP请求some.jsp
.
服务器发回HTTP响应,内容为other.jsp
.
但是,根据原始HTTP请求some.jsp
,浏览器地址栏中的URL保持不变.
这RequestDispatcher
在MVC范例中非常有用,并且/或者当您想要隐藏JSP直接访问时.您可以将JSP放在/WEB-INF
文件夹中,并使用Servlet
哪些控件,预处理和后处理请求./WEB-INF
URL不能直接访问文件夹中的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);
提交表单时,通常需要使用POST
:
这样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. }
一个重定向从而指示客户端触发一个新的GET
给定的URL请求.刷新请求只会刷新重定向的请求而不是初始请求.这将避免"双重提交"和混乱以及糟糕的用户体验.这也称为POST-Redirect-GET
模式.
requestDispatcher - forward()方法
当我们使用forward方法时,请求被转移到同一服务器内的其他资源以进行进一步处理.
在转发的情况下,Web容器在内部处理所有进程,并且不涉及客户端或浏览器.
当在requestdispatcher对象上调用forward时,我们传递请求和响应对象,因此我们的旧请求对象出现在将要处理我们的请求的新资源上.
在视觉上我们无法看到转发的地址,它是透明的.
使用forward()方法比发送重定向更快.
当我们使用forward重定向并且我们想在新资源中使用相同的数据时,我们可以使用request.setAttribute(),因为我们有可用的请求对象.
的sendRedirect
在sendRedirect的情况下,请求被转移到另一个资源到不同的域或不同的服务器以进行进一步处理.
当您使用sendRedirect时,容器会将请求传输到客户端或浏览器,因此sendRedirect方法中给出的URL作为对客户端的新请求可见.
在sendRedirect调用的情况下,旧请求和响应对象将丢失,因为它被浏览器视为新请求.
在地址栏中,我们可以看到新的重定向地址.它不透明.
sendRedirect较慢,因为需要一次额外的往返,因为会创建全新的请求并丢失旧的请求对象.需要两个浏览器请求.
但是在sendRedirect中,如果我们想要使用,我们必须将数据存储在会话中或传递URL.
哪一个好?
它取决于哪种方法更有用的场景.
如果您希望控制转移到新服务器或上下文并将其视为全新任务,那么我们将转到发送重定向.通常,如果在浏览器重新加载网页时可以安全地重复操作不会影响结果,则应使用forward.
资源
该RequestDispatcher
接口允许您执行服务器端转发/包含,而sendRedirect()
客户端重定向.在客户端重定向中,服务器将发回HTTP状态代码302
(临时重定向),这导致Web浏览器为GET
重定向位置处的内容发出全新的HTTP 请求.相反,在使用RequestDispatcher
接口时,新资源的包含/转发完全在服务器端处理.