一.JSP内置对象分类
在JSP2.0规范中一共定义了9种内置对象。这些对象可以不用进行显式的声明,而可以直接引用,不需要使用代码来创建其实例,而可以在程序中直接使用。JSP包含的9个内置对象及其对象类型、作用域如下表所示。
内置对象 | 类型 | 作用域 |
request | javax.servelt.HttpServletRequest | request |
response | javax.servelt.HttpServletResponse | response |
pageContext | javax.servelt.jsp.PageContext | page |
session | javax.servlet.http.HttpSession | session |
application | javax.servlet.jsp.ServletContext | application |
out | javax.servlet.jsp.JspWriter | page |
config | javax.servlet.ServletConfig | page |
page | java.lang.Object | page |
exception | java.lang.Throwable | page |
根据各对象的作用不同,可以将这9个对象分为如下4类。
第一类:与Servlet有关的内置对象。
包括page和config两个对象。
第二类:与Input/Output有关的内置对象。
包括out、request和response三个对象。
第三类:与Context有关的内置对象。
包括sesion、application、和pageContext三个对象。
第四类:与Error有关的内置对象。
仅包括exception这一个对象。
二.属性保存范围
在JSP中可以通过setAttribute()和getAttribute()这两个方法来设置和取得属性,从而实现数据的共享。同样,JSP中提供了4种属性保存范围,分别为page、request、session及application。
1.page范围
所谓page范围,就是指设置的属性只在当前页面有效。通过使用pageContext的setAttribute()方法来设置属性,并通过pageContext的getAttribute()方法来取得属性。
示例:PageScopeDemo.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>page范围</title>
</head>
<body>
<%-- 在page范围设置属性 --%>
<%
pageContext.setAttribute("name","James"); //设置属性name,其值为James
%>
<%-- 取得page范围属性 --%>
<%
String strName = (String)pageContext.getAttribute("name"); //取值属性name的值
out.println("page范围:name属性值为"+strName); //输出字符串strName的值
%>
</body>
</html>
运行结果:
如果设置属性的范围为page,其他页面是无法取得page范围的属性的。
示例:PageScopeDemo2.jsp
<%@ page language="java" contentType="text/html;charset=gb2312" %>
<html>
<head>
<title>page范围</title>
</head>
<body>
<%-- 取得page范围属性 --%>
<%
String strName = (String)pageContext.getAttribute("name");
out.println("page范围:name属性值为" + strName);
%>
</body>
</html>
运行结果:
2.request范围
所谓request范围,就是指属性在一次请求范围内有效。如果页面从一个页面跳转到另一个页面,那么该属性就失效了,这里所指的跳转是指客户端跳转,比如客户单机超链接跳转到其他页面,或者通过浏览器地址栏浏览其他网页。如果使用服务器端跳转<jsp:forward>,则该属性仍然有效。通过使用request的setAttribute()方法来设置属性,并通过request的getAttribute方法来取得属性。
下面是一个在跳转页面获得request范围属性的示例。
示例RequestScopeDemo.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>request范围</title>
</head>
<body>
<%-- 在request范围设置属性 --%>
<%
request.setAttribute("name","James"); //设置属性name,其值为James
%>
<a href="RequestScopeDemo2.jsp">跳转到RequestScopeDemo2.jsp
</a>
</body>
</html>
RequestScopeDemo2.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>request范围</title>
</head>
<body>
<%-- 在request范围设置属性 --%>
<%
String strName = (String) request.getAttribute("name"); //设置属性name,其值为James
out.println("request范围:name属性值为" + strName); //s输出name属性值
%>
</body>
</html>
运行结果:
如果使用客户端跳转,则无法获得request范围的属性,但是如果使用的是服务器端跳转,则仍然可以获得request范围属性。
示例:RequestScopeDemo.jsp
<%@ page language="java" contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>request范围</title>
</head>
<body>
<%-- 在request范围设置属性 --%>
<%
request.setAttribute("name","James"); //设置属性name,其值为James
%>
<%-- 使用forward动作指令执行跳转 --%>
<jsp:forward page="RequestScopeDemo2.jsp"></jsp:forward>
</body>
</html>
运行结果:
3.session范围
所谓session范围,也就是指客户浏览器与服务器一次会话范围内,如果和服务器断开链接,那么这个属性也就失效了。通过使用session的setAttribute()方法来设置属性,并通过session的getAttribute()方法来取得属性。
示例:SessionScopeDemo.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>session范围</title>
</head>
<body>
<%-- 在session范围设置属性 --%>
<%
session.setAttribute("name","James");
%>
<%-- 添加页面链接,用来跳转到SessionScopeDemo2.jsp --%>
<a href="SessionScopeDemo2.jsp">SessionScopeDemo2.jsp</a>
</body>
</html>
SessionScopeDemo2.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>session范围</title>
</head>
<body>
<%-- 在session范围设置属性 --%>
<%
String strName = (String) session.getAttribute("name");
out.println("session范围:name属性值为" + strName);
%>
</body>
</html>
运行结果:
无论是客户端跳转还是服务器端跳转,都能够获得session范围的属性。但是如果重新打开浏览器,就不能获得session范围属性了,因为会话已经结束。
4.application范围
所谓application范围,也就是指在整个服务器范围,直到服务器停止以后才会失效。通过使用application的setAttribute()方法来设置属性,并通过application的getAttribute()方法来取得属性。
示例:ApplicationScopeDemo.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>application范围</title>
</head>
<body>
<%-- 在Application范围设置属性 --%>
<%
application.setAttribute("name","James");
%>
<%-- 添加页面链接,用来跳转到ApplicationScopeDemo2.jsp --%>
<a href="ApplicationScopeDemo2.jsp">ApplicationScopeDemo2.jsp</a>
</body>
</html>
ApplicationScopeDemo2.jsp
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>application范围</title>
</head>
<body>
<%-- 在application范围设置属性 --%>
<%
String strName = (String) application.getAttribute("name");
out.println("application范围:name属性值为" + strName);
%>
</body>
</html>
运行结果:
application范围保存的属性只要服务器不重启,就能够在任意页面中获得,就算是重新打开浏览器也是可以的。
5.移除属性
只需调用相应对象的removeAttribute()方法就可以移除指定属性。
示例:RemoveAttributeDemo.jsp
<%@ page language ="java" contentType="text/html;charset=gb2312"%>
<html>
<head>
<title>移除属性</title>
</head>
<body>
<%-- 在page范围设置属性 --%>
<%
pageContext.setAttribute("name","James"); //设置属性name,其值为James
pageContext.setAttribute("age","12"); //设置属性age,其值为12
pageContext.setAttribute("sex","男"); //设置属性sex,其值为男
%>
<%-- 移除属性 --%>
<%
pageContext.removeAttribute("sex");
%>
<%-- 取得page范围属性 --%>
<%
String strName = (String)pageContext.getAttribute("name"); //取得属性name的值
String strAge = (String)pageContext.getAttribute("age"); //取得属性age的值
String strSex = (String)pageContext.getAttribute("sex"); //取得属性sex的值
out.println("page范围:name属性值为" + strName+ "<br>"); //输出字符串strName的值
out.println("page范围:age属性值为" + strAge + "<br>"); //输出字符串strAge的值
out.println("page范围:sex属性值为" + strSex+ "<br>"); //输出字符串strSex的值
%>
</body>
</html>
运行结果:
因为sex属性值被移除了,所以显示属性值为null,其他属性的属性值都能够正常显示。