JSF2.0中Facelets将取代JSP

来源:互联网 发布:探究小车速度实验数据 编辑:程序博客网 时间:2024/06/05 18:12

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

迎接Facelets,向JSP说再见
JSFJavaServer 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"/>
        
    </head>
    <body>
     <div class="header">Online Examination Application</div>
     <form>
     <table>
     <tr>
     <td>e-Mail ID</td>
     <td>
     <h:inputText label="eMail ID" id="emailId"
            value="#{userBean.email}" size="20"  required="true"/>
<h:message for="emailId" styleClass="error"/>
      </td>
      </tr>

      <tr>
<td>assword:</td>
      <td>
      <h:inputSecret label="assword" id="password"
            value="#{userBean.password}" size="20" required="true" />
<hutputLink value="forgotPassword.jsf">
      <hutputText value="Forgot Password"/> </hutputLink>
      <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 <hutputLink value="regform.jsf">
            <hutputText value=" Register"/>  </hutputLink> ??
               
</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"/>
        <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的默认的视图技术。

原创粉丝点击