| 当你为服务器端的应用编写用户界面时,你有许多选择。使用servlet或jsp的Java开发者常常依赖于HTML用户界面组件来开发用户界面。这主要是因为HTML用户界面组件为大多数浏览器所支持。这也意味
着这样的web应用与独立的“胖”客户应用相比没有丰富的用户接口,因此,功能较少,可用性较低。虽然,applet可以用来开发丰富的用户接口,但是,页面作者或许不熟悉(或者也没有兴趣学习)Java语言。
此外,如果你参加过开发大型web系统,你或许遇到过一些技术挑战,例如如何实现建立数据库查询的查询建造器或表浏览器这样的自定义组件。开发这样的自定义组件要求专门的知识和大量的时间用来建立和测试新库。在理想的环境下,开发者可以利用预建的,经过测试的,高可配置的组件,把它们集成到他们自己的应用开发环境。 JSF(JavaServer Faces)是开发具有丰富用户界面的web应用的服务器端技术。利用JSF你可以解决象创建自定义用户界面组件这样的技术挑战。这是因为,JSF技术是用户界面框架,用于建立服务器端运行的web应用,把用户界面传回客户端。就是这样!用户界面代码运行在服务器端,对客户端产生的事件做出响应。 当前,为了建立丰富的服务器端用户界面也有一些其他选择。例如,Flash, Swinglets,和Jade。然而,这些解决方案都是特有的,支持它们的开发工具通常都是单个供应商所提供的。首先,JSF是一个标准,这就意味着开发者不必局限于单个供应商。JSF规范的专家组实际上是由Java领域所有主要的工具供应商代表组成。这样,开发者就有许多工具可选,或许可以使用他们正在使用的工具的更新版本。工具供应商在规范上协作,在实现上互相竞争。这将有利于开发者。 JSF技术基于MVC(Model View Controller)将逻辑与表示分离。因此,如果你熟悉MVC,你使用JSF将会感到得心应手。 本文通过例子提供了快速入门教程,使你了解JSF。它还: ○ 提供了JSF简介 ○ 指出了JSF的好处 ○ 说明了JSF的原理 ○ 描述了JSF应用的起源 ○ 引导你尝试开发JSF应用 ○ 提供了示例代码,可以用于你自己的应用 请注意本教程不讨论如何开发定制组件。 JSF简介 JSF是Sun公司在JCP(Java Community Process)下JSR 127中倡导的技术。其目的是为Web应用的用户界面创立标准的框架。正如前面提到的,JSF让你开发这样的Web应用,它们运行在Java服务器上,把用户界面传递到客户端。JSF通过控制servlet和具有事件处理和组件加工的丰富的组件模型管理Web应用生命周期。 JSF技术主要由两类组件组成: 1. Java API,这些Java API表示UI组件,管理状态,处理事件和验证输入。它们支持国际化和可访问性。 2. JSP定制tag库,在JSP文件中表示JSF。页面作者可以使用这个tag库在页面中增加UI组件。 图1表明了客户、服务器和JSF之间的关系 图1运行在服务器上的UI这里,JSP文件代表了使用JSF定制tag库的用户界面组件,它们不是直接使用标记语言编码的。应用UI管理JSP文件处理的对象。 一些用户能够从这个技术获得好处,他们是: ○ 使用象HTML这样的标记语言的页面作者,他们将使用JSP定制库来表示JSF丰富的用户界面组件。 ○ 应用开发者,他们为模型对象和事件处理编程。 ○ 组件开发者,他们将创建基于JSF组件的定制组件。 ○ 工具提供商,他们提供这样的工具,将JSF技术集成到新一代开发工具中,这简化了多层Web应用的开发。 这个技术也为可重用Web用户界面组件提供了市场。开发者和提供商可以使用JSF作为构件开发自己的应用。 JSF的一个优势是,它是基于MVC结构的,为表示和逻辑提供了清楚的分离。这对于正在使用象Struts这样的现有的Web架构的开发者来说也许是耳熟能详的。然而,要注意到JSF和Struts不是互相竞争的技术。事实上,它们是可以互操作的。然而,JSF相对于Struts来说确实有一些优势。例如,在Struts中,处理单元只有一种方式;而JSF提供了几种方式。页面设计者可以选择他们要求的表示方法,应用开发者不必知道所用的处理单元的方式。(关于更多的信息,参看the integration of JavaServer Faces and Struts)。读者或许注意到Struts的开发者Craig McClanahan也是JSF规范的领头人之一,他还是Sun公司的雇员。 JSF应用的起源 JSF应用和任何其他的基于Java技术的Web应用一样,它运行在Java servlet容器内,包含: 1. JavaBeab组件(或模型对象),这些组件包含了特定应用的功能和数据 2. 事件监听器 3. JSP页面 4. 服务器端的helper类 5. 处理UI组件的定制tag库 6. 处理event handler 和 validator的定制tag库 7. 表示为服务器上有状态对象的UI组件 8. Validators, event handlers,和navigation handlers。(Validators 用于在服务器端数据更新之前对单个组件上的数据进行验证。) JSF参考实现中包含了组件tag库,html_basic。然而,高级开发者可以开发他们自己的tag库处理定制组件。 JSF参考实现提供了处理HTML中的组件的定制tag库。下面是一个使用tag库的简单例子。关于所支持的组件tag库,请看JSF规范和教程。 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <body bgcolor="white"> <h2>What is your name?</h2> <f:use_faces> <h:form id="helloForm" formName="helloForm" > <h:input_text id="username" /> <h:command_button id="submit" label="Submit" commandName="submit" /> </h:form> </f:use_faces> 在设计JSF组件架构时是用组件的类来定义组件的功能的,组件的传递用不同的renderer实现。传递工具定义了组件类如何适应于具体客户的组件tag。JSF参考实现包含有传递到HTML客户的标准的RenderKit。HTML RenderKit中的每个JSP组件都是由用UIComponent 类定义的组件功能,和用Renderer定义的传递属性所组成。例如tag command_button 和command_hyperlink都表示一个UIComponent,但它们是用不同的方式传递的。button 组件作为button传递,hyperlink组件作为hyperlink传递。 开始使用JSF 要开始使用JSF,我们需要Java WSDP 1.0_01(Java Web Services Developer Pack )或Tomcat4.0+。 JSF参考实现JSF EA3(The JavaServer Faces Reference Implementation Early Access release)可以在网上下载。在windows环境下解压后,你将得到如下的目录结构: c:\jsf-ea3> example lib some-other-files example目录包含了示例应用的WAR文件和源文件。Lib目录包含了JSF的JAR 文件,这些JAR文件是: ○ commons-beanutils.jar:定义和访问JavaBeans组件属性的应用工具。 ○ commons-collections.jar:J2SE Collections Framework 的扩展 ○ commons-digester.jar:处理XML 文档 ○ commons-logging.jar:通用灵活的登录工具,允许开发者用logging语句编写代码 ○ jsf-api.jar:包含了javax.faces.* API 类 ○ jsf-ri.jar:包含了JSF参考实现的实现类 ○ jstl.jar:包含了JSTL类(JavaServer Pages Standard Tag Library classes) ○ jstl_el.jar:包含了处理JSTL 表达式的类 ○ standard.jar: 使用JSTL所要求的文件 请记住JSF参考实现还只有早期的入门版本,只是JSF规范的初步实现。换句话说,这个版本是不成熟的。还要注意到,JSF参考实现的当前版本不能和Java WSDP 1.1一起工作。如果你想一起使用JSF和Java WSDP 1.1,你将会得到如图2这样的异常: 图2:JSF RI EA不能和Java WSDP 1.1一起工作如果你没有Java WSDP 1.0_01,想要测试JSF RI EA3,建议你使用Tomcat。本文使用Tomcat-4.1.24。一旦你安装了Tomcat,你可以启动它,在浏览器地址栏输入http://localhost:8080测试它。将会显示Tomcat的缺省页面。现在,为了测试一些JSF的示例应用只需将它们的WAR文件(在JSF安装目录下)拷贝到tomcat的webapps目录。为了运行应用只需输入enter http://localhost:8080/demo-name。例如,我把cardemo.war拷贝到tomcat的webapps 目录下,然后在浏览器输入http://localhost:8080/cardemo。图3是所得到的页面: 图3:JSF示例应用Cardemo (转载文章请保留出处:Java家(www.javajia.com))
|