1、 理解
JSP中直接执行request.getParameter(),像request这样的对象就称为内置对象,内置是由容器为用户实例化好的,用户直接使用即可。
2、分类
内置对象 类型 作用域
request javax.servlet.http.HttpServletRequest request
response javax.servlet.http.HttpServletResponse page
pageContext javax.servlet.jsp.PageContext page
session javax.servlet.http.HttpSession session
application javax.servlet.ServletContext application
out javax.servlet.jsp.JspWriter page
config javax.servlet.ServletConfig page
page java.lang.Object page
exception java.lang.Throwable page
3、四种属性范围(重点)
所谓的属性范围,就是指一个对象可以跨多少个JSP页面之后可以继续使用。
3.1.1、操作方法
在整个JAVA WEB中属性操作使用如下的方法:
• 设置属性:public void setAttribute(String name,Object attribute)
• 取得属性:public Object getAttribute(String name)
• 删除属性:public Object removeAttribute(String name)
在JSP中有以下四个对象都支持以上的三个方法:
• pageContext
• request
• session
• application
3.1.2、page属性范围
在一个JSP页面上设置的属性只能在一个页面取得,跳转到其他页面则此属性消失。
PageScopeDemo01.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
pageContext.setAttribute("uname","HELLO") ;
pageContext.setAttribute("udate",new Date()) ;
// 取得属性
String name =(String)pageContext.getAttribute("uname") ;
Date date =(Date)pageContext.getAttribute("udate") ;
%>
<h1>name --><%=name%></h1>
<h1>date --><%=date%></h1>
证明:一个页面上设置的属性,只能在本页面中取得。如果现在希望可以在跳转页中取得,则可以扩大范围到request范围上去。
3.1.3、request属性范围
request可以把属性保存在一次服务器跳转范围之中。
RequestScopeDemo01.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
request.setAttribute("uname","HELLO") ;
request.setAttribute("udate",new Date()) ;
%>
<jsp:forwardpage="RequestScopeDemo02.jsp"/>
RequestScopeDemo02.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 取得属性
String name =(String)request.getAttribute("uname") ;
Date date =(Date)request.getAttribute("udate") ;
%>
<h1>name --><%=name%></h1>
<h1>date --><%=date%></h1>
但是,需要注意的是,如果使用了下面的跳转形式,则不能够取得:
RequestScopeDemo03.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
request.setAttribute("uname","HELLO") ;
request.setAttribute("udate",new Date()) ;
%>
<ahref="RequestScopeDemo02.jsp">RequestScopeDemo02.jsp</a>
发现以上程序执行之后,地址栏改变了,但是设置的属性也消失了。如果现在希望无论怎样跳转,属性都可以被保存下来,则就要扩大到session范围
3.1.4、session属性范围
session属性范围无论页面怎样跳转,都可以保存下来,但是只针对于同一个浏览器打开的相关页面。
SessionScopeDemo01.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
session.setAttribute("uname","HELLO") ;
session.setAttribute("udate",new Date()) ;
%>
<ahref="SessionScopeDemo02.jsp">SessionScopeDemo02.jsp</a>
SessionScopeDemo02.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 取得属性
String name =(String)session.getAttribute("uname") ;
Date date =(Date)session.getAttribute("udate") ;
%>
<h1>name --><%=name%></h1>
<h1>date --><%=date%></h1>
可以把每一个用户理解为一个session。如果现在希望所有的用户都可以看见,则就可以继续扩大范围 —— application范围。
3.1.5、application属性范围
application范围,是把属性设置在整个服务器上,所有的用户都可以进行访问。
ApplicationScopeDemo01.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
application.setAttribute("uname","HELLO");
application.setAttribute("udate",new Date()) ;
%>
ApplicationScopeDemo02.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 取得属性
String name =(String)application.getAttribute("uname") ;
Date date =(Date)application.getAttribute("udate") ;
%>
<h1>name --><%=name%></h1>
<h1>date --><%=date%></h1>
如果服务器一关闭,则所有的application属性都消失,属性保存在服务器之上,如果此属性保存的内容过多,则肯定会直接影响到服务器的性能。所以一般尽可能少设置application属性。
3.1.6、pageContext对象的补充
JSP中如果要想设置一个page范围的属性则一定使用pageContext对象,实际上对于整个JSP代码,所有的四种属性范围都是可以通过pageContext对象进行设置的,因为在此对象中的设置属性方法有两个:
• public voidsetAttribute(String name,Object attribute)
设置的属性默认为page范围
• public void setAttribute(Stringname,Object o,int scope)
可以指定属性的范围
|- 在PageContext类中提供了以下几个常量:
|- 表示page范围:public static final int PAGE_SCOPE
|- 表示request范围:public static final int REQUEST_SCOPE
|- 表示session范围:public static final int SESSION_SCOPE
|- 表示application范围:public static final int APPLICATION_SCOPE
下面通过pageContext对象设置一个request范围的属性
RequestScopeDemo04.jsp:
<%@pagecontentType="text/html;charset=GBK"%>
<%@pageimport="java.util.*"%>
<%
// 设置两个属性
pageContext.setAttribute("uname","HELLO",PageContext.REQUEST_SCOPE)
;
pageContext.setAttribute("udate",new
Date(),PageContext.REQUEST_SCOPE) ;
%>
<jsp:forwardpage="RequestScopeDemo02.jsp"/>
使用的原则:
•
因为四种属性范围的保存时间不同,所以占用内存的时间也就不同了,能使用request就不要使用session,一般情况下,request和session两个属性范围使用的频率是最高的。