天天看点

JSF2.0中Facelets将取代JSP

原文: http://www.developersky.net/thread-22-1-1.html

迎接Facelets ,向JSP 说再见

JSF (Java Server Faces)是Java的UI组件框架,用来创建Web 应用程序动态页面。JSF提供了API来创建、管理、处理用于web页面的UI组件和标签库。JSF的最新版本JSF2 .0是Java EE 6 规范的一部分。JSF2.0提供了一些新的特性,能够帮助开发人员更加简单的开发JSF应用程序。

在JSF1.x中,仍然是使用JSP作为视图;但是在JSF2.0中是使用Facelets作为视图。和JSP一样,Facelets也是 VDL(View Declaration Langurage 视图声明语言)的一个具体实现,它允许开发人员使用HTML模板和不同的表现技术来声明UI组件。因为Facelets视图技术是特意为JSF设计的,因 此与JSP相比Facelets为JSF的开发者提供了更加简单、更加强大的编程模型。基于这个原因,JSF2.0开始Facelets将会取代 JSP。(为了保证向后兼容,JSF2.0仍然支持JSP)。

在这篇文章中,我们来看看使得Facelets优于JSP的特点,同时看看JSF2.0怎样支持这些特点。

Facelets特点

在facelets中,整个页面被编译成一个抽象的句法组件树,在运行时这个句法组件树会被构建成一个UI组件的层次结构。Facelets的标签不需要 在标签库描述(TLD)文件中声明。标签的属性(attribute)是动态的,并会自动映射到对应的properties。Facelets所拥有的而 JSP不具备的一个主要特点就是页面模板。另外,Facelets运行比JSP快。

Facelets使用XHTML编写,对表达式语言(Expression Langurage EL)有很好的支持。Facelets同时利用了XML的命名空间的概念来支持标签库。JSF支持的标签库有:

JSF HTML标签库

JSF 核心标签库

JSTL 核心标签库

JSTL 功能标签库

JSF Facelets 标签库

使用XHTML编写Facelets的背后的思想是使Facelets能够在不同的平台上移植。Facelets的扩展名是.xhtml,要在JSF应用程序中使用Facelets,就必须在web.xml文件中进行如下的设置:

<context-param>

    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>

    <param-value>.xhtml</param-value>

</context-param>

<context-param>

    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>

    <param-value>true</param-value>

</context-param>

第一个参数定义.xhtml作为所有包含JSF内容的视图页面的默认后缀。第二个参数设置为true则JSF实现会忽略Facelets页面中的XML注释。

假设我们建立了一个问答游戏的应用程序,这个应用程序允许注册用户回答5个简单的问题,然后显示得分。用户必须登录后才能够回答问题。

Consider the Facelets page simplelogin.xhtml, a XHTML page that contains certain JSF tags as well as the following simple login form:

下面是登录页面simplelogin.xhtml的代码,是一个由一些JSF标签和简单的登录界面组成的XHTML页面。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  

      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:h="http://java.sun.com/jsf/html"

      xmlns:f="http://java.sun.com/jsf/core">

    <head>

     <title>

     Test your knowledge!!

     </title>

     <link rel="stylesheet" type="text/css" href="./css/default.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" />

    </head>

    <body>

     <div class="header">Online Examination Application</div>

     <form>

     <table>

     <tr>

     <td>e-Mail ID</td>

     <td>

     <h:inputText label="eMail ID" id="email Id"

            value="#{userBean.email}" size="20"  required="true"/>

<h:message for="emailId" styleClass="error"/>

      </td>

      </tr>

      <tr>

<td>

JSF2.0中Facelets将取代JSP

assword:</td>

      <td>

      <h:inputSecret label="

JSF2.0中Facelets将取代JSP

assword" id="password"

            value="#{userBean.password}" size="20" required="true" />

<h

JSF2.0中Facelets将取代JSP

utputLink value="forgotPassword.jsf">

      <h

JSF2.0中Facelets将取代JSP

