在jsp中已经为用户的应用提供了很多内置的对象;
内置对象共九个:
pageContext: javax.servlet.jsp.PageContext JSP的页面容器
request: javax.servlet.http.HttpServeletRequest 得到用户的请求信息
response: javax.servlet.http.HttpServeletResponse 服务器想客户端的回应信息
session: javax.servlet.http.HttpSession 用来保存每个用户的信息
application: javax.servlet.ServletContext 表示所有用户的共享信息
config: javax.servlet.ServletConfig 服务器配置,可以取得初始化参数
out: javax.servlet.jsp.JspWriter 页面输出
page: java.lang.Object 表示从该页面中表示出来的一个servlet实例
exception: java.lang.Throwable 表示在jsp页面发生的异常,在错误页中才起作用
四种属性范围:
在jsp中提供了四种属性的保存范围,所谓的属性保存范围,指的
就是一个设置的对象,可以再多少个页面中保存并可以继续使用;
四种属性范围:
pageContext:只在一个页面中保存属性,跳转之后无效;
request: 只在一次请求中保存,服务器跳转后依然有效;
session: 在一次回话范围中,无论何种跳转都可以使用,
但是新开浏览器无法使用;
application:在整个服务器上保存,所有用户都可以使用;
public void setAttribute(String name,Object o)
public Object getAttribute(String name)
public void removeAttribute(String name)
四种属性范围都有以上的三个方法;
page属性范围(pageContext范围)
page属性范围(使用pageContext表示,但是一般来讲都习惯于将这种属性范围称为page范围)
表示将一个属性设置在本页上,跳转之后无法取得;
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//设置属性
pageContext.setAttribute("name","lid");
pageContext.setAttribute("birthday",new Date());
%>
<%//取得属性值
String name=(String)pageContext.getAttribute("name");
Date birthday=(Date)pageContext.getAttribute("birthday");
%>
<h1><%=name%></h1>
<h1><%=birthday%></h1>
</body>
</html>
如上,在同一页面上pageContext设置的属性是可以取到的,如果发生跳转就取不到了;
page_scope_02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//设置属性
pageContext.setAttribute("name","lid");
pageContext.setAttribute("birthday",new Date());
%>
<jsp:forward page="page_scope_03.jsp"/>
</body>
</html>
page_scope_03.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//取得属性值
String name=(String)pageContext.getAttribute("name");
Date birthday=(Date)pageContext.getAttribute("birthday");
%>
<h1><%=name%></h1>
<h1><%=birthday%></h1>
</body>
</html>
输出的结果是null,原因是pageContext属性的范围是在本页面内;
request属性范围:
只要是服务器端的跳转,request中设置的属性都可以被访问到;
request_scope_02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//设置属性
request.setAttribute("name","lid");
request.setAttribute("birthday",new Date());
%>
<jsp:forward page="request_scope_03.jsp"/>
</body>
</html>
request_scope_03.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//取得属性值
String name=(String)request.getAttribute("name");
Date birthday=(Date)request.getAttribute("birthday");
%>
<h1><%=name%></h1>
<h1><%=birthday%></h1>
</body>
</html>
以上可以正常显示,如果将<jsp:forward page="request_scope_03.jsp"/>改成<a href="request_scope_03.jsp">显示</a>,
将不会得到request的属性;
session属性范围:无论是服务器跳转还是客户端跳转都可以取得session中属性;
session_scope_02.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//设置属性
session.setAttribute("name","lid");
session.setAttribute("birthday",new Date());
%>
<a href="session_scope_03.jsp">显示</a>
</body>
</html>
session_scope_03.jsp:
<%@ page contentType="text/html" pageEncoding="gbk"%>
<%@ page import="java.util.*"%>
<html>
<head><title>这是测试</title></head>
<body>
<%//取得属性值
String name=(String)session.getAttribute("name");
Date birthday=(Date)session.getAttribute("birthday");
%>
<h1><%=name%></h1>
<h1><%=birthday%></h1>
</body>
</html>
如果换个浏览器 直接打开session_scope_03.jsp这个jsp则就得不到值了,session是在一个回话
中,可以去到其中的属性的;
application属性范围:
供该服务其中的所有用户使用;
在pageContext对象有个方法public void setAttribute(String name,Object o,int scope)
可以设置属性存放的范围:PageContext.APPLICATION_SCOPE、PageContext.PAGE_SCOPE 、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE