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

JavaWeb开发中,采用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="用户不存在!"

转的sina博客.

 
 

esponse.sendRedirect方式的转向与RequestDispatcher的forward方法的比较的更多相关文章

  1. java 中sendredirect()和forward()方法的区别

     一.文章1 HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实现获取相应URL资源. sendRedirect实现请求重 ...

  2. sendRedirect()和forward()方法的区别

    sendRedirect()和forward()方法的区别 之前好像曾经整理过,但忘了放在哪里了,好像压根就没整理过,博客里也没有,故今天重新整理一下. 我们知道页面之间的跳转有两种方式:重定向与转发 ...

  3. RequestDispatcher 的 forward和include

    1.RequestDispatcher 的 forward和include: http://www.avajava.com/tutorials/lessons/what-is-a-request-di ...

  4. SQLSERVER误删除了Windows登录用户验证方式使用Windows身份验证的解决方法

    SQLSERVER误删Windows登录用户验证方式使用Windows身份验证的解决方法 今天看到这篇文章:没有了SA密码,无法Windows集成身份登录,DBA怎么办? 想起来之前着急哥问我的一个问 ...

  5. 创建多线程的第一种方式——创建Thread子类和重写run方法

    创建多线程的第一种方式——创建Thread子类和重写run方法: 第二种方式——实现Runnable接口,实现类传参给父类Thread类构造方法创建线程: 第一种方式创建Thread子类和重写run方 ...

  6. UIImage加载图片的方式以及Images.xcassets对于加载方法的影响

    UIImage加载图片的方式以及Images.xcassets对于加载方法的影响 图片缓存 根据是否将创建好的对象缓存入系统内存,有两类创建UIImage对象的方法可选: 缓存:+ imageName ...

  7. git之https或http方式设置记住用户名和密码的方法

    https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...

  8. .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox

    一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...

  9. vm NAT方式linux上不了网 解决方法

    环境: vm版本:vm 11.0.0 系统:本机win7 虚拟机:centos 5.5   问题,当vm设置虚拟机上网方式为NAT方式时,两台虚拟centos能互相ping通.主机能拼通虚拟机,但虚拟 ...

随机推荐

  1. [bzoj1087][scoi2005]互不侵犯king

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上 左下右上右下八个方向上附近的各一个格子,共8个格子. 思路 首先,搜索可以放弃,因为这是一 ...

  2. window系统下,简单的FTP上传和下载操作

    先假设有一FTP服务器,FTP服务器:qint.ithot.net,用户名:username   密码:user1234.在本地电脑D:盘创建一个文件夹"qint".将要上传的文件 ...

  3. Codeforces 209 C. Trails and Glades

    Vasya went for a walk in the park. The park has n glades, numbered from 1 to n. There are m trails b ...

  4. 安装GIT,集成到Powershell中

    1.首先安装GIT http://msysgit.github.io 下载最新版,然后安装.没什么好说的. 装完之后,把 安装路径/bin 加入到环境变量的Path中 2.删除Git的右键菜单 安装完 ...

  5. 记录一次Tomcat内存泄露原因的追溯

    现象:WEB无法访问.SSH无法登陆.桌面登陆验证失败. 重启服务器后登陆正常. cat /var/log/message显示root用户创建了2000多个sessions后显示内存不足. 进入tom ...

  6. python jenkins-api,jira crowd. email-servers

    jenkins  user authentication: http://stackoverflow.com/questions/15411208/authenticate-jenkins-users ...

  7. C++ Windows 下 根据进程名获取进程ID 以及该进程下所有窗口的句柄

    #include <windows.h> #include <stdint.h> #include <tlhelp32.h> #include <stdio. ...

  8. UML之类图

    类(Class)封装了数据和行为,是具有相同属性.操作.关系的对象集合的总称. 类图(Class Dialog)使用系统中不同类来描述系统的静态结构,类图用来描述不同类和它们之间的关系. 类图由三部分 ...

  9. Ionic2 开发环境搭建

    Ionic2开发环境要求: Nodejs V4.5.0 Nodejs自带 Npm V2.15.9 同上 Ionic V2.1.0 安装最新ionic即可 Angular2 V2正式版 同上 说明:以上 ...

  10. LeetCode Plus One Linked List

    原题链接在这里:https://leetcode.com/problems/plus-one-linked-list/ 题目: Given a non-negative number represen ...