JSF 深入讲解

6.2. Facelets是JSF更好的外衣
于是,Facelets出现了。这是由 Sun 公司在 dev.java.net 上的一个开源项目,其主页为:facelets.dev.java.net。为什么说 Facelets 更适合JSF?笔者认为,主要是基于以下特性:

Facelets基于xml,它是组件树更自然的一种描述方式(xml天生就是一种树形结构描述语言)。

Facelets的模版技术,使它更适合网页开发

Facelets支持复合组件,并且,组件的定义方式更简单

Facelets的 jsfc 技术对 html 设计器更友好

与JSP相比,Facelets无需运行前编译,并且,Facelets 还适合对生成的组件树做cache,从而使运行期更轻量,效率更高

6.2.1. 对Facelets的感性认识
我们不妨回顾一下在前面的章节中,列举的例子,它们的页面全部是基于 Facelets 的,以下面的这个页面为例:


该页面的源码如下:

<f:view xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
  xmlns:w="http://www.apusic.com/jsf/widget" xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets">
  <w:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </w:head>
  <w:page title="title">
    <h1>title</h1>
    <w:textField id="name" />
    <ui:debug />
  </w:page>
</f:view>
  在 JSF 中,每一个页面都称之为是一个“view”,因此,我们就用 <f:view> 来作为页面的根节点。并且,在此节点中,进行各种命名空间的声明。

  一个 view,可能被渲染成不同的形式,如,它可能被渲染成一个 html page,也可能是一个 wml page,甚至可能是一个 flash等等。但无论如何渲染,本质上,view 是由组件构成的,因此, view 的渲染,本质上就是组件的渲染。在这个页面中,放了一个组件 page,它的命名空间是 w,而 <w:page> 渲染出来的则是一个 html page。

  为了方便理解,我们在页面中放一个 <ui:debug/>,当页面被执行时,通过热键 CTRL+SHIFT+D(这个热键好像和 FireFox的某个热键冲突?这时可以通过 hotkey="e"的形式指定其它热键),即可以显示整个组件树的结构,其组件树结构如下:



同样,上述页面,还可以写成这样:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:w="http://www.apusic.com/jsf/widget">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>title</title>
  </head>
  <body>
    <h1>title</h1>
    <w:textField id="name" />
    <ui:debug />
  </body>
</html>
  以<html>作为根元素,并且在此元素内进行命名空间的声明。

  此页面的组件树如下:



事实上,上述两种风格,对最终的页面运行效果来说,是相差无几的。第一种风格,更符合程序员思维;第二种风格,更符合常规对html的认识。 无论哪种风格,AOM都予以支持,但在 Apusic Studio 中,我们推荐使用第一种风格,究其原因:Apusic Studio是面向程序员的。

6.2.2. 如何获取 Facelets?
Facelets是位于java.net上的一个项目,其项目主页为:http://facelets.dev.java.net/ 。在 AOM 2.0中,已经内置了对 Facelets 的支持,并且,我们强烈建议您使用 AOM 2.0 自带的 Facelets,因为 AOM 对 Facelets 做了一些扩展。

在AOM 2.0 M2 及以前版本中,有一个专门的jar包:jsf-facelets.jar。在 AOM 2.0 M3版本以后,将其打包到一个统一的jar包: operamasks-third-party.jar。

6.2.3. 如何配置 Facelets
一个web module到底是以 Facelets 作为 JSF的Faces Page,还是以 jsp 作为 Faces Page,主要是以下几个配置,首先是 faces-config.xml:

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
  version="1.2">
  <application>
    <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
  </application>
</faces-config>
  配置以 Facelets 作为 JSF 的 View Handler,此参数是必须的。


其次,你还需要配置一下 web.xml

<web-app>
  <!-- Use Documents Saved as *.xhtml -->
  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>
 
  <!-- Special Debug Output for Development -->
  <context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
  </context-param>
...
</web-app>

  设置页面的默认后缀为 xhtml,此参数是必须的。

  打开 Facelets 的 debug 开关,此参数不是必须的。它的含义是:Setting this to true will cause the FaceletViewHandler to print out debug information in an easy to use screen when an error occurs during the rendering process.


同时,还可以设置 facelets 的 logger 级别,从而在开发期输出详细的log日志以方便调试,请参考:第 23 章 FAQ,Facelets的logger有:

表 6.1. Facelets的Logger

名称 版本号
facelets.compiler For outputting debug information about the compilation process. This would include namespace resolution for TagLibraries and XML events. Most of the output will be FINE
facelets.factory Information about the inner workings of the FaceletFactory
facelets.tag.component Debug information that helps with component lifecycles in relation to Facelets
facelets.viewhandler Will output view-id mapping/resolution and the states of your views




你可能感兴趣的:(xml,jsp,.net,XHTML,JSF)