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

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

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

一、经过response对象的sendRedirect方法。浏览器

二、经过RequestDispatcher对象的forward方法。服务器

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

一、使用responsejsp

response.sendRedirect("login.jsp");spa

二、使用RequestDispatcher.net

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

rd.forward(request,response);blog

这两种方式有什么区别?什么状况下应该使用哪种方式呢?开发

首先介绍二者的区别。

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

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

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

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

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

一、若是但愿经过request把当前在控制器中获取的信息传递给目标文件(经过request.setAttribute和request.getAttribute),这时候应该选择RequestDispatcher。由于须要当前文件和目标文件共享request对象。一般用于查询。

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

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

一、能够选择session,可是在第二个文件中必定要删除。

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

转的sina博客.

相关文章
相关标签/搜索