jsp为了简化开发,提供了9种内置对象,这些内置对象将由容器为用户进行实例化,直接调用即可,不用java程序那样使用new关键字进行实例化后才可以使用:
- 九种内置对象
No | 内置对象 | 类型 | 描述 |
1 | pageContext | javax.servlet.jsp.PageContext; | jsp的页面容器 |
2 | request | import javax.servlet.http.HttpServletRequest; | 得到用户的请求信息 |
3 | response | import javax.servlet.http.HttpServletResponse; | 服务器想客户端的响应信息 |
4 | session | javax.servlet.http.HttpSession; | 保存每一个用户的信息 |
5 | application | javax.servlet.ServletContext; | 表示所有用户的共享信息 |
6 | config | javax.servlet.ServletConfig; | 服务器配置,可以取得初始化参数 |
7 | out | javax.servlet.jsp.JspWriter; | 页面输出 |
8 | page | java.lang.Object | 表示从该页面中表示出来的一个servlet实例 |
9 | exception | java.lang.Throwable | 表示jsp页面所发生的异常,只有在错误页中才有效 |
- 四种属性保存范围
什么是属性保存范围?
就是一个内置的对象,可以在多少个页面中保存并继续使用;
- page:只在一个页面中保存属性,跳转后无效;
- request:只在一次请求中保存,服务器跳转后依然后效;
- session:在一次会话范围中,无论何种跳转都可以使用,但是新开的浏览器无法使用;
- application:在整个服务器上保存,所有用户都可以使用;
1,page属性范围(pageContext)
表示将一个属性设置在本页上,跳转之后无法取得;
例如:pageScope.jsp:(设置和取得page范围的属性)
<body>
<% //设置page属性范围,此属性只在当前的JSP页面中起作用
pageContext.setAttribute("name","keith");
pageContext.setAttribute("date",new Date());
%>
<% //从page中取出属性,并执行向下转型操作
String username = (String)pageContext.getAttribute("name");
Date time = (Date)pageContext.getAttribute("date");
%>
<h2>username:<%=username%></h2><%--取得属性内容 --%>
<h2>time:<%=time%></h2>
</body>
会输出:
username:keith
time:Tue Jan 11 22:08:28 CST 2011
验证下page的范围(page.jsp):
<body>
<% //设置page属性范围,此属性只在当前的JSP页面中起作用
pageContext.setAttribute("name","keith");
pageContext.setAttribute("date",new Date());
%>
<jsp:forward page="pageScope.jsp"></jsp:forward>
</body>
看下pageScope.jsp:
<body>
<% //从page中取出属性,并执行向下转型操作
String username = (String)pageContext.getAttribute("name");
Date time = (Date)pageContext.getAttribute("date");
%>
<h2>username:<%=username%></h2><%--取得属性内容 --%>
<h2>time:<%=time%></h2>
</body>
这个时候,输出的全是null值;因为page范围在跳转后无效;
深入page属性范围:
page属性范围中使用的是pageContext进行属性设置的,但是javax.servlet.jsp.PageContext类中可以发现,有这样的一个方法:public void setAttribute(String name,Object value,int scope);与之前所使用的setAttribute()方法不同,在这个方法里面有一个int整型变量,此变量就可以指定一个属性的保存范围,在pageContext类中存在4个表示属性范围的常量,可以直接通过这些常量指定scope的内容;如:
No | 方法 | 类型 | 描述 |
1 | public static final int PAGE_SCOPE | 常量 | 表示page属性范围,默认 |
2 | public static final int REQUEST_SCOPE | 常量 | 表示request属性范围 |
3 | public static final int SESSION_SCOPE | 常量 | 表示session属性范围 |
4 | public static final int APPLICATION_SCOPE | 常量 | 表示application属性范围 |
<% //设置page属性范围,此属性只在当前的JSP页面中起作用
pageContext.setAttribute("name","keith",PageContext.REQUEST_SCOPE);
pageContext.setAttribute("date",new Date(),PageContext.REQUEST_SCOPE);
%>
<jsp:forward page="pageScope.jsp"></jsp:forward>
当跳转到pageScope.jsp页面时,会接受到值,实际上pageContext对象可以设置任意范围的属性,而其他操作也只是对这一功能再包装而已;但是一般还是将pageContext只保存一页的范围属性;
2,request的属性范围!
在服务器端跳转后想让属性继续保存下来,则可以使用request属性范围操作(request属性范围表示服务器跳转后,所有设置的内容依然会被保留下来);
测试,request.jsp:
<body>
<%
request.setAttribute("name","keith");
request.setAttribute("date",new Date());
%>
<jsp:forward page="requestScope.jsp"></jsp:forward>
</body>
requestScope.jsp:
<body>
<%
String name = (String)request.getAttribute("name");
Date date = (Date)request.getAttribute("date");
%>
username:<%=name %>
time:<%= date %>
</body>
输出的结果是:username:keith time:Tue Jan 11 22:18:42 CST 2011;以为request在一次服务器跳转范围内有效,所有requestScope.jsp是可以取到属性的;如果将其超连接换成:
<a href="requestScope.jsp"></a>
是无法取到的,因为它不是一个服务器跳转;
理解:request表示客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这时如果是服务器端跳转,请求的地址栏没有改变,所有也就相当于回应了一次,如果地址栏改变了,则相当于发出了第二次请求,则第一次请求的内容肯定就已经消失了,所有无法获取;
3,session的属性范围;
如果希望一个属性在设置后,可以在任何一个与设置页面相关的页面中取得,则可以使用session属性范围。使用session设置属性后,不管是客户端跳转还是服务器端跳转,只要属性设置了就可以取得;
测试,session.jsp:
<body>
<%
session.setAttribute("name","keith");
session.setAttribute("date",new Date());
%>
<%
String name = (String)session.getAttribute("name");
Date date = (Date)session.getAttribute("date");
%>
name: <%= name%>
date:<%=date %>
<br>
<a href="sessionScope.jsp">sessionScope测试</a>
</body>
本也显示的内容:
name: keith date:Tue Jan 11 22:30:52 CST 2011
sessionScope测试
指定连接的sessionScope.jsp:
<body>
<%
String name = (String)session.getAttribute("name");
Date date = (Date)session.getAttribute("date");
%>
name: <%= name%>
date:<%=date %>
</body>
则输出的结果是:
name: keith date:Tue Jan 11 22:30:52 CST 2011
此时如果在打开一个新的浏览器直接访问sessionScope.jsp则无法获取session属性;
4,application属性范围
如果希望一个属性可以让所有的用户(每一个session)都看得见;则可以将这个属性设置成application,这样属性即可保存在服务器上;
测试:application.jsp:
<body>
<%
application.setAttribute("name","keith");
application.setAttribute("date",new Date());
%>
<a href="applicationScope.jsp">applicationScope测试</a>
</body>
applicationScope.jsp:
<%
String name = (String)application.getAttribute("name");
Date date = (Date)application.getAttribute("date");
%>
name:<%=name %>
date:<%=date %>
输出结果:
name:keith date:Tue Jan 11 22:39:49 CST 2011
无论你重新打开浏览器,还是直接根据URL跳转,都可以获取到application的值(如果服务器重启的话,application属性值将消失);application范围的属性设置过多会影响服务器性能。因为application属性范围是将属性设置到一个服务器中!