在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request

    response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建Cookies等实现;

       重定向:response.sendRedirect(url) (把响应发送到另一个指定的页面进行处理)。

     request:可以对在客户请求中给出的信息进行访问,包含了所有有关当前浏览器的请求信息。

       请求转发:request.getRequestDispatcher(url).forward(request,response)。

差异:

      1. 请求的次数:

            重定向比请求转发多请求一次,下面以例子说明。

如果现在有一个需求:A首先向B发出请求,然后B再向C发出请求。

先看重定向方式(B->C):首先A向B发出请求(第一次),然后B通过重定向的方式跳转到C,但不会直接向C发出请求,而是先返回到A,通过A向C发出请求(第二次),具体看下面这张图。

然后看请求转发方式(B->C):首先A向B发出请求(第一次),然后B通过请求转发的方式跳转到C,这就不会通过A来跳转,而是B自己直接向C发出请求,具体看下面这张图。

      2.地址栏是否改变:(还是以上面的A.jsp,B.jsp,C.jsp为例)

如果现在A要请求B,然后B要请求C。

先看重定向方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp  (8080是我自己的端口号,test是工程名)

然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp

              最后由B跳转到C,地址为http://localhost:8080/test/C.jsp  (第二次请求,A跳转到C,所以地址会发生改变)

再看请求转发方式:首先在浏览器地址栏输入http://localhost:8080/test/A.jsp

然后A会跳转到B,此时的地址就是http://localhost:8080/test/B.jsp

               最后由B跳转到C,地址为http://localhost:8080/test/B.jsp (仅仅是服务器的内部跳转,所以地址会不会改变)

      

  3.是否保留第一次请求时的数据:

                 再说保留数据之前,先复习一下4种范围对象:pageContext,request,session,application(范围越来越大,造成的性能损耗也越大,所以尽量使用最小的)

这四种范围对象有几个很重要的共同的方法:(无论是重定向还是请求转发都要使用到 setAttribute来赋值 和 getAttribute来取值,只不过前者是session调用并且用session来取得数据,后者是request调用并且用request取得数据)

  • Object getAttribute(String name);//根据属性名返回属性值,注意返回类型
  •         void setAttribute(String name,Object obj);//根据属性名设置属性值,如果没有改属性,则新建一个属性,然后赋值
  • void removeAttribute(string name);//根据属性名删除属性值
  1.          pageContext:仅仅是当前页面有效(只要跳转了,就失效,null),下方的代码就会输出world

     1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    3 <html>
    4 <head>
    5 <title>test</title>
    6 </head>
    7 <body>
    8 <%
    9 pageContext.setAttribute("hello", "world");
    10 %>
    11
    12 <%=pageContext.getAttribute("hello")%>
    13 </body>
    14 </html>
  2.            request:同一次请求有效(比如请求转发,就是同一次请求,而重定向属于两次请求),下方的代码就是通过请求转发的方式传送数据,也就是说请求转发会保存数据(即使B.jsp再次跳转到其他页面,通过request还是可以取到数据)
     1 <!-- A.jsp -->
    2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    4 <html>
    5 <head>
    6 <title>test</title>
    7 </head>
    8
    9 <body>
    10 <%
    11 request.setAttribute("hello", "world");
    12 request.getRequestDispatcher("B.jsp").forward(request,response);
    13 %>
    14
    15 </body>
    16 </html>
     1 <!-- B.jsp -->
    2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    4 <html>
    5 <head>
    6 </head>
    7
    8 <body>
    9 <%=request.getAttribute("hello")%>
    10 </body>
    11 </html>

    但如果利用重定向的方式跳转到B.jsp,将不会把数据传过去,但如果还是想用重定向,可以利用下面这个内置对象session

  3. session:同一次会话有效(只要浏览器不关,都属于同一次会话,无论是重定向还是请求转发,都有效;关闭或切换浏览器后无效;),session是存在于服务器端的,所以如果使用重定向的方式跳转,可以利用session来获取数据(并不是重定向传了数据,而是获取了服务器端的数据)
     1 <!--A.jsp  -->
    2 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    4 <html>
    5 <head>
    6 <title>test</title>
    7 </head>
    8
    9 <body>
    10 <%
    11 session.setAttribute("hello", "world");
    12 response.sendRedirect("B.jsp");
    13 %>
    14 </body>
    15 </html>
     1 <!-- B.jsp -->
    2 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    4 <html>
    5 <head>
    6 </head>
    7 <body>
    8 <%=session.getAttribute("hello")%>
    9 </body>
    10 </html>
  4. application:全局变量,整个项目运行期间都有效(浏览器切换仍然有效,但关闭浏览器后在启动浏览器是无效的),但只对当前项目有效(其他项目是无法访问的)此处不贴代码。

该笔记如有错误,还请斧正。

JSP中的请求转发与重定向的更多相关文章

  1. Servlet中的请求转发和重定向

    跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...

  2. jsp servlet 的 请求转发和重定向

    以前对于servlet和servlet/jsp之间的跳转路径问题感到很迷惑,今天亲自动手实验了一把,总结如下: servlet已经是项目根路径下面的资源了,所以servlet跳转的时候,在跳转路径上面 ...

  3. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  4. spring mvc 请求转发和重定向

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  5. HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向

    上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...

  6. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  7. 04_web基础(六)之请求转发与重定向

    1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...

  8. jsp内置对象 转发与重定向的区别

    jsp 内置对象  转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...

  9. Spring MVC 3.0 请求转发和重定向

    首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...

随机推荐

  1. 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。

    需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...

  2. C#中的隐式转换

    你是否考虑过这个问题:为什么不同类型之间的变量可以赋值,而不需要强制转换类型?如: int i = 1; long l = i; object obj = 1; Exception exception ...

  3. [学习笔记] IT项目管理 - 关键路径法

    关键路径法 只有项目网络中最常的或者耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径.组成关键路径的活动称为关键活动. 图形表示 最早开始时间ES 工期Duration 最早结束时 ...

  4. Linux-saltstack-1 saltstack的安装与基本配置

    @ 目录 一.环境介绍 二.安装saltstack 1.配置安装yum源 2.安装salt-master 3.安装slat-minion 三.配置salt-master 1.指定master的地址 2 ...

  5. MongoDB高级应用之数据转存与恢复(5)

    1.MongoDB索引 1.1.创建索引 db.books.ensureIndex{{number:1}} 创建索引同时指定索引的名字 db.books.ensureIndex({number:1}, ...

  6. Selenium_模拟键盘和鼠标操作(9)

    模拟键盘键盘和鼠标操作主要使用到selenium的keys包,源码如下 class Keys(object): """ Set of special keys codes ...

  7. spring boot --- 注解 @Bean 和@Component

    1.前言 @Bean是给方法注册bean @Component是给不好归类的类注册bean 2.可以达到一样的效果 (1)@Component 直接注册即可 完整源码 package com.exam ...

  8. Jeesite富文本编辑框ckeditor显示错误

    Jeesite富文本编辑框ckeditor显示错误 原文链接:https://www.toutiao.com/i6485135618190869005/ Jeesite中Control都会继承一个Ba ...

  9. x86-3-段式管理(segmentation)

    x86-3-段式管理(segmentation) 3.1 段式管理概述: 从8086CPU开始,为了让程序在内存中能自由浮动而又不影响它的正常执行,CPU将内存划分成逻辑上的段来给程序使用. x86继 ...

  10. MySQL常用内置函数整理

    [1]@@datadir 函数作用:返回数据库的存储目录构造SQL语句 select @@datadir;ps:@@basedir返回mysql的根目录[2]@@version_compile_os ...