1、Jsp 的隐式对象和 EL 的隐式对象学习2009-09-02 21:48JSP 共有九大内置对象:(1) HttpSession 类的 session 对象作用:主要用于来分别保存每个用户信息,与请求关联的会话;会话状态维持是 Web 应用开发者必须面对的问题。(2) HttpServletRequest 类的 request 对象作用:代表请求对象,主要用于接受客户端通过 HTTP 协议连接传输到服务器端的数据。(3) HttpServletResponse 类的 respone 对象作用:代表响应对象,主要用于向客户端发送数据(4) JspWriter 类的 out 对象作用:主要用于向
2、客户端输出数据; Out 的基类是 javax.servlet.jsp.JspWriter(5) ServletContext 类的 application 对象作用:主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器中的多个用户共享一个 application 对象,故其保存的信息被所有用户所共享.(6) PageContext 类的 pageContext 对象作用:管理网页属性,为 JSP 页面包装页面的上下文,管理对属于 JSP 中特殊可见部分中已命名对象的访问,它的创建和初始化都是由容器来完成的。(7) ServletConfig 类的 config 对象作
3、用:代码片段配置对象,表示 Servlet 的配置。(8) Object 类的 page(相当于 this)对象作用:处理 JSP 网页,是 Object 类的一个实例,指的是 JSP 实现类的实例,即它也是 JSP 本身,只有在JSP 页面范围之内才是合法的。(9)Exception作用:处理 JSP 文件执行时发生的错误和异常EL 共有 11 大内置对象:JSP 开发人员可以在 EL 表达式中使用 EL 隐式对象,而无须任何显式的编码活声明。隐式对象就是设计用来为 JSP 编程提供方便的,通过隐式对象,用 EL 编写的代码就可以直接使用 JSP 页面的一些最常用的地方。总共有 11 个隐式
4、对象,这 11 个隐式对象可以分为 5 大类:JSP 隐式对象。作用域访问隐式对象。参数访问隐式对象。首部访问隐式对象。初始化参数访问隐式对象。JSP 隐式对象类中只有一个 EL 隐式对象,这就是 pageContext 隐式对象。这与同名的 JSP 隐式对象实际上就是同一个对象。余下的 EL 隐式对象都是 Java 映射(map),他们只是提供了更容易的途径来访问pageContext 隐式对象的某些性质。共有 4 个作用域隐式对象,分别为 pageScope, requestScope, sessionScope 和 applicationScope. 这些隐式对象都是映射,利用他们可以很
5、容易的访问作用域属性。例如:附加到 request 作用域的 username属性可以通过 EL 表达式$ requestScope.username来直接访问。有两个参数访问隐式对象,可以用来访问 HTTP 请求参数(表单提交参数),即 param 和 paramValues. param 是一个用于访问单值参数的映射, paramValues 则可用于访问可能包含多个值的参数。接下来的实验会展示这将如何处理。有 3 个首部访问隐式对象,可以用于访问 HTTP 首部,分别是 header, headerValues 和 cookie。如果想以原始的方式访问 HTTP 首部或 cookie,
6、这些映射就很有用。另外还有一个初始化参数访问隐式对象:initParm。这个映射可以用于访问初始化参数的值,初始化参数的值一般都在 web.xml 中设置。类别 标识符 描述JSP pageContext PageContext 实例对应于当前页面的处理pageScope 与页面作用域属性的名称和值相关联的 Map 类requestScope 与请求作用域属性的名称和值相关联的 Map 类sessionScope 与会话作用域属性的名称和值相关联的 Map 类作用域applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类param 按名称存储请求参数的主要值的 Ma
7、p 类请求参数paramValues 将请求参数的所有值作为 String 数组存储的 Map 类header 按名称存储请求头主要值的 Map 类请求头headerValues 将请求头的所有值作为 String 数组存储的 Map 类Cookie cookie 按名称存储请求附带的 cookie 的 Map 类初始化参数initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类其实我的主要目的是为了搞清楚 pageContext 对象,如下:Jsp 中 pageContext 的作用pageContext 隐含物件对应於 javax.servlet.jsp.PageCo
8、ntext 型态之物件,隐含物件都自动的被加入至 pageContext 中,您可以藉由它来取得与 JSP 相关的隐含物件对应之 Servlet 物件,像是 getRequest()可以取得 ServletRequest, getServletConfig()可以取得 ServletConfig,getSession()可以取得HttpSession 等等。提供取得隐含物件对应之 Servlet 物件并不是 pageContext 的主要作用,它的主要功能在提供一个单一个介面,以管理各种的公开物件(像是 HttpSession、ServletContext、ServletConfig、Serv
9、letRequest、ServletResponse 等等),提供一个单一的 API 来管理属性作用范围等等。 我们之前曾经使用过 session 的 setAttribute()等方法设定一个进程可以共用的属性物件,使用 session设定的属性在同一个进程中可以共用,除了 session 之外,还有 pageContext、 request、application也都可以使用 setAttribute()之类的方法(详请查阅 API 文件)来设定可以共用的属性物件,只不过这四个物件所设定的属性其共用范围各不相同。 使用 pageContext 所设定的属性物件,其共用范围限於同一个 JSP
10、 页面,使用 request 所设定的属性物件,其在同一个 request 处理期间可以共用(包括 forward 给其它 JSP 页面),session 物件所设定的属性物件则限於同一个进程作用期间可以共用,而 application 物件所设定的属性,则在整个 Web 应用程式中的JSP 页面都可以共用。 以下举 application 为例,您可以将一些物件当作属性设定给 application,则另一个 JSP 页面就可以在适当的时候取得这个属性物件,例如: 我们先连上这个 JSP 网页以执行属性设定,然后我们再连上这个 JSP 网页: 由於我们之前已经将字串物件设定在 applica
11、tion 中作为属性,所以我们可以在上面这个页面中取得之前设定的物件,同样的道理,您也可以用相同的方式设定属性给 pageContext、request、session 等物件,只要在允许的作用范围中,就可以取得所设定的属性物件。 您可以使用 pageContext 物件来设定属性,并指定属性的作用范围,而不用使用个别的pageContext、request、session、 application 来进行设定,这就是之前所提的,以 pageContext 提供一个单一的 API 来管理属性作用范围,您可以使用以下的方法来进行设定: getAttribute(String name, int
12、scope) setAttribute(String name, Object value, int scope) removeAttribute(String name, int scope) 其中的 scope 可以使用以下的常数来进行指定:pageContext.PAGE_SCOPE、pageContext.REQUEST_SCOPE、 pageContext.SESSION_SCOPE、pageContext.APPLICATION_SCOPE,常数的名称已经直接指明属性范围,我们可以将上面的两个 JSP 页面改为以下的形式: JSP 隐式对象和 EL 隐式对象 2008-07-04
13、16:49:59 JSP 隐式对象:首先要了解什么是 JSP 隐式对象,它是 Web 容器加载的一组类的实例,它不像一般的 Java 对象那样需要“new”去获取实例,而是直接就可以在 JSP 页面中使用的对象。JSP 提供的隐式对象分为 4 个主要类别,如下介绍:1、输入和输出对象:request、response 和 out 对象。2、作用域通讯对象:session、application、pagecontext。3、servlet 对象:config 和 page。4、错误对象:exception。EL 隐式对象的标识符不要将这些对象与 JSP 隐式对象(一共只有九个)混淆,其中只有一个
14、对象是它们所共有的。EL 隐式对象类别 标识符 描述 JSP pageContext PageContext 实例对应于当前页面的处理 作用域 pageScope 与页面作用域属性的名称和值相关联的 Map 类 requestScope 与请求作用域属性的名称和值相关联的 Map 类 sessionScope 与会话作用域属性的名称和值相关联的 Map 类 applicationScope 与应用程序作用域属性的名称和值相关联的 Map 类 请求参数 param 按名称存储请求参数的主要值的 Map 类 paramValues 将请求参数的所有值作为 String 数组存储的 Map 类 请求
15、头 header 按名称存储请求头主要值的 Map 类 headerValues 将请求头的所有值作为 String 数组存储的 Map 类 Cookie cookie 按名称存储请求附带的 cookie 的 Map 类 初始化参数 initParam 按名称存储 Web 应用程序上下文初始化参数的 Map 类 尽管 JSP 和 EL 隐式对象中只有一个公共对象( pageContext ),但通过 EL 也可以访问其它 JSP 隐式对象。原因是 pageContext 拥有访问所有其它八个 JSP 隐式对象的特性。实际上,这是将它包括在 EL 隐式对象中的主要理由。 其余所有 EL 隐式对象
16、都是映射,可以用来查找对应于名称的对象。前四个映射表示先前讨论的各种属性作用域。可以用它们来查找特定作用域中的标识符,而不用依赖于 EL 在缺省情况下使用的顺序查找过程。接下来的四个映射用来获取请求参数和请求头的值。因为 HTTP 协议允许请求参数和请求头具有多个值,所以它们各有一对映射。每对中的第一个映射返回请求参数或头的主要值,通常是恰巧在实际请求中首先指定的那个值。每对中第二个映射允许检索参数或头的所有值。这些映射中的键是参数或头的名称,但这些值是 String 对象的数组,其中的每个元素都是单一参数值或头值。 cookie 隐式对象提供了对由请求设置的 cookie 名称的访问。这个对
17、象将所有与请求相关联的 cookie 名称映射到表示那些 cookie 特性的 Cookie 对象。 最后一个 EL 隐式对象 initParam 是一个映射,它储存与 Web 应用程序相关联的所有上下文的初始化参数的名称和值。初始化参数是通过 web.xml 部署描述符文件指定的,该文件位于应用程序的 WEB-INF 目录中。 最近更新时间:2008-07-04 16:49:59 浏览数(136) 下一篇: 奥运再见 上一篇: 由书籍到电子文本 JSP 标准标记库基础知识学习(2)作者: 来源: 发布时间:07-12-18 浏览: 45939 次 因为请求时属性值是用表达式指定的,所以它们往
18、往有和其它脚本元素一样的软件维护问题。因此,JSTL 定制标记支持另一种用于指定动态属性值的机制。可以用简化的表达式语言(EL)而不使用完整的 JSP 表达式来指定 JSTL 操作的属性值。EL 提供了一些标识符、存取器和运算符,用来检索和操作驻留在 JSP 容器中的数据。EL 在某种程度上以EcmaScript(请参阅参考资料)和 XML 路径语言(XML Path Language,XPath)为基础,因此页面设计人员和程序员都应该熟悉它的语法。EL 擅长寻找对象及其特性,然后对它们执行简单操作;它不是编程语言,甚至不是脚本编制语言。但是,与 JSTL 标记一起使用时,它就能使用简单而又方
19、便的符号来表示复杂的行为。EL 表达式的格式是这样的:用美元符号($ )定界,内容包括在花括号()中,如清单 3 所示。 Page清单 3. 说明 EL 表达式定界符的 JSTL 操作 ; 此外,您可以将多个表达式与静态文本组合在一起以通过字符串并置来构造动态属性值,如清单 4 所示。单独的表达式由标识符、存取器、文字和运算符组成。标识符用来引用存储在数据中心中的数据对象。EL 有 11 个保留标识符,对应于 11 个 EL 隐式对象。假定所有其它标识符都引用限制了作用域的变量。存取器用来检索对象的特性或集合的元素。文字表示固定的值 数字、字符、字符串、布尔型或空值。运算符允许对数据和文字进行
20、组合以及比较。 清单 4. 组合静态文本和多个 EL 表达式以指定动态属性值 ; 限制了作用域的变量 JSP API 通过 ; 操作允许从 JSP 容器内的四个不同作用域中存储和检索数据。 JSTL 通过提供用于指定和除去这些作用域中的对象的附加操作来扩展这一能力。此外,EL 提供将这些对象作为限制了作用域的变量进行检索的内置支持。特别地,任何出现在 EL 表达式中但不对应于任何 EL 隐式对象的标识符,都被自动假定为引用存储在四个 JSP 作用域的其中某个中的对象,这四个作用域是: 页面作用域 请求作用域 会话作用域 应用程序作用域 您可能还记得,只有在为特定请求处理页面期间才能检索存储在该
21、页面作用域中的对象。如果对象是存储在请求作用域中的,可以在处理所有参与处理某请求的页面期间检索这些对象(譬如在对某个请求的处理中遇到了一个或多个 ; 或 ; 操作)。如果对象是存储在会话作用域中的,则在与 Web 应用程序的交互式会话期间,可以由用户访问的任何页面检索它(即,直到与该用户交互相关联的 HttpSession 对象无效为止)。可以由任何用户从任何页面访问存储在应用程序作用域中的对象,直到卸载Web 应用程序本身为止(通常是由于关闭 JSP 容器所致)。 通过将字符串映射为期望作用域中的对象来将对象存储到该作用域。然后,就可以通过提供相同字符串来从该作用域检索该对象。在作用域的映射
22、中查找字符串,并返回被映射的对象。在 Servlet API 中,将此类对象称为相应作用域的属性。但是,在 EL 的上下文中,也将与属性相关联的字符串看作变量的名称,该变量通过属性映射的方式获得特定的值。在 EL 中,与隐式对象无关联的标识符被认为是存储在四个 JSP 作用域中的名称对象。首先对页面作用域检查是否存在这样的标识符,其次对请求作用域、然后对会话作用域、最后对应用程序作用域依次进行这样的检查,然后测试该标识符的名称是否与存储在该作用域中的某个对象的名称匹配。第一个这样的匹配作为 EL 标识符的值被返回。通过这种方法,可以将 EL 标识符看作引用限制了作用域的变量。 Page从更技术
23、的方面来说,没有映射到隐式对象的标识符是用 PageContext 实例的findAttribute() 方法求值的,该实例表示对页面的处理,在该页面上,当前正在处理用于请求的表达式。标识符的名称作为参数传递给这个方法,然后该方法依次在四个作用域中搜索具有相同名称的属性。并将所找到的第一个匹配项作为 findAttribute() 方法的值返回。如果未在这四个作用域中找到这样的属性,则返回 null。 最终,限制了作用域的变量是四个 JSP 作用域的属性,这些属性具有可以用作 EL 标识符的名称。 只要对限制了作用域的变量赋予由字母数字组成的名称,就可以通过 JSP 中提供的用于设置属性的 任何机制来创建它们。这包括内置的 ; 操作,以及由 Servlet API 中的几个类定义的 setAttribute() 方法。此外,四个 JSTL 库中定义的许多定制标记本身就能够设置作为限制了作用域的变量使用的属性值。 隐式对象 表 1 中列出了 11 个 EL 隐式对象的标识符。不要将这些对象与 JSP 隐式对象(一共只有九个)混淆,其中只有一个对象是它们所共有的。 表 1. EL 隐式对象 类别 标识符 描述 JSP pageContext PageContext 实例对应于当前页面的处理 作用域 pageScope 与页面作用域属性的名称和值相关联的 Map 类