JSP中的请求转发与重定向
在说请求转发和重定向之前,得了解下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);//根据属性名删除属性值
- 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> - 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
- 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> - application:全局变量,整个项目运行期间都有效(浏览器切换仍然有效,但关闭浏览器后在启动浏览器是无效的),但只对当前项目有效(其他项目是无法访问的)此处不贴代码。
该笔记如有错误,还请斧正。
JSP中的请求转发与重定向的更多相关文章
- Servlet中的请求转发和重定向
跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...
- jsp servlet 的 请求转发和重定向
以前对于servlet和servlet/jsp之间的跳转路径问题感到很迷惑,今天亲自动手实验了一把,总结如下: servlet已经是项目根路径下面的资源了,所以servlet跳转的时候,在跳转路径上面 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- spring mvc 请求转发和重定向
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分. HttpServletRequest 接口 该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息, ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- 04_web基础(六)之请求转发与重定向
1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...
- jsp内置对象 转发与重定向的区别
jsp 内置对象 转发与重定向的比较 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程. 与之相反,重 ...
- Spring MVC 3.0 请求转发和重定向
首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...
随机推荐
- 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。
需求说明: 模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员.教练员包括乒乓球教练和篮球教练.为了方便出国交流,根乒乓球相关的人员都需要学习英语.具体分析如下: (1)共同的属性 ...
- C#中的隐式转换
你是否考虑过这个问题:为什么不同类型之间的变量可以赋值,而不需要强制转换类型?如: int i = 1; long l = i; object obj = 1; Exception exception ...
- [学习笔记] IT项目管理 - 关键路径法
关键路径法 只有项目网络中最常的或者耗时最多的活动完成之后,项目才能结束,这条最长的活动路线就叫关键路径.组成关键路径的活动称为关键活动. 图形表示 最早开始时间ES 工期Duration 最早结束时 ...
- Linux-saltstack-1 saltstack的安装与基本配置
@ 目录 一.环境介绍 二.安装saltstack 1.配置安装yum源 2.安装salt-master 3.安装slat-minion 三.配置salt-master 1.指定master的地址 2 ...
- MongoDB高级应用之数据转存与恢复(5)
1.MongoDB索引 1.1.创建索引 db.books.ensureIndex{{number:1}} 创建索引同时指定索引的名字 db.books.ensureIndex({number:1}, ...
- Selenium_模拟键盘和鼠标操作(9)
模拟键盘键盘和鼠标操作主要使用到selenium的keys包,源码如下 class Keys(object): """ Set of special keys codes ...
- spring boot --- 注解 @Bean 和@Component
1.前言 @Bean是给方法注册bean @Component是给不好归类的类注册bean 2.可以达到一样的效果 (1)@Component 直接注册即可 完整源码 package com.exam ...
- Jeesite富文本编辑框ckeditor显示错误
Jeesite富文本编辑框ckeditor显示错误 原文链接:https://www.toutiao.com/i6485135618190869005/ Jeesite中Control都会继承一个Ba ...
- x86-3-段式管理(segmentation)
x86-3-段式管理(segmentation) 3.1 段式管理概述: 从8086CPU开始,为了让程序在内存中能自由浮动而又不影响它的正常执行,CPU将内存划分成逻辑上的段来给程序使用. x86继 ...
- MySQL常用内置函数整理
[1]@@datadir 函数作用:返回数据库的存储目录构造SQL语句 select @@datadir;ps:@@basedir返回mysql的根目录[2]@@version_compile_os ...