【JAVA EE】在重定向和请求转发中感受request与session传递数据的区别

在JAVA EE笔记三中,我们学习了多页面的数据传递,其中一种传递方法就是利用内置对象request,session
在JAVA EE笔记四中,我们学习了重定向和请求转发
今天呢,我们要将两者向结合,更加深入地感受两者的特点。
主要分为四种情况:
①request,重定向
②session,重定向
③request,请求转发
④session,请求转发

一、request,重定向

我们在a.jsp中发送数据并重定向到b.jsp,我们可以猜想一下页面的内容将是什么,页面的地址栏又会是什么呢?
a.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A</h1>
<%
//用request传递数据——用户名:Max
request.setAttribute("username","Max");
//重定向
response.sendRedirect("b.jsp");
//request.setAttribute("username","Max");
//请求转发
//request.getRequestDispatcher("b.jsp").forward(request,response);
%>
</body>
</html>

**request.setAttribute(“username”,“Max”);**用内置对象request传递数据Max
**response.sendRedirect(“b.jsp”);**重定向到b.jsp
然后我们在b.jsp中接收数据
b.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>B</h1>
<%
//接收数据——用户名:Max
String name=(String)request.getAttribute("username");
%>
username:<%=name %>
</body>
</html>

然后我们运行a.jsp,得到下图:
在这里插入图片描述
不知道是否符合你的预期呢?
我们可以看到页面内容显示的b.jsp页面的内容,页面地址栏也是b.jsp的地址:http://localhost:8080/week005/b.jsp,这些都很符合重定向的特点,那么你是否对username产生了疑问呢?对于获取到的null,我们要从两个方面去理解:①request的生命周期是一次请求响应②重定向是客户端行为,至少有两次请求。现在你是否有种茅塞顿开的感觉呢?客户端第一次发送请求给a程序,a回应客户端“我不行,b行,去找b”,这已经完成了一次请求响应,这时候request的生命周期就结束了,其中的数据也就失效了。所以当客户端向b发起请求的时候,我们获取不到request内置对象中的值了,所以得到null

二、session,重定向

既然request不能再重定向中传递数据,那么session是否可以呢?
a.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A</h1>
<%
//用session传递数据——用户名:Max
session.setAttribute("username","Max");
//重定向
response.sendRedirect("b.jsp");
//request.setAttribute("username","Max");
//请求转发
//request.getRequestDispatcher("b.jsp").forward(request,response);
%>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>B</h1>
<%
//接收数据——用户名:Max
String name=(String)session.getAttribute("username");
%>
username:<%=name %>
</body>
</html>

运行a.jsp得到如下图:
在这里插入图片描述
我们发现session可以把数据从a.jsp传递到b.jsp了,这也与session的生命周期有关,session的生命周期是打开浏览器到关闭浏览器为止,在重定向的过程中,我们一直在同一浏览器的同一web应用程序的不同页面中,所以session中的数据一直有效,b.jsp也能正常获取到session内置对象传递的数据。同样我们可以注意到页面显示的是b.jsp的内容,地址栏也是b.jsp的地址:http://localhost:8080/week005/b.jsp

三、request,请求转发

我们在一中知道,request无法在重定向中传递数据,那么它在请求转发中又是什么样的情况呢?
a.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A</h1>
<%
//用request传递数据——用户名:Max
request.setAttribute("username","Max");
//重定向
//response.sendRedirect("b.jsp");
//request.setAttribute("username","Max");
//请求转发
request.getRequestDispatcher("b.jsp").forward(request,response);
%>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>B</h1>
<%
//接收数据——用户名:Max
String name=(String)request.getAttribute("username");
%>
username:<%=name %>
</body>
</html>

运行a.jsp得到如下图的结果:
在这里插入图片描述
首先我们可以观察到页面显示的内容是b.jsp的页面内容
页面的地址栏是a.jsp的地址:http://localhost:8080/week005/a.jsp
request内置对象的数据也被接收到了
为什么request传递的数据可以在请求转发中传递呢?
因为请求转发是服务器行为,客户端向a发起请求,a表示“我不行,我交给b来做”,b接收到a的请求并完成,然后b把结果返回给a,a再返回给客户端,这才是一次完成的请求响应,所以在此过程中request的生命周期没有结束,其中的数据一直有效,所以才能传递成功。
我们可以把a.jsp中的请求转发和request的语句调换一下顺序
改成下面这样:
request.getRequestDispatcher(“b.jsp”).forward(request,response);
session.setAttribute(“username”,“Max”);
你可以试试,看看结果如何?并思考为什么会这样呢?

四、session,请求转发

a.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>A</h1>
<%
//用session传递数据——用户名:Max
session.setAttribute("username","Max");
//重定向
//response.sendRedirect("b.jsp");
//request.setAttribute("username","Max");
//请求转发
request.getRequestDispatcher("b.jsp").forward(request,response);
%>
</body>
</html>

b.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>B</h1>
<%
//接收数据——用户名:Max
String name=(String)session.getAttribute("username");
%>
username:<%=name %>
</body>
</html>

运行a.jsp得到下图所示内容:
在这里插入图片描述

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值