内置对象是jsp的核心部分,可以说内置对象贯穿WEB的始终,即使在后续的开发中也依然频繁的用到。
在“jsp内置对象【01】”中的表格介绍了9中内置对象,真正常用到的就四种:page、request和response、session、application。
这四种内置对象各自都有自己的用途和方法。但都有一个相同的目的:就是都是用来接受参数的,都有如下的属性操作方法:
那么四种对象不同的地方就在于四种内置对象有四种不同的属性操作范围。我和大家一起来详细看一下四种属性范围个作用在什么范围。
什么是属性范围
我们在这儿一起学习四种属性范围:page范围:pageContext对象完成、request范围、session范围、application范围。
第一个:page属性范围
从上述看以看出,page属性范围是在本页中,也就是一个jsp页面中可以接受参数,但是离开本页后 就不可以了。
一个代码验证:
page_01.jsp
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
pageContext.setAttribute("name","赵玉强");
String username=(String)pageContext.getAttribute("name");
%>
<h2>姓名:<%=username%></h2>
</body>
</html>
本页中设置了参数,而且是在本页中取得参数-姓名,这样运行一下可以得到姓名。
Page_02.jsp
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
pageContext.setAttribute("name","赵玉强"); //设置名字
%>
<jsp:forward page="page_03.jsp"/>
</body>
</html>
Page_03.jsp
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
String username=(String)pageContext.getAttribute("name"); //接收名字
%>
<h2>姓名:<%=username%></h2>
</body>
</html>
现在发生了服务器跳转后,将page02的页面跳转到page03后 参数将无法
取得 为null.,发现,
内容无法取得了,则一个page范围中的内容只能保存在一个页面中
第二种:request属性范围
从上图可以看出,不同于page的是,request的范围可以在页面和页面之间进行接收参数了。而page只能在本页中接收参数,范围扩大了。
我们来写一个简单的代码看一下:
Request_01.jsp
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
request.setAttribute("name","赵玉强");
%>
<jsp:forward page="request_02.jsp"/>
</body>
</html>
Request_02.jsp
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
String username=(String)request.getAttribute("name");
%>
<h2>姓名:<%=username%></h2>
</body>
</html>
运行一下,结果能得到姓名。也 就是说request可以在
页面之间进行接收参数。
页面跳转之后,可以取得了,在运行的时候可以发现浏览器地址栏是不变的,也就是说发生了服务器端的跳转,如果现在一直有服务器端跳转,则可以一直传递过去,但是如果现在换了一种形式,使用超链接进行页面的跳转呢?我们来改一下上面的代码:
将上述的request_01.jsp页面改成如下,
request_02.jsp页面不变
<%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
<html>
<head>
<title>web开发</title>
</head>
<body>
<% //设置属性
request.setAttribute("name","赵玉强");
%>
<a href="request02.jsp">通过连接访问</a>
</body>
</html>
运行一下可以发现,如果使用了超链接,地址栏的地址发生了改变,也就是客户端之间的跳转了,客户端跳转是无法使用request属性的,也就标志着request属性失败了跳转。为什么使用超链接后就跳转不了了呢?我们还是从request属性范围理解说起。
如上图所示,张三发明了一个手机,找到了推销员李四,李四给王五推销,于是王五买了。但是王五发现手机不好要退货,于是(第一种情况-第一张图)王五联系李四说要退货,李四和老板张三说了,张三把钱退给了王五。(第二种情况--第二种图)王五找李四,李四不给办跑了,于是王五直接找到了张三,张三退钱了。那么在程序里, 如果是客户端跳转,则就相当于发出了两次请求(第二种图),那么肯定第一次的请求将不存在了。
那么如果是不管服务器端的跳转还是客户端的跳转都能接受参数的话,应该怎么办,要着急,在下篇文章中会继续学习,这就用到了session和application对象了。