JSP中的内置对象一共有9个,此内置对象不需要经过实例化就可以使用。
pageContext: javax.servlet.jsp.PageContext
request: javax.servlet.http.HttpServletRequest
response:javax.servlet.http.HttpServletResoponse
session:javax.servlet.http.HttpSession
application:javax.servlet.ServletContext
config:javax.servlet.ServletConfig
out:javax.servlet.jsp.JspWrite
page:java.lang.Object
exception:java.lang.Throwable
JSP中提供了四中属性范围(page,application,request,session)
这四中属性范围都包含了如下的方法:
public void setAttribute(String name,Object value)----设置属性
public Object getAttribute(String name)----取得属性
public void removeAttribute(String name)---删除属性
|---Page属性范围:在一个页面设置的属性范围跳转到其它的页面就无法访问了,但是在使用此属性的时候必须注意,虽然习惯上将页面范围称为page范围,但是实际操作的时候是使用pageContext内置对象完成的。
pageContext从字面上的定义,可以发现,是表示一个页面的上下文,可以表示一个页面中的所有内容,pageContext属性范围表示如下图所示:
实例如下:
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>PageContext属性范围</title>
</head>
<body>
<%--
通过使用pageContext.setAttribute()内置对象设置属性name和date
--%>
<%
pageContext.setAttribute("name","李海超");
pageContext.setAttribute("date",new Date());
%>
<%--
通过使用pageContext.getAttribute()内置对象取得name和date两个属性的值
--%>
<%
String rename = (String)pageContext.getAttribute("name");
Date redate = (Date)pageContext.getAttribute("date");
%>
<%--
输出属性的值
--%>
<h1>姓名:<%=rename %></h1>
<h1>日期:<%=redate %></h1>
</body>
</html>
页面结果:
从以上结果可以看出,在同一个页面中可以取得我们设置的PageContext属性的值
但是如果我们将此页面进行了forward跳转后将不能得到此属性的值,值为空(null),因为此时是使用了forward跳转,是服务器端的跳转,从而证明page属性只能在本页中被使用,跳转后将不能使用。如果希望跳转后依然可以使用那就使用request属性范围即可
|---Request属性:表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直跳转下去
request属性范围应用实例:
属性设置页面----requestdemo.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>PageContext属性范围</title>
</head>
<body>
<%--
通过使用pageContext.setAttribute()内置对象设置属性name和date
--%>
<%
request.setAttribute("name","李海超");
request.setAttribute("date",new Date());
%>
<%--
对页面进行跳转
--%>
<jsp:forward page="request_forward.jsp"></jsp:forward>
</body>
</html>
结果处理页面---reqeust_forward.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>PageContext属性范围</title>
</head>
<body>
<%--
通过使用request.getAttribute()内置对象取得属性name和date
--%>
<%
String rename=(String)request.getAttribute("name");
Date date =(Date)request.getAttribute("date");
%>
<%--
对页面进行跳转
--%>
<h1>姓名:<%=rename %></h1>
<h1>年龄:<%=date %></h1>
</body>
</html>
显示效果截图:
如果在第二个页面中继续使用<jsp:forward page="" />标签跳转到第三个页面,那么在第三个页面中依然可以使用request.getAttribute()方法获取第一个页面中设置的值,但是如果是使用超链接导向第三个页面的话讲不能获取到值
|---Session范围用图表示如下:session属性范围不管页面如何跳转都是可以取得的,但是只针对一个用户,知道浏览器关闭
|---application属性范围:此属性范围是在服务器上设置一个范围,所以一旦设置后所有用户都可以访问此属性,直到此服务器关闭
|---关于pageContext属性的进一步研究
以上的四中属性其实都是通过pageContext属性一起设置上的,pageContext类中有一个setAttribute()方法被重载了
public void setAttribute(String name,Object o ,int scope)此方法中存在一个整型的scope变量,此变量就是用来设置各属性的保存范围
应用实例:
属性设置页面中使用了静态变量,PageContext.REQUEST_SCOPE来表示此pageContext的属性设置为request属性范围
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>PageContext属性范围</title>
</head>
<body>
<%--
通过使用pageContext.setAttribute()内置对象设置属性name和date
--%>
<%
pageContext.setAttribute("name","李海超",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE);
%>
<%--
对页面进行跳转
--%>
<jsp:forward page="pagecontext_forward.jsp"></jsp:forward>
</body>
</html>
属性获取页面中使用request.getAttribute()方法,而不是pageContext.getAttribute()方法
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <%@ page contentType="text/html; charset=GBK" %> <html> <head> <title>PageContext属性范围</title> </head> <body> <%-- 通过使用request.getAttribute()内置对象取得属性name和date --%> <% String rename=(String)request.getAttribute("name"); Date date =(Date)request.getAttribute("date"); %> <%-- 对页面进行跳转 --%> <h1>姓名:<%=rename %></h1> <h1>年龄:<%=date %></h1> </body> </html>