- 浏览: 40610 次
- 性别:
- 来自: 上海
文章分类
最新评论
隐式对象简介
JSP 架构背后的理念是提供一个 Web 组件,它允许开发人员着重关注 Web 内容的表示,而不用陷入解析、编程和数据操纵等细节。JSP 应用程序本质上是特殊的 Web 组件,在处理用户请求之前,J2EE Web 容器首先将其转换成 servlet。在每个 JSP 应用程序内部有一套完整的隐式对象。
隐式对象使得开发人员可以访问容器提供的服务和资源。这些对象之所以定义为隐式的,是因为您不必显式地声明它们。不论您是否声明它们——虽然您不能重复声明它们,它们在每个 JSP 页面当中都进行定义,并且在后台由容器使用。因为隐式对象是自动声明的,所以我们只需要使用与一个给定对象相关的引用变量来调用其方法。
9 个隐式对象及其功能的简单描述如下:
Application 是使用范围最广的上下文状态。它允许 JSP 页面的 servlet 与包括在同一应用程序中的任何 Web 组件共享信息。
Config 允许将初始化数据传递给一个 JSP 页面的 servlet。
Exceptioninclude 含有只能由指定的 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 变量的 getServletContext()方法。
调用隐式声明的 pageContext 变量的 getServletContext()方法。
调用隐式声明的 request 变量的 getServletContext()方法。
调用隐式声明的 session 变量的 getServletContext()方法。
清单1给出了使用隐式变量 application 的 forward 流控制机制的代码示例。
清单1. forward 流控制示例
javax.servlet.RequestDispatcher rd;
rd = application.getRequestDispatcher( "/NextPage.jsp" );
rd.forward( request, response );
清单2给出了同样使用变量 application 的 include 流控制的代码示例。
清单2. include 流控制示例
javax.servlet.RequestDispatcher rd;
rd = application.getRequestDispatcher( "/Header.jsp" );
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 架构背后的理念是提供一个 Web 组件,它允许开发人员着重关注 Web 内容的表示,而不用陷入解析、编程和数据操纵等细节。JSP 应用程序本质上是特殊的 Web 组件,在处理用户请求之前,J2EE Web 容器首先将其转换成 servlet。在每个 JSP 应用程序内部有一套完整的隐式对象。
隐式对象使得开发人员可以访问容器提供的服务和资源。这些对象之所以定义为隐式的,是因为您不必显式地声明它们。不论您是否声明它们——虽然您不能重复声明它们,它们在每个 JSP 页面当中都进行定义,并且在后台由容器使用。因为隐式对象是自动声明的,所以我们只需要使用与一个给定对象相关的引用变量来调用其方法。
9 个隐式对象及其功能的简单描述如下:
Application 是使用范围最广的上下文状态。它允许 JSP 页面的 servlet 与包括在同一应用程序中的任何 Web 组件共享信息。
Config 允许将初始化数据传递给一个 JSP 页面的 servlet。
Exceptioninclude 含有只能由指定的 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 变量的 getServletContext()方法。
调用隐式声明的 pageContext 变量的 getServletContext()方法。
调用隐式声明的 request 变量的 getServletContext()方法。
调用隐式声明的 session 变量的 getServletContext()方法。
清单1给出了使用隐式变量 application 的 forward 流控制机制的代码示例。
清单1. forward 流控制示例
javax.servlet.RequestDispatcher rd;
rd = application.getRequestDispatcher( "/NextPage.jsp" );
rd.forward( request, response );
清单2给出了同样使用变量 application 的 include 流控制的代码示例。
清单2. include 流控制示例
javax.servlet.RequestDispatcher rd;
rd = application.getRequestDispatcher( "/Header.jsp" );
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 页面使用一个单独的页面来处理错误消息。
发表评论
-
深入探讨 Java 类加载器
2011-10-24 14:25 655http://www.ibm.com/developerwor ... -
firefox不识别“../../”的相对路径的问题
2011-09-07 15:59 2173在使用dojo时,想要完全不用tomca跑动dojo应用(加载 ... -
java乱码终结
2011-07-11 17:10 770http://www.ibm.com/developerwor ... -
Servlet线程,工作原理及3.0新特性
2011-06-17 11:05 2839servlet3.0新特性http://www.i ... -
全面分析Java的垃圾回收机制(转)
2011-03-31 10:55 691引言 Java的堆是 ... -
深入Java核心 Java内存分配原理精讲(转)
2011-03-31 10:48 621Java 内存 分配 ... -
Cookie 跨域访问转自(http://qingfeng825.javaeye.com/)
2011-01-26 16:26 2329由于要做一个简单的SSO,所以学习了cookie部分,原来感觉 ... -
Integer.parseInt(s) 和 Integer.valueOf(s)详细区别(转)
2011-01-26 14:07 3826今天在看jdk的源代码的时候注意到Integer.parseI ... -
转发与重定向的路径问题(转)
2010-12-12 14:08 1396重定向是客户端跳转,转发是服务器端跳转 在servlet中 ... -
The "Double-Checked Locking is Broken" Declaration
2010-12-05 09:19 736http://www.cs.umd.edu/~pugh/jav ... -
Java 理论与实践: 正确使用 Volatile 变量
2010-12-05 09:18 757http://www.ibm.com/developerwor ... -
读取Properties文件读取,路径,空格,中文问题
2010-12-04 19:00 2333读取Properties文件读取,路径,空格,中文问题读取Pr ... -
使用了request.setCharacterEncoding()方法却解决不了中文乱码原因(转载)
2010-11-28 10:28 2192使用了request.setCharacterEncoding ... -
转发与重定向
2010-11-25 16:02 980Java代码 1. response.sendRedi ...
相关推荐
### EL表达式 隐式对象 #### 一、EL表达式基础 ##### 1. 语法结构 EL表达式采用特定的语法结构来进行数据的提取和操作,其基本格式为 `${expression}`。这里的 `expression` 可以是变量、方法调用或其他逻辑表达式...
03-JSP隐式对象.ppt
**JSP隐式对象详解** JavaServer Pages (JSP) 是一种用于开发动态网页的技术,它允许开发者在HTML代码中嵌入Java代码。在JSP中,有一些预先定义好的对象,被称为“隐式对象”,这些对象可以直接在JSP页面中使用,...
JSP九大隐式对象学习,比较基础,适用入门人群
在这门入门课程中,我们将重点讨论一个关键的组件:EL(Expression Language)及其隐式对象。EL是一种简化JSP(JavaServer Pages)中数据访问的语言,它允许开发者更加方便地访问和操作页面上下文中的数据。 7.3 EL...
本课程主要关注的是JSP中的一个重要特性——隐式对象。这些隐式对象是由JSP容器自动创建并提供给开发者,以简化开发流程,提高效率。 首先,我们要了解什么是JSP隐式对象。在JSP2.0规范中,预定义了9个隐式对象,...
EL表达式的隐式对象 EL表达式的隐式对象是JSP中的一种特殊对象,用于存储和访问当前Web应用程序的状态信息。EL表达式隐式对象可以分为两类:一类是pageContext对象,另一类是四个域(page、request、session、...
JavaWeb程序设计是Web开发中的重要一环,...本入门课件《JavaWeb程序设计入门课件JSP隐式对象共8页.pdf》将引导初学者深入理解JSP隐式对象的概念、使用方法及其在实际开发中的应用,为后续的JavaWeb开发打下坚实基础。
TP4 JSP 隐式对象TP4
"JSP 九大隐式对象详解" JSP 九大隐式对象是指在 JSP 编程中可以直接使用的九个内置对象,这九个对象分别是:request、response、session、application、out、pageContext、config、page、exception。下面对每个...
【JavaWeb程序设计入门课件EL隐式对象共6页.pdf】 这门JavaWeb程序设计入门课件主要聚焦于EL(Expression Language)隐式对象,它是一个强大的JSP(JavaServer Pages)表达式语言,用于简化JavaWeb开发中的数据访问...
JSP隐式对象是JSP提供的一组预定义的对象,可以直接在JSP页面中使用,无需显式声明,极大地简化了开发工作。以下是对JSP隐式对象的详细说明: 1. **out对象**: `out` 对象是 `javax.servlet.jsp.JspWriter` 类的...
JSP 作用域与隐式对象[SP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它[1] 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似...
在JSP页面中,有一些特殊的对象被称为隐式对象。这些对象被自动创建,并且可以直接在JSP页面中使用,无需额外声明或实例化。常见的JSP隐式对象包括request、response、session、application、out、pageContext等。...
jsp隐式对象是jsp技术的核心之一,jsp隐式对象是指在jsp页面中可以直接使用的java对象,这些对象都是jsp引擎提供的,jsp隐式对象共有九大对象,分别是: 1. request对象 2. response对象 3. pageContext对象 4. ...
本教程中的第七章重点介绍了JSP的隐式对象,这些对象是Web容器自动创建并为JSP页面提供的便捷引用,无需通过`new`关键字实例化。 1. **JSP 脚本元素** - JSP脚本元素包括`<jsp:scriptlet>`、`<jsp:declaration>`、...
本文主要探讨了一种基于卷积神经网络(CNN)的隐式评价对象识别方法,该方法应用于课程评论的情感分析。在教育领域,理解学生对课程的评价对于改进教学质量和提升学生体验至关重要。传统的评价对象抽取方法主要针对...
观察者模式是Java中常用的一种行为设计模式,用于实现对象之间的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。选择不使用内置的观察者模式,可能是为了更好地控制事件管理的...
标题中的"matlab.rar_matlab隐式_一维热方程_热传导 matlab_热传导 隐式_隐式差分"表明这是一个关于使用MATLAB解决一维热传导方程的实例,其中采用了隐式差分方法。一维热传导方程是描述物体内部热量传递的经典数学...