在说请求转发和重定向之前,得了解下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. CS5210设计HDMI to VGA方案|CS5210资料|CS5210设计电路方案

    CS5210是一款HDMI转VGA转换器方案,其输出VGA信号可送到CRT/LED显示器,及投影机等,输入HDMI信号可以驳接电脑.PS3,XBOX360.蓝光DVD,输出VGA可以CRT/LED显示 ...

  2. mqttfx无法选择证书

    mqttfx无法选择证书,无法读取证书 mqttfx也算是挺方便的,但是,有个问题困扰了我很久,就是windows下使用SSL/TLS选择证书路径时,点击后面三个点没有反应(有的同学就没有这个问题) ...

  3. Ubuntu安装Rocksdb并调试

    前言 第一次写博客^_^ 系统是全新的Ubuntu20.04,什么都没有,一切从头开始安装 查看gcc和g++版本 sudo apt-get update gcc --version g++ --ve ...

  4. dokcer部署Redis哨兵模式

    架构图 哨兵的介绍 sentinel , 中文是哨兵. 哨兵是redis 集群架构中非常重要的一个组件,主要功能如下: (1)集群监控:负责监控reidis master 和slave 进程是否正常工 ...

  5. HttpRunner_参数化进阶

    一.获取返回包数据   在提取参数时,当 HTTP 的请求响应结果为 JSON 格式,则可以采用.运算符的方式,逐级往下获取到参数值:响应结果的整体内容引用方式为 content 或者 body,如上 ...

  6. LC 二叉树的最大深度

    https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnd69e/ Recursion /** * Definitio ...

  7. 第10组 Beta冲刺 (4/5)

    1.1基本情况 ·队名:今晚不睡觉 ·组长博客: https://www.cnblogs.com/cpandbb/p/14018650.html ·作业博客:https://edu.cnblogs.c ...

  8. Windows系统上搭建Clickhouse开发环境

    Windows系统上搭建Clickhouse开发环境 总体思路 微软的开发IDE是很棒的,有两种:Visual Studio 和 VS Code,一个重量级,一个轻量级.近年来VS Code越来越受欢 ...

  9. JAVA之内存结构

    概述 JAVA是我们现在最常用的开发语言,而他的垃圾回收机制(Garbage Collection)的重要作用不言而喻,以下简称GC,所以了解GC至关重要,现本人对于GC机制以前的理解和现在的理解记录 ...

  10. RootersCTF2019 I ♥ Flask

    最近也是一直在做ssti方面的题目,我发现了两款比较好用的工具,一个是arjun(用来探测参数),另一个是Tplmap(用来探测ssti漏洞),我们这里以一道题目为例来演示一下 题目 我们拿到题目 分 ...