utputText value="Forgot Password"/> </h

JSF2.0中Facelets将取代JSP

utputLink>

      <h:message for="password" errorClass="error"  />

      </td>

      </tr>

        <tr>

      <td>

      <h:commandButton value="Login" action="#{userBean.checkUser}"/>

</td>

      <td><h:commandButton type="reset" value="Reset"/>   </td>

      </tr>

      </table>

      Want to <h

JSF2.0中Facelets将取代JSP

utputLink value="regform.jsf">

            <h

JSF2.0中Facelets将取代JSP

utputText value=" Register"/>  </h

JSF2.0中Facelets将取代JSP

utputLink> ??

</form>

      <div class="footer"> © E-commerce Research Labs, E & R, Infy</div>

</body>

要在JSF2.0中使用<HTML>标签就必须声明一个命名空间。上面的代码中我们声明来得命名空间h和f(黑体标识的部分)。上面的页面定 义了页头、登录界面、到注册页面的链接和页脚。从上面的代码可以看出,要使用Facelets来作为视图,需要HTML和JSF标签的知识。

Facelets页面模板

页面模板是Facelets技术的主要优势之一。如果我们所有的页面都有相同的页头和页脚,我们就不应该在每个页面都单独的编写页头和页脚的代码。Facelets提供了页面模板,我们可以使用页面模板来定义我们的通用的页面布局。

Facelets页面模板也是一个XHTML文件,使用了Facelets标签来定义视图上不同的逻辑division如页头、页尾、内容等等。我们可以 创建一个名叫layout.xhtml的模板并将其放置模板文件夹中(我们应该将模板文件和其他的Facelets视图文件分开放置,以便管理)。下面是 一个模板的例子:

<!-- XHTML DOCTYPE Declaration -->

<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:h="http://java.sun.com/jsf/html"

      xmlns:ui="http://java.sun.com/jsf/facelets">

    <h:head>

        <title>

            Test your knowledge!!

        </title>

        <link rel="stylesheet" type="text/css"

              href="./css/default.css" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" />

        <ui:insert name="script"></ui:insert>

    </h:head>

    <h:body>

        <div class="header">Online Examination Application</div>

        <ui:insert name="content">Default Content</ui:insert>

            <div class="footer"> © E-commerce Research Labs, E & R, Infy</div>

    </h:body>

</html>

在上面的代码中,我们为Facelets标签声明了命名空间ui。在这个模板中,我们定义了在应用程序的所有页面都通用的页头和页脚。另外,我们还使用<ui:insert>标签定义了一个名叫content的逻辑division。

Facelets的insert标签用来在模板中定义一个具有唯一名字的逻辑division,模板的客户会提供该块的内容。如果模板的客户没有提供内容,那么<insert>标签中的内容会作为缺省内容显示。

下面让我们用这个页面模板来重写login.xhtml:

<!-- XHTML DOCTYPE Declaration -->

<html xmlns="http://www.w3.org/1999/xhtml"

      xmlns:ui="http://java.sun.com/jsf/facelets"

      xmlns:h="http://java.sun.com/jsf/html"

      xmlns:f="http://java.sun.com/jsf/core">

    <ui:composition template="/templates/layout.xhtml">

        <ui:define name="content">

            <h:form>

         <!-- Rebuild the form as before -->

            </h:form>

        </ui:define>

    </ui:composition>

</html>

Facelets页面可以使用<composition>这个Facelets标签,这个标签的template属性指定了模板文件的位 置。<composition>标签外的内容将被忽略。<define>这个Facelets标签用来提供模板中逻辑 division的内容。属性name指定了逻辑division的名字,标签体就是实际的内容。要注意的是define标签必须在 composition标签内使用。

Facelets Replace JSP

Facelets取代JSP

Facelets是JSF2.0规范中最有意思的特点之一,因为Facelets提供的这些特点,从JSF2.0开始,Facelets被推荐为JSF的默认的视图技术。