jsp内置对象

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页面所发生的异常,只有在错误页中才有效
  • 四种属性保存范围  

什么是属性保存范围?

   就是一个内置的对象,可以在多少个页面中保存并继续使用;

  1. page:只在一个页面中保存属性,跳转后无效;
  2. request:只在一次请求中保存,服务器跳转后依然后效;
  3. session:在一次会话范围中,无论何种跳转都可以使用,但是新开的浏览器无法使用;
  4. 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方法类型描述
1public static  final int PAGE_SCOPE 常量表示page属性范围,默认
2public static final int REQUEST_SCOPE常量表示request属性范围
3public static final int SESSION_SCOPE常量表示session属性范围
4public 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属性范围是将属性设置到一个服务器中!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值