关于java中sendRedirect,forward和include区别

在javaWeb中页面跳转一般有三种形式,sendRedirect,forward和include,三者有什么区别呢?

我先进行说明,再以一个小例子说明

一、sendRedirect

使用方式

response.sendRedirect();

服务器根据逻辑,发送一个状态码,告诉浏览器去请求指定的地址,把需要的参数放在转发的地址里面。由于是一次新的申请,原先的request就不能读取了,可以使用session代替,或者使用include,和forward代替

二、forward

使用方式

request.getRequestDispatcher("/first.jsp").forward(request, response);

页面会是first.jsp的内容,地址栏不变

可以使用设置属性

三、include

使用方式

request.getRequestDispatcher("/first.jsp").include(request, response);

页面会同时包含当前页面和first.jsp的内容

可以使用设置属性

下面是一个例子

index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>index.jsp 页面</h1>
<a href="first.jsp">first.jsp</a><br/>
<a href="first.jsp?id=123456">first.jsp带id123456</a><br/>
<a href="second.jsp">second.jsp</a><br/>
<a href="second.jsp?id=123456">second.jsp带id123456</a><br/>
<a href="third.jsp">third.jsp</a><br/>
<a href="third.jsp?id=123456">third.jsp带id123456</a><br/>

可以获取id为:<%=request.getParameter("id") %>
</body>
</html>

first.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>first.jsp 页面</h1>
提交的ID:<%=request.getParameter("id")%>
 <%
 		response.sendRedirect(request.getContextPath()+"/index.jsp");
 		System.out.println("first.jsp有访问过了");
 %>
</body>
</html>

second.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>second.jsp 页面</h1>

<%

	request.getRequestDispatcher("/index.jsp").forward(request, response);
%>
提交的ID:<%=request.getParameter("id")%>

</body>
</html>

third.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>third.jsp 页面</h1>
提交的ID:<%=request.getParameter("id")%>
<%
	request.getRequestDispatcher("/fourth.jsp").include(request, response);
	request.getRequestDispatcher("/index.jsp").include(request, response);

%>
<hr>

</body>
</html>

fourth.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
 %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>fourth.jsp 页面</h1>
<hr>
</body>
</html>

接下来运行服务器(使用的是TomCat8.0)

访问项目

点击第一个链接

页面没有变化,但是控制台有输出,表示访问过了

我们试着传一个参数过去id=123456

不能获取id,说明是浏览器重新发出的一个请求,request已经被销毁,这个是一个新的request

下面放上流程图

点击第三个连接

页面没有变化,但是地址栏发生变化

我们传一个参数进去

有了,可以显示id,说明是同一个request

下面放上流程图

因为forward是服务器内部跳转,会带着request一起到下一个页面,所以id可以获得

接着点击第五条链接

页面发生变化,同时包含了,third.jsp和fourth.jsp的内容

我们传一个参数

可以获得request

下面是流程图

本人知识有限,如有错误,望指出

此文系原创,转载请声明出处。

时间: 2024-10-29 03:42:36

关于java中sendRedirect,forward和include区别的相关文章

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

java中String与StringBuilder的区别

本篇文章介绍了,java中String与StringBuilder的区别. 相信大家对 String 和 StringBuffer 的区别也已经很了解了,但是估计还是会有很多同志对这两个类的工作原理有些不清楚的地方,今天我在这里重新把这个概念给大家复习一下,顺便牵出 J2SE 5.0 里面带来的一个新的字符操作的类—— StringBuilder (先别忙着扔我砖头,我还算清醒,我这里说的不是 C #, Java 也有 StringBuilder 类).那么这个 StringBuilder 和

java中extends与implements的区别

学了java很久了,久不用之后给同学解决一个java问题的时候,就卡在这个标题上了. 下面是java中extends与implements的区别: 1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口. extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用 2.extends是继承父类,只要那个类不是声明为f

java中抽象类与接口的区别

转自: http://blog.csdn.net/tp7309/article/details/10452445 二者的区别快忘得差不多了,从别处看到这文章感觉写的不错,正好复习复习,也给大家分享一下. 抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然抽象方法是一定要有的. 抽象类是用于单一继承的,不能实例化.而继承类一定要实现抽象方法,因为抽象

Java中Vector和ArrayList的区别

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复. 3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组

Java中this与super的区别【6】

本文原创作者:pipi-changing 本文原创出处:http://www.cnblogs.com/pipi-changing/ 本文版权归作者和博客园共有,未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接 ,否则保留追究法律责任的权利. Java中this与super的区别  this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. Java关键字this只能用于方法的方法体内.当一个对象创建后, Java虚拟机(JV

java学习笔记——Java中HashMap和TreeMap的区别深入理解

本文转载自Java中HashMap和TreeMap的区别深入理解 首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

Java中&&和&以及||和|的区别

在java的逻辑运算符中,有这么四类:&&(短路与),&(与),|(或),||(短路或). &&和&都是表示与,区别是&&只要满足第一个条件,后面条件就不再判断.而&要对所有的条件都进行判断. "&"操作 代码如下: public class OperateDemo01{ /** 验证(&)"与" 操作 说明:"与" 操作 要求所有条件都判断一遍 */ pub