在JSP之中,已经专门为用户的使用提供了许多的内置对象,所谓的内置主要指所有的对象不用再由用户自己进行对象的实例化操作,而可以直接进行使用。WEB容器为用户准备好了这些内置对象。
在JSP中为了简化用户的开发,提供了九个内置对象,这些内置对象将由容器为用户进行实例化,而用户直接使用即可,而不用像在java中那样,必须通过关键字new进行实例化对象之后才可以使用。
例如,之前学习的request,有一个接收参数的方法:public String getParameter(String paramName),实际上对于request本身就是一个内置对象。
WEB容器为用户准备好了这些内置对象。

前面的5个最为重要。
Request中有getParameter()方法,那么这个方法要想查询,不能直接查request,要通过javax.servlet.http.HttpServletRequest接口完成。
如果要想进行这些方法的查询,必须通过JAVAEE文档。
JSP内置对象—四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是一个设置的对象,可以在多少个页面中保存并可以继续使用。
四种属性范围:
1):pageContext:只在一个页面中保存属性,跳转之后无效。
2):request:只在一次请求中保存,服务器跳转后依然有效。
3):session:在一次会话范围中,无论何种跳转都可以使用,但是新开浏览器无法使用。
4):application:在整个服务器上保存,所有用户都可以使用。

四个内置对象,每个都有以上三个属性操作方法。
设置属性的时候属性的名称是String,而属性的内容是Object,很明显,可以设置任意的内容。
通过代码来验证各个属性范围的特点。
1.Page属性范围(pageContext范围)
Page属性范围(使用pageContext表示,但是一般来讲都习惯于将这种范围称为page范围)表示将一个属性设置在本页上,跳转之后无法取得。
【scope_01.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<% //设置属性
pageContext.setAttribute(“name”,”斜雨”);
pageContext.setAttribute(“birthday”,new Date());
%>
<%
String username = (String)pageContext.getAttribute(“name”);
Date userbirthday = (Date)pageContext.getAttribute(“birthday”);
%>
姓名:<%=username%>
生日:<%=userbirthday%>
执行此代码的结果如下所示:

现在发生了服务器跳转之后,发现内容无法取得了,则一个page范围中的内容只能保存在一个页面。例子如下:
【scope_02.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<% //设置属性
pageContext.setAttribute(“name”,”斜雨”);
pageContext.setAttribute(“birthday”,new Date());
%>
【scope_03.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
String username = (String)pageContext.getAttribute(“name”);
Date userbirthday = (Date)pageContext.getAttribute(“birthday”);
%>
姓名:<%=username%>
生日:<%=userbirthday%>
执行scope_02.jsp的结果如下所示:

如果现在希望服务器端跳转后可以继续取得属性,则可以将范围扩大到request。
2.Request属性范围
如果要在服务器跳转之后属性可以继续保存下来,则可以使用request属性范围操作,request属性范围表示的是在服务器跳转之后,所有设置的内容依然会被保留下来。
【re-scope_01.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<% //设置属性
request.setAttribute(“name”,”斜雨”);
request.setAttribute(“birthday”,new Date());
%>
【re-scope_02.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
String username = (String)request.getAttribute(“name”);
Date userbirthday = (Date)request.getAttribute(“birthday”);
%>
姓名:<%=username%>
生日:<%=userbirthday%>
执行re-scope_01.jsp的结果如下所示:

