`
nything
  • 浏览: 144664 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JSP 隐式对象简介

阅读更多

JSP 架构背后的理念是提供一个 Web 组件,它允许开发人员着重关注 Web 内容的表示,而不用陷入解析、编程和数据操纵等细节。JSP 应用程序本质上是特殊的 Web 组件,在处理用户请求之前,J2EE Web 容器首先将其转换成 servlet。在每个 JSP 应用程序内部有一套完整的隐式对象。

隐式对象使得开发人员可以访问容器提供的服务和资源。这些对象之所以定义为 隐式的,是因为您不必显式地声明它们。不论您是否声明它们――虽然您不能 重复声明它们,它们在每个 JSP 页面当中都进行定义,并且在后台由容器使用。因为隐式对象是自动声明的,所以我们只需要使用与一个给定对象相关的引用变量来调用其方法。

9 个隐式对象及其功能的简单描述如下:

  • Application 是使用范围最广的上下文状态。它允许 JSP 页面的 servlet 与包括在同一应用程序中的任何 Web 组件共享信息。
  • Config 允许将初始化数据传递给一个 JSP 页面的 servlet。
  • Exception include 含有只能由指定的 JSP“error pages”访问的异常数据。
  • Out 提供对 servlet 的输出流的访问。
  • Page 是JSP页面的处理当前请求的 servlet 的实例。一般来说,JSP 页面作者不使用该对象。
  • PageContext 是 JSP 页面本身的上下文。它提供惟一一个 API 来管理具有不同作用域的属性。这个 API 在实现 JSP 自定义标记处理程序时使用得非常多。
  • Request 提供对 HTTP 请求数据的访问,同时还提供用于加入特定于请求的数据的上下文。
  • Response 允许直接访问 HTTPServletResponse 对象,JSP 程序员很少使用该对象。
  • Session 可能是状态管理上下文中使用得最多的对象。“会话”的概念是指单个用户与 Web 应用程序在几个请求上进行交互。

虽然有些隐式对象只提供单一的功能,但是几个结合起来使用就可以提供多种功能。在接下来的一节里,我们将按照功能分类来考察隐式对象:

  • 会话管理: application , session , request , pageContext
  • 流控制application , config , pageContext , request , session
  • 日志记录和异常application , config , exception , pageContext , request , session
  • 输入/输出控制request , response , out
  • 初始化参数: config



会话管理

上个月我们提到过,为 JSP 定义的四个隐式对象可以用来在一个特定的上下文或者作用域中加入有状态数据。这四个对象是 application 、 session 、 request 和 pageContext 。下表列出了这四个对象和它们定义的状态上下文,同时还给出了对每个对象的简单描述。

表1. JSP 状态管理

隐式对象 作用域 描述
javax.servlet.ServletContext Application 代表整个运行时的 Web 模块(应用程序)。作用域为 application 的数据在同一个应用程序模块的所有 Web 组件之间共享。这很像J2EE 中提供的“全局(global)”数据
javax.servlet.http.HttpSession Session 代表当前的 HTTP 会话。除 page 作用域外, session 作用域是使用最普遍的上下文。这个对象在提供跨多个请求的持久的、有状态的用户体验方面使用得最普遍
javax.servlet.http.HttpServletRequest Request 代表当前的 HTTP 请求。这个上下文可以跨越多个 Web 组件(servlet 和 JSP 页面),只要这些组件属于同一原子请求的一部分。由客户机提供的特定于请求的数据(请求方法、URI、HTTP 参数等等)都被自动地保存在一个 request 上下文中。servlet 或 JSP 页面还可以程式化地(programmatically)将数据的作用域指定为 request ,以便允许同一 request 作用域中的其他 servlet 或 JSP 页面可以获取该数据
javax.servlet.jsp.PageContext Page 代表当前 JSP 页面的上下文。因为一个 JSP 页面的上下文包括当前的请求、会话和应用程序,所以使用 pageContext 实例可以访问与一个JSP 页面相关的所有命名空间。它是所有对象的默认作用域,包括 JavaBeas 对象在内。 具有 page 作用域的对象通常会绑定到一个局部变量,以便在 scriptlet、表达式、JavaBeans 标记和自定义标记中可以访问它

从最佳实践的立场来看,我们应该尽可能地使用 page 作用域。它简单,而且是 JSP 数据的默认作用域。 request 作用域非常适合于运行期间在组件间共享数据以处理一个特定的请求。 session 作用域被设计用来为单个用户提供持久的、有状态的体验,它可以跨越多个请求。 application 作用域只有需要在组件之间跨用户会话共享数据时才应该使用。参阅 参考资料以了解更多有关 session 作用域的信息。


流控制

面向对象设计方法的最大好处是可重用性。特别是,J2EE 系统将它们借用到模块化风格的开发中,其中组件可以在其他应用程序中重新安排、重新打包和重新使用。即使您对设计可重用的 Web 模块不感兴趣,也很可能会发现您的 J2EE 应用程序由几个部分组成。任何时候使用多个 servlet 或者 JSP 页面(也就是组件)完成一个请求的时候,都需要使用某种类型的流控制技术。Servlet 架构提供两种这样的技术:forward(转发) 和 include(包括)。

在 J2EE Web 开发中, forward会把处理用户请求的控制权转交给到其他 Web 组件。forward 在有些时候会比较有用,比如说需要用一个组件设置一些 JavaBean、打开或关闭资源、认证用户,或者在将控制权传递给下一个组件之前需要执行一些准备工作。在转发之前可以执行很多类型的任务,但是要转发的组件不能设置响应头部信息,也不能有内容发送到输出缓冲区。所有与向客户发送内容直接相关的任务必须由被转发的组件完成。

J2EE 中第二种流控制技术是 include。在使用 forward 时,要传递控制权。与此不同的是,执行 include 的组件维持对请求的控制权,而只是简单地请求将另一个组件的输出包括在该页面的某个特定的地方。对于常见的设计元素,例如页首、页脚和导航栏等,这是一个非常好的方法。

forward 和 include 都是通过一个专门的对象 java.servlet.RequestDispatcher 来完成的。简单地调用一个 ServletContext 对象的 getRequestDispatcher() 方法就可以获得一个 RequestDispatcher 对象。得到对 ServletContext 对象的引用有几种方法,我们可以:

 ●使用隐式声明的 application 变量,因为它的类型本身已经是 ServletContext。
 ●调用方法 getServletContext() ,该方法返回一个对隐式声明的 application 变量的引用。
 ●调用隐式声明的 config 变量的 g etServletContext() 方法 。
 ●调用隐式声明的 pageContext 变量的 getServletContext() 方法 。
 ●调用隐式声明的 request 变量的 getServletContext() 方法 。
 ●调用隐式声明的 session 变量的 getServletContext() 方法 。

清单1给出了使用隐式变量 application 的 forward 流控制机制的代码示例。

清单1. forward 流控制示例

javax.servlet.RequestDispatcher rd;
/ ●Obtain a reference to a RequestDispatcher object via the implicit
application variable*/
rd = application.getRequestDispatcher( "/NextPage.jsp" );
/ ●Perform the forward specified by the RequestDispatcher
and pass along a reference to the current request and
response objects */
rd.forward( request, response );

清单2给出了同样使用变量 application 的 include 流控制的代码示例。

清单2. include 流控制示例

javax.servlet.RequestDispatcher rd;
/ ●Obtain a reference to a RequestDispatcher object via the implicit
application variable*/
rd = application.getRequestDispatcher( "/Header.jsp" );
/ ●Perform the include specified by the RequestDispatcher
and pass along a reference to the current request and
response objects */
rd.include( request, response );


forward 和 include 是添加到 J2EE Web 开发工具包中的两个非常棒的技术。还有其他一些方法可以在 JSP 页面中完成 include,而且还有很多解决 J2EE 设计模式方面的文献中讲到了如何结合使用这两种技术。参阅 参考资料以了解更多信息。


日志记录和异常

如果您需要把与 Web 应用程序相关的信息存储到一个日志中,依然有内建的方法可用。 ServletContext 接口声明了两个方法,用于把数据传给一个日志。其中一个方法接受简单的文本消息: log( java.lang.String ),另一个方法接受一个异常信息和一个文本消息: log(java.lang.Throwable, java.lang.String ) 。

在有了 ServletContext 接口提供的两个可用的日志记录方法之后,剩下的关键是获取一个对 ServletContext 类型的对象的引用。像我们前面讨论过的流控制对象一样,有多种方法可以获取对 ServletContext 类型的对象的引用。在获得了对象引用之后,简单地调用 log()方法并向方法中传递必需的数据即可。一旦调用了这个方法,您当然就会希望能够查看应用程序日志以查看消息。 ServletContext 是一个简单的接口,并且也没有规定怎样实现它声明的方法。因而 log 方法的具体实现是由供应商处理的。他们可以把日志信息存储到一个文本文件、二进制文件、数据库中,或者是供应商认为合适的其他格式中。您需要从服务器的文档中得知存储日志的位置。

虽然向一个日志文件发送消息相当有用,但是很多时候您可能还想在发生不可恢复的异常时显示一个用户友好的错误消息。要实现这一功能,您可以声明,您的 JSP 页面使用一个单独的页面来处理错误消息。这是在 JSP 页面的任何地方通过包含下面的 page 指令实现的:

<%@ page errorPage="ErrorMessage.jsp"%>

如果在处理 JSP 页面时有一个异常抛出的话,exception 对象就会立即通过隐式声明的 exception 变量的方式抛给指定的错误页面。

为了使一个 JSP 页面能够作为一个错误页面,它必须包含一个指令来声明这个页面是指定用来处理错误的特殊页面,指令如下:

<%@ page isErrorPage="true"%>

为了使用 ErrorMessage.jsp 页面能够作为一个错误页面,这个指令必须出现在页面的某个地方。错误页面可以显示一个友好的信息给用户,然后可以将相关的异常信息写入日志以供管理员日后查看。

输入和输出控制

因为 JSP 页面仅仅是 HTTP servlet 的一个简单抽象,所以您可以访问 HttpServletRequest 和 HttpServletResponse 对象。如果需要特定于请求的信息,比如客户机浏览器的类型、HTTP post 的内容类型、客户机性能、Cookie 数据或者请求参数,简单地用隐式声明的 request 变量直接调用适当的方法即可。类似地,如果您需要设置响应头部信息,比如说浏览器类型、内容类型、内容长度等等,简单地用隐式变量 response 调用适当的方法即可。

如果需要直接访问 JSP 页面的输出流,您可能会试图通过隐式 response 变量调用 getWriter() 或 getOutputStream() 。然而由于 JSP 页面的特殊性,您不能这样做。如果需要直接访问输出流,必须通过一个 avax.servlet.jsp.JSPWriter 类型的特殊缓冲 PrintWriter 对象来访问。怎样定位这样一个对象的引用呢?JSP 容器将会为您隐式地声明一个,并通过 out 变量提供给您。在 JSP scriptlet 中可以通过简单地调用 out.print() 或 out.println() 使用它。

一般来说不需要像这样直接使用 JSPWriter 对象,而只需简单地把内容作为普通文本或者通过 JSP 表达式写入,然后允许容器将这些信息翻译成 JSPWriter 调用。然而,在两种情况下您需要直接使用 out 变量。一种情况是要为 JSP 自定义标记定义处理程序,这部分内容我们将在下个月重点讲到。另外一种情况是您想要对 JSP 创建的输出拥有更多的控制。如果您有一段夹杂着 JSP scriptlets 和表达式的 HTML,您可能会发现创建大的 scriptlet 然后在需要输出内容到客户机的时候使用 out.println() 语句这样做会更简洁、更容易。


初始化参数

如果您有一些静态数据想提供给 JSP 页面使用,并且那些数据不会频繁地改动,初始化参数可能会是一个比较好的选择。初始化参数有时候又叫环境变量或者“init”参数,这些参数通过位于一个 per-servlet/JSP 内的 Web 应用程序的 web.xml 文件指定,并且它们在servlet 的生命周期中只读取一次,即在初始化时读取。

清单3是一个初始化参数声明的例子。

清单3. 初始化参数声明

<webapp>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.gabhart.MyTestServlet</servlet-class>
<init-param>
<param-name>contactEmail</param-name>
<param-value>kyle@gabhart.com</param-value>
</init-param>
</servlet>
</webapp>


使用隐式变量 config 可以访问这些参数的值,隐式变量 config 是对 JSP 页面的 ServletConfig 对象的引用。通过 ServletConfig 接口提供了两个处理 init 参数的方法。可以根据名字对一个特定的参数完成一个查找( getInitParameter( java.lang.String) ),或者也可以检索到为 JSP 页面定义的所有参数名字的一个 enumeration( getInitParameterNames() )。在拥有了enumeration 之后,可以通过循环查找每一个值。所有 init参数都是 String 对象。如果需要其他的数据类型,比如说整数、浮点数或者布尔值,必须使用相应的包装器类来解析字符串。

结束语

JSP 技术提供了 Servlet 架构之上的一个非常有用的抽象,它让 Web 设计者可以着重关注内容表示,而只要求知道较少的编程细节。在本文中,您已经看到了我们是如何使用隐式对象来快速、容易地开发 Web 应用程序的。

分享到:
评论

相关推荐

    03-JSP隐式对象.ppt

    03-JSP隐式对象.ppt

    Jsp的隐式对象实例教程文档

    **JSP隐式对象详解** JavaServer Pages (JSP) 是一种用于开发动态网页的技术,它允许开发者在HTML代码中嵌入Java代码。在JSP中,有一些预先定义好的对象,被称为“隐式对象”,这些对象可以直接在JSP页面中使用,...

    JSP 隐式对象

    JSP九大隐式对象学习,比较基础,适用入门人群

    TP4 JSP 隐式对象TP4

    TP4 JSP 隐式对象TP4

    JavaWeb程序设计入门课件JSP隐式对象共8页.pdf

    JavaWeb程序设计是Web开发中的重要一环,...本入门课件《JavaWeb程序设计入门课件JSP隐式对象共8页.pdf》将引导初学者深入理解JSP隐式对象的概念、使用方法及其在实际开发中的应用,为后续的JavaWeb开发打下坚实基础。

    Java Web程序设计入门课件-JSP隐式对象.pptx

    首先,我们要了解什么是JSP隐式对象。在JSP2.0规范中,预定义了9个隐式对象,它们可以直接在JSP页面中使用,无需显式声明或实例化。这些对象包括out、pageContext、request、response、session、application、page、...

    JavaWeb开发技术-JSP隐式对象.pptx

    JSP隐式对象是JSP提供的一组预定义的对象,可以直接在JSP页面中使用,无需显式声明,极大地简化了开发工作。以下是对JSP隐式对象的详细说明: 1. **out对象**: `out` 对象是 `javax.servlet.jsp.JspWriter` 类的...

    完整版Java JSP web开发教程 07_JSP隐式对象(共32页).ppt

    通过学习和熟练掌握这些JSP隐式对象及其使用方法,开发者可以更高效地构建动态Web应用,实现服务器端的数据处理、用户交互和页面逻辑。此外,了解MVC设计模式对于理解Java JSP web开发也很重要,它将模型(Model)、...

    EL表达式 隐式对象

    ### EL表达式 隐式对象 #### 一、EL表达式基础 ##### 1. 语法结构 EL表达式采用特定的语法结构来进行数据的提取和操作,其基本格式为 `${expression}`。这里的 `expression` 可以是变量、方法调用或其他逻辑表达式...

    JSP 作用域与隐式对象

    JSP 作用域与隐式对象[SP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似...

    jsp学习笔记

    jsp隐式对象是jsp技术的核心之一,jsp隐式对象是指在jsp页面中可以直接使用的java对象,这些对象都是jsp引擎提供的,jsp隐式对象共有九大对象,分别是: 1. request对象 2. response对象 3. pageContext对象 4. ...

    JSP中隐式对象用法实例

    常见的JSP隐式对象包括request、response、session、application、out、pageContext等。下面将详细介绍这些隐式对象的定义和用法,并通过实例加以说明。 1. request对象 request对象用于获取客户端的请求信息,如...

    jsp的九大隐式对象详解

    "JSP 九大隐式对象详解" JSP 九大隐式对象是指在 JSP 编程中可以直接使用的九个内置对象,这九个对象分别是:request、response、session、application、out、pageContext、config、page、exception。下面对每个...

    J2EE JNDI配置原理详解 JBOSS安装配置 Maven入门 Ant使用入门

    1.5 JSP 隐式对象简介 1.6 Java解析XML的四种方法 1.7 struts1和truts2比较 1.8 Tomcat5启动流程与配置详解 1.9 HttpServlet详解 1.10 Ant使用入门 1.11 Maven Ant之间的比较 1.12 详解MANIFEST.MF文件 1.13...

    Java Web程序设计入门课件-EL隐式对象.pptx

    值得注意的是,EL和JSP共享一个隐式对象——`pageContext`,但其余的隐式对象则是EL特有的。 **7.3.1 EL隐式对象概述** 这11个隐式对象包括`pageContext`、`request`、`response`、`session`、`application`、`page...

    JSP 内置对象:request 对象.pptx

    隐式对象的名称是 JSP 的保留字。JSP 使用隐式对象来访问网页的动态内容。隐式对象可以在小脚本、表达式、EL 表达式中直接使用。 request 对象是 JSP 中九个可供使用的隐式对象之一,它属于输入/输出对象,主要...

    JavaWeb程序设计入门课件EL隐式对象共6页.pdf

    这门JavaWeb程序设计入门课件主要聚焦于EL(Expression Language)隐式对象,它是一个强大的JSP(JavaServer Pages)表达式语言,用于简化JavaWeb开发中的数据访问和页面逻辑。EL隐式对象是预定义的一组变量,可以...

    EL表达式的隐式对象_动力节点Java学院整理

    EL表达式的隐式对象是JSP中的一种特殊对象,用于存储和访问当前Web应用程序的状态信息。EL表达式隐式对象可以分为两类:一类是pageContext对象,另一类是四个域(page、request、session、application)中搜索的隐式...

Global site tag (gtag.js) - Google Analytics