`

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 { //...

    jsp跳转的五种方式

     它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。  如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这...

    JSP面试容易问到的问题

    <一>——forward与sendRedirect的区别 ******************************************************...sendRedirect方式使用response对象的方法sendRedirect方法完成,代码如下: response.sendRedirect("userist.jsp");

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

    1. 使用RequestDispatcher.forward方法转发 <% RequestDispatcher rd = getServletContext().getRequestDispatcher(/test/test2.jsp); rd.forward(request, response); %> 2. response.sendRedirect ...

    JSP100选择题 JSP100选择题 适合考前练习

    运用javax.servlet.RequestDispatcher接口的forward方法 D.运用javax.servlet.ResponseDispatcher接口的forward方法 4.利用MyEclipse开发Servlet,下列说法正确的是( )。(只选两项) A. MyEclipse可自动产生web....

    JSP页面跳转的五种方法

    JSP页面跳转的五种方法,主要通过RequestDispatcher.forward(),response.sendRedirect()等跳转

    jsp页面跳转

    五种JSP页面跳转方法详解 1. RequestDispatcher....2. response.sendRedirect() 3. <jsp:forward page="" /> 4. 修改HTTP header的Location属性来重定向 5. JSP中实现在某页面停留若干秒后,自动重定向到另一页面

    jsp中页面之间的跳转forward与sendRedirect的区别

    页面之间的跳转可以通过两种方式实现:forward和sendRedirect。 forward:可以在JSP页面中使用,可以在Servlet中实现。 在JSP页面中使用”目标文件”/>,例如要跳转到userlist.jsp,可以写: 代码如下: ”userlist...

    C-ATM.zip jsp+servlet 项目【练手/总结/巩固】

    4. 使用重定向时,可以使用`response.sendRedirect()`方法指定重定向的URL地址。 5. 使用转发时,需要使用`RequestDispatcher`对象获取转发器,并使用`forward()`方法执行转发操作。 6. 根据具体的业务需求,选择...

    jsp跳转getRequestDispatcher()和sendRedirect()的区别

    response.sendRedirect()是重新定向,前后页面不是一个request。 2.RequestDispatcher.forward()是在服务器端运行;HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成.所以RequestDispatcher....

    JSP页面的跳转方式汇总

    JSP页面的跳转方式汇总:1、使用超级链接跳转,2、使用表单提交的方式跳转页面,3、修改HTTP header的Location属性来重定向,4、JSP中实现.../>,6、RequestDispatcher.forword(),7、response.sendRedirect(“url”)...

    servlet2.4doc

    forward(ServletRequest, ServletResponse) - Method in interface javax.servlet.RequestDispatcher Forwards a request from a servlet to another resource (servlet, JSP file, or HTML file) on the server. ...

    JSP 程序设计从入门到精通 PDF 教程

     4.3.2 response.sendRedirect() 73  4.4 理解会话 74  4.4.1 会话状态跟踪API 75  4.4.2 在会话对象中保存数据 76  4.4.3实例:显示会话信息 76  4.5 用Java Servlets代替CGI 78  4.6 JSP/Servlet 中...

    jsp内置对象的用法

    13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 14 Servlet getServlet(String name) 返回指定名的Servlet 15 Enumeration getServlets() 返回所有Servlet的...

Global site tag (gtag.js) - Google Analytics