简化 Ajax 和 Java 开发之第 4 部分:用 JSP 标记文件创建 JSF 样式的组件

JSP 和 JSF 是当今构建 Web 应用程序时使用的最重要的 Java 标准。但是这两种技术的基本原理却截然不同。JSP 采用的底层机制很简单,您可以控制发生的操作,并且可以选择自己的方式。而 JSF 则复杂一些,它处理开销,但这个应用程序模型是标准化的,这意味着工具能做更多的工作、供应商能够提供组件库,使开发人员能够专注于构建应用程序。

Ajax 资源中心

请访问 Ajax 资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。

就像本系列的 第 2 部分第 3 部分 一样,您不需要一个非常复杂的框架来构建 Web 表单。如果您希望保持简单,或希望快速开发 Web 应用程序,那么可以将 JSP Tag Library (JSTL) 和标记文件、动态属性结合起来使用。这样,您将能够轻松定制组件,控制 HTML 输出和 HTTP 请求。

如果要构建复杂的 Web 应用程序,正确的选择是将 JSF 框架和良好的组件库结合使用。因为 Web 框架不可能满足每个应用程序的所有需求,所以您还得构建一些自己的组件。在这种情况下,您可以使用本文给出的技术创建与 JSF 类似的组件,而不需要使用 JSF API。此外,还可以在同一 Web 页面上混合使用非 JSF 组件和 JSF 组件,大大避免了 JSF 带来的复杂性。

使用 deferred values

表达式语言最初是 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 方法
				
package mylib;

public class MyTag extends javax.servlet.jsp.tagext.SimpleTagSupport {
private javax.el.ValueExpression myAttr;

public void setMyAttr(javax.el.ValueExpression myAttr) {
this.myAttr = myAttr;
}

public void doTag() throws javax.servlet.jsp.JspException,
java.io.IOException {
...
}
}

在标记库描述符(TLD)文件中定义定制标记,这个文件不仅包含标记库的版本、前缀、URI 和每个定制标记的定义,它还指定了标记名、标记处理函数类、正文内容的类型和标记的属性。对于 javax.el.ValueExpression 类型的每个属性,必须将 <deferred-value> 包含在 <attribute> 元素内部,如清单 2 所示:


清单 2. 定义定制标记及其 deferred-value 属性




本文转自IBM Developerworks中国

      请点击此处查看全文


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值