技术开发 频道

在Java EE 6中使用JSF 2.0简化页面制作

  模板

  使用模板,你可以创建一个页面作为应用程序中其它页面的模板,这样可以避免多次创建结构类似的页面,同时也可以统一应用程序中多个页面的视觉风格。

  Facelets标签库包括一个模板标签<ui:insert>,为了实施模板化,首先创建一个包括<ui:insert>标签的模板页面,然后创建一个使用这个模板的客户端页面,在客户端页面中,使用<ui:composition>标签指定模板,使用<ui:define>标签指定插入到模板中的内容。

  下面是一个模板页面的内容:

<xml version="1.0" encoding="UTF-8"?>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
    
<html xmlns=http://www.w3.org/1999/xhtml
          xmlns:ui="http://java.sun.com/jsf/facelets" 
         xmlns:h=http://java.sun.com/jsf/html
        <head>
          
<title><ui:insert name="title">Page Title</ui:insert</title><body>
      
</head>
      
<body>
          
<div>
              
<ui:insert name="Links"/>
          
</div>
          
<div>
              
<ui:insert name="Data"/>
          
</div>
      
</body>
    
</html>

   下面是使用这个模板的客户端页面代码:

<xml version="1.0" encoding="UTF-8"?>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
      
<html xmlns="http://www.w3.org/1999/xhtml" 
          xmlns:ui="http://java.sun.com/jsf/facelets" 
          xmlns:h="http://java.sun.com/jsf/html" 
     <body>
        
<ui:composition template="/template.xhtml">
            This text will not be displayed.
            
<ui:define name="title">
                Welcome page
             </ui:define>
            
<ui:define name="Links">
                ... [Links should be here]
            
</ui:define>
            <ui:define name="Links">
                ... [Data should be here]
            
</ui:define> 
       </ui:composition>
            This text also will not be displayed.
      
</body>
    
</html>

  当客户端调用这个模板时,它使用标题Welcome Page渲染这个页面,这个页面显示了两部分内容,一个显示客户端中指定的链接列表,另一个显示客户端中指定的数据。

  混合组件

  混合组件时JSF中的一个新特性,通过它创建自定义JSF组件会更加容易。你可以使用JSF页面标记和其它JSF组件创建混合组件。在Facelets的标注下,任何XHTML页面都可以变成一个混合组件。此外,混合组件可以有验证器,转换器和监听器。

  创建好混合组件后,你可以将它保存到库中,以后有需要时就可以调用了。

  让我们创建一个渲染为登录面板的混合组件,用户登录时,组件反馈一个登录事件,如图2所示。

图 2 登录面板混合组件

  下面是混合组件的源代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.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"> 
      xmlns:f="http://java.sun.com/jsf/facelets">
       xmlns:composite="http://java.sun.com/jsf/composite">
    
<h:head>
    
<title>This content will not be displayed in the rendered output</title>
    
</h:head>
    
<h:body>     <composite:interface> 
           <composite:actionSource name="loginEvent"/> 
    </composite:interface>
     <composite:implementation>
      
<table>
    
<tr>
        
<td>Username:  <h:inputText id="username" /> </td>
    
</tr>
    
<tr>
        
<td>Password: <h:inputSecret id="password" /></td>
    
</tr>
    
<tr>
        
<td><h:commandButton value="Login" id="loginEvent" /></td>
    
</tr>
      
</table>
    
</composite:implementation>
    
</h:body>
    
</html>

  xmlns:composite="http://java.sun.com/jsf/composite"声明了混合UI组件的命名空间,<composite:interface>标签声明混合组件的使用契约,<composite:attribute>标签在使用契约中指定<composite:actionSource>标签,这个表示组件可以暴露一个事件,让使用这个混合组件的页面可以轻松访问它。

  <composite:implementation>标签定义了混合组件的实现,这里的实现是一个简单的表,它包括用户名、密码和登录按钮JSF组件。

0
相关文章