JSP 和 JSF 是当今构建 Web 应用程序时使用的最重要的 Java 标准。但是这两种技术的基本原理却截然不同。JSP 采用的底层机制很简单,您可以控制发生的操作,并且可以选择自己的方式。而 JSF 则复杂一些,它处理开销,但这个应用程序模型是标准化的,这意味着工具能做更多的工作、供应商能够提供组件库,使开发人员能够专注于构建应用程序。
![]() |
|
就像本系列的 第 2 部分 和 第 3 部分 一样,您不需要一个非常复杂的框架来构建 Web 表单。如果您希望保持简单,或希望快速开发 Web 应用程序,那么可以将 JSP Tag Library (JSTL) 和标记文件、动态属性结合起来使用。这样,您将能够轻松定制组件,控制 HTML 输出和 HTTP 请求。
如果要构建复杂的 Web 应用程序,正确的选择是将 JSF 框架和良好的组件库结合使用。因为 Web 框架不可能满足每个应用程序的所有需求,所以您还得构建一些自己的组件。在这种情况下,您可以使用本文给出的技术创建与 JSF 类似的组件,而不需要使用 JSF API。此外,还可以在同一 Web 页面上混合使用非 JSF 组件和 JSF 组件,大大避免了 JSF 带来的复杂性。
表达式语言最初是 JSTL 的一个主要特性,后来合并到了 JSP 2.0 标准。早期的 EL 版本允许使用 ${...}
表达式查询 JavaBeans 和集合,JSP 容器在 JSP 页面的执行期间计算这个表达式。
JSF 框架定义了它自己的 EL 变体,从而支持它的 #{...}
表达式的其他功能,比如延迟求值和设置 EL 表达式的值。这些特性实现了数据绑定,并允许 JSF 框架在表达式计算完毕后进行控制。
JSP 2.1 标准统一了这两种 EL 变体。您仍然可以使用 ${...}
表达式,它的计算时间由 JSP 容器决定。但现在也可以在定制 JSP 标记的属性内部使用 #{...}
表达式,它可以不基于 JSF。这一节展示如何对非 JSF 标记使用 deferred-value 表达式,它比 JSF 表达式更容易构建。
JSP 2.1 允许在任何定制标记的属性内使用 #{...}
表达式,前提是属性的 setter 方法包含一个 javax.el.ValueExpression
参数。清单 1 展示了定制标记的处理函数是什么样的。它通常扩展 javax.servlet.jsp.tagext
包的 SimpleTagSupport
类,并且对于定制标记的每一个属性,它必须有一个 set 方法。此外,标记处理函数应该提供一个 doTag()
方法,当执行包含定制标记的 JSP 页面时调用这个方法。
清单 1. deferred-value 属性的 setter 方法
|
在标记库描述符(TLD)文件中定义定制标记,这个文件不仅包含标记库的版本、前缀、URI 和每个定制标记的定义,它还指定了标记名、标记处理函数类、正文内容的类型和标记的属性。对于 javax.el.ValueExpression
类型的每个属性,必须将 <deferred-value>
包含在 <attribute>
元素内部,如清单 2 所示:
清单 2. 定义定制标记及其 deferred-value 属性
本文转自IBM Developerworks中国