页面跳转之后,可以取得了,而且如果现在一直有服务器跳转,则可以一直传递下去,但是如果换了一种形式,使用超链接进行页面的跳转,首先地址栏会发生改变,一旦地址栏发生改变的跳转,都统一称为客户端跳转,客户端跳转是无法传递request属性的。
使用超链接:
将re-scope_01.jsp的如下内容:
更改为:
则发生的是客户端跳转,而且不能传递参数。
关于request属性范围的理解:
Request表示的是客户端的请求,正常情况下,一次请求服务器只会给予一次回应,那么这个时候如果是服务器端跳转,请求的地址栏没有改变,所以也就相当于回应了一次,而如果地址栏改变了,就相当于是发出了第二次请求,则第一次请求的内容肯定就已经消失了,所以无法取得。
所以,如果是客户端跳转,则就相当于发出了两次请求,那么肯定第一次的请求将不再存在。如果现在希望不管是服务器端还是客户端跳转,都可以保存的话,则就可以继续扩大范围,扩大到session属性范围。
3.Session属性范围
如果现在希望一个属性设置之后,可以在任何一个与设置页面相关的页面中取得的话,则就可以使用session属性范围,使用session设置属性之后,不管是客户端跳转还是服务器端跳转,只要属性设置了就都可以取得。
【se-scope_01.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<% //设置属性
session.setAttribute(“name”,”斜雨”);
session.setAttribute(“birthday”,new Date());
%>
【se-scope_02.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<%
String username = (String)session.getAttribute(“name”);
Date userbirthday = (Date)session.getAttribute(“birthday”);
%>
姓名:<%=username%>
生日:<%=userbirthday%>
执行se-scope_01.jsp的结果如下所示:

将语句:
换为:
通过链接取得属性
就变成了客户端跳转。
一般情况下,再打开了一个新的浏览器的话,则就无法取得之前设置的session了,因为每一个session只保存在当前的浏览器之中,并且可以从相关的页面中取得。
对于服务器而言,每一个连接到它的客户端都是一个session。
在打开原来的Chrome浏览器的前提下,再次打开一个新的IE浏览器,复制原来的链接,得到的结果如下:

如果要想让属性设置一次之后,不管是否是新的浏览器打开都可以访问的话,则就可以使用application属性范围了。
Application属性范围
如果现在希望设置一个属性,可以让所有的用户(每一个session)都能看得见的话,则可以将属性范围设置成application,这样属性就保存在了服务器之上了。
只要是通过application设置的属性,则所有的session都可以取得,表示公共的内容,但是如果此时服务器重新启动了,则无法取得了,因为关闭后属性消失,要想再次访问,则可以重新设置。
关闭服务器,再次打开服务器,再次刷新原来的结果页面,发现的内容如下:

既然application属性范围的内容都是保存在了服务器上,如果现在要同时设置很多个application的话,则服务器的性能肯定会有所降低,而且四种属性范围都是保存在服务器的,这个时候就给出了一个原则:能使用page范围的就不要使用request,能使用request的就不要使用session,能使用session的就不要使用application,因为保存范围越窄,则肯定对于服务器的压力就越低。
深入研究page范围:
Page范围是通过pageContext对象设置的,但是在javax.servlet.jsp.pageContext类中可以发现以下的一个设置属性的方法。
Abstract void setAttribute(String name,Object value,int scope);
在PageContext类中存在四个表示属性范围的常量,可以直接通过这些常量指定scope的内容:
Public static final int PAGE_SCOPE
Public static final int REQUEST_SCOPE
Public static final int SESSION_SCOPE
Public static final int APPLICATION_SCOPE
【re-scope_03.jsp的内容如下:】
<%@ page contentType="text/html" pageEncoding="GBK"%>
<%@ page import="java.util.*"%>
<% //设置属性
pageContext.setAttribute(“name”,”斜雨”,PageContext.REQUEST_SCOPE);
pageContext.setAttribute(“birthday”,new Date(),PageContext.REQUEST_SCOPE);
%>
此时是通过pageContext将一个属性设置成了request范围,执行效果与原来的相同。
一定要注意pageContext可以操作四种范围,这一点直接决定于以后的程序开发问题。
小结:
1.四种属性范围是整个WEB的核心操作;
2.属性范围规定了属性的有效范围;
3.PageContext对象可以直接操作四种属性范围。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227974.html原文链接:https://javaforall.net
