`
flash7783
  • 浏览: 308491 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

response.sendRedirect方式的转向与RequestDispatcher的forward方法的比较

    博客分类:
  • mvc
阅读更多

Java Web开发中,采用MVC模式的时候,在控制器完成模型的调用之后会选择界面对用户响应,用常有两种方式:

1、通过response对象的sendRedirect方法。

2、通过RequestDispatcher对象的forward方法。

例如要跳转登录界面login.jsp,可以使用下面的两种方式:

1、使用response

response.sendRedirect("login.jsp");

2、使用RequestDispatcher

RequestDispatcher rd = request.getRequestDispatcher("login.jsp");

rd.forward(request,response);

这两种方式有什么区别?什么情况下应该使用哪一种方式呢?

首先介绍两者的区别。

第一点区别,过程不同:第一种方式相当于浏览器接收到了响应之后又向服务器发送了一次请求,所以相当于两次请求。第二种方式相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,最本质的特点就是两次请求共享了reques对象和response对象。

第二点区别,地址栏不同:第一种方式下用户在浏览器地址栏中看到的是目标文件的地址,第二种方式下用户在浏览器地址栏中看到的是当前文件的地址。这一点也非常重要,后面介绍。

在使用的时候具体应如何选择呢?

如果两个文件的关系非常密切,则应该使用RequestDispatcher,如果两个文件没有直接的关联关系,则应该使用response的sendRedirect方法。什么样的关系算是关系密切,什么样的关系算是没有直接的关联关系呢?例如查询的控制器和查询的结果界面之间就应该算是关系密切,因为查询控制器处理完之后肯定要转向查询结果界面。再例如添加信息的控制器和查询控制器之间的关系就是没有直接关系,通常在添加信息之后会跳转到列表界面的控制器然后再跳转到列表界面,修改信息或者删除信息之后也可能会跳转到列表界面的控制器然后再跳转到列表界面。

下面是两个比较特殊的应用:

1、如果希望通过request把当前在控制器中获取的信息传递给目标文件(通过request.setAttribute和request.getAttribute),这时候应该选择RequestDispatcher。因为需要当前文件和目标文件共享request对象。通常用于查询。

2、对数据进行修改(包括删除和添加操作)的功能的控制器与之后的界面或者控制器应该采用response.sendRedirect方式。如果采用了RequestDiapatcher的forward方式,会产生严重错误。因为地址栏是修改信息的控制器,如果用户在刷新的时候,会重新发送一次对数据进行修改的请求,这不是用户想看到的结果。所以有同学在做添加功能的时候,每刷新一次就添加一条。

如何采用第二种方式,如何传递数据呢?有两种方式:

1、可以选择session,但是在第二个文件中一定要删除。

2、可以在请求字符串中编写,例如login.jsp?info="用户不存在!"


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/javaeeteacher/archive/2009/06/23/4291523.aspx

分享到:
评论
1 楼 Dxx23 2011-02-14  
摘话回帖!

通过response对象的sendRedirect方法,相当于浏览器接收到了响应之后又向服务器发送了一次请求,所以相当于两次请求。用户在浏览器地址栏中看到的是目标文件的地址。浏览器地址栏URL变。

通过RequestDispatcher对象的forward方法,相当于方法调用,在执行当前文件的过程中转向执行目标文件,两个文件(当前文件和目标文件)属于同一次请求,最本质的特点就是两次请求共享了reques对象和response对象。浏览器地址栏URL不变。

相关推荐

    数据库测试test.sql

    response.sendRedirect(request.getContextPath()+"/admin/login.jsp"); } public void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //...

    Servlet转发与重定向

    4. 请求与响应的对象:RequestDispatcher.forward 方法的调用者与被调用者之间共享相同的 request 对象和 response 对象,而 HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的 request 对象和 ...

    JSP中5种跳转foward,request等等的详细区别

    JSP 中有五种跳转方式,包括 RequestDispatcher.forward()、response.sendRedirect()、jsp:forward、RequestDispatcher.include() 和 HttpServletResponse.sendRedirect()。下面我们将详细介绍这五种跳转方式的区别...

    Servlet跳转方式sendReDirect

    在Servlet中,有两种主要的跳转方式:`RequestDispatcher.forward()`和`ServletResponse.sendRedirect()`。这两种方法在处理客户端请求时有不同的行为和应用场景。 1. `RequestDispatcher.forward()` - `forward()...

    jsp和servlet中实现页面跳转的方式实例总结.docx

    在 JSP 中,可以使用 RequestDispatcher.forward 方法将请求转发到另一个 JSP 页面。例如: ```jsp RequestDispatcher rd = getServletContext().getRequestDispatcher("/test/test2.jsp"); rd.forward(request, ...

    JSP跳转方式总结.doc

    本文将重点讨论两种主要的JSP跳转方式:`RequestDispatcher.forward()` 和 `response.sendRedirect()`,以及JSP标签 `<jsp:forward page="">`。 1. `RequestDispatcher.forward()` `RequestDispatcher.forward()` ...

    JSP页面的五种跳转方法

    这里主要介绍五种常见的JSP页面跳转方法,包括RequestDispatcher.forward()、response.sendRedirect()、<jsp:forward page="" / >、Meta标签以及JavaScript的location对象。 1. RequestDispatcher.forward() 这种...

    JSP页面跳转的五种方法

    本文将详细介绍JSP页面跳转的五种方法:`RequestDispatcher.forward()`、`response.sendRedirect()`、`jsp:forward`、修改HTTP header `Location`以及利用`<meta>`标签实现自动跳转。 #### 1. RequestDispatcher....

    jsp跳转的五种方式

    与 `RequestDispatcher.forward()` 不同,`response.sendRedirect()` 是一种客户端的跳转方式。这意味着它可以在用户的浏览器端完成跳转操作,并且可以携带参数进行传递。例如,从一个页面传递参数到另一个页面。 *...

    JSP与Servlet传值技术总结

    Servlet到JSP的传值技术也可以使用sendRedirect和forward两种方法,例如: 1. 使用sendRedirect方法:response.sendRedirect("http://localhost/Try/a.jsp?a=a") 2. 使用forward方法:ServletContext application =...

    response设置的实例源码

    2. 转发:`RequestDispatcher`的`forward(ServletRequest request, ServletResponse response)`方法可以在服务器端将请求转发到另一个资源。这不会改变客户端的URL。 ```java RequestDispatcher dispatcher = ...

    response 对象:页面跳转.pptx

    RequestDispatcher 接口提供了两个方法:`void forward(ServletRequest request, ServletResponse response)` 和 `void include(ServletRequest request, ServletResponse response)`。这两个方法可以用来实现页面...

    servlet跳转的几种情况

    * `response.sendRedirect()`: 与 Servlet 的 sendRedirect() 方法相同。 * `response.setHeader("Location","")`: 设置 HTTP 头的 Location 字段来实现跳转。 * `<jsp:forward page="" />`: 使用 JSP 的 forward ...

    jsp跳转详情

    本文将详细介绍JSP(Java Server Pages)中实现页面跳转的五种常见方法:`RequestDispatcher.forward()`、`response.sendRedirect()`、`jsp:forward`标签、通过修改HTTP Header `Location`来跳转以及利用`<meta>`...

    JSP中5种跳转的方法

    除了 `forward()` 和 `sendRedirect()` 方法之外,还可以利用 `RequestDispatcher` 来实现值栈的跳转。这种跳转方式通常是在需要保持上下文信息的同时进行页面跳转。 #### 使用场景 - 当需要在跳转过程中保留一些...

    jsp页面跳转的五中方法

    本文将详细介绍五种常用的JSP页面跳转方法:`RequestDispatcher.forward()`、`response.sendRedirect()`、`jsp:forward`、`request.getRequestDispatcher().include()`以及`<jsp:include>`。这些方法各有特点,适用...

    小结jsp页面跳转问题

    通过本文档,我们将深入探讨几种常用的JSP页面跳转方式:`response.sendRedirect()`、`response.setHeader()`以及`<jsp:forward>`指令,并通过具体的示例代码来解析这些方法的工作原理及注意事项。 #### 一、`...

    servlet知识点(手动收集)

    `RequestDispatcher.forward()` 是一种服务器端的跳转方式,用于在应用内部的不同资源之间进行转发。这种跳转方式的主要特点如下: 1. **参数传递**: - `forward()` 方法可以在服务器内部保留原始请求和响应对象...

    forward-sendRedirect

    `forward()`是Servlet API中的一个方法,位于`javax.servlet.RequestDispatcher`接口中。当我们在Servlet中调用`request.getRequestDispatcher(path).forward(request, response)`时,它会将当前请求的控制权转移到...

Global site tag (gtag.js) - Google Analytics