2012-03-25 64 views
21

我在将JSF应用程序转换为可书写页面方面取得了很多进展,但我想知道我是否正确地做到了这一点。一个问题是,是否有f:metadata标签的最佳实践位置?使用<ui:composition>模板时,我应该在哪里声明<f:metadata>?

我典型的Facelets客户端页面看起来是这样的:

<ui:composition template="./pattern.xhtml"> 

     <ui:define name="content"> 

      <f:metadata> 
       <f:viewParam name="userId" value="#{bean.userId}" /> 
       <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
       <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
       <f:viewParam name="sort" value="#{bean.sort}" /> 
      </f:metadata> 

      <h1>Data Table</h1> 

etc 

所以F:元数据和儿童F:viewParam标签在我的页面的主体遇到的。我的pattern.xhtml模板也有一个部分(名为“标题”),可以将这些标签放在标题部分。他们应该放在那里吗?它是否有所作为,还是我设置了一些我还没有看到的副作用?

回答

39

从技术上讲,只要它在顶层视图中(即在模板客户端,因此不在主模板中使用模板时),在视图中声明<f:metadata>的位置并不重要。构建视图时,元数据基本上不是JSF组件树的一部分,而是视图根目录(您可以通过ViewDeclarationLanguage#getViewMetadata()以每个视图为基础获取)。

大部分自我记录将会把<f:metadata>放在视图的顶部,这样您就可以乍一看地看到任何元数据,而无需滚动到视图源代码的一半或底部。

使用普通页面时,只需将它放在<h:head>之前即可。

<!DOCTYPE html> 
<html lang="en" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
> 
    <f:metadata> 
     <f:viewParam name="userId" value="#{bean.userId}" /> 
     <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
     <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
     <f:viewParam name="sort" value="#{bean.sort}" /> 
    </f:metadata> 

    <h:head> 
     ... 
    </h:head> 

    <h:body> 
     ... 
    </h:body> 
</html> 

当使用模板,推荐的方法,如在the <f:metadata> tag documentation所述,将声明在主模板单独<ui:insert name="metadata">并让客户在<ui:define name="metadata">定义<f:metadata>

<ui:composition template="/WEB-INF/pattern.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
> 
    <ui:define name="metadata"> 
     <f:metadata> 
      <f:viewParam name="userId" value="#{bean.userId}" /> 
      <f:viewParam name="startRecord" value="#{bean.startRecord}" /> 
      <f:viewParam name="pageSize" value="#{bean.pageSize}" /> 
      <f:viewParam name="sort" value="#{bean.sort}" /> 
     </f:metadata> 
    </ui:define> 

    <ui:define name="content"> 
     <h1>Data Table</h1> 
     ... 
    </ui:define> 
</ui:composition> 
+0

我必须说,看起来比我一直在做的事情要干净一些。不知何故,我没有想到为了元数据目的创建一个** ui:insert **,但我现在就可以。 – AlanObject 2012-03-25 03:27:31

+0

这是否意味着'f:metadata'不能放在例如一个页面模板中以使它可重用?那么如果我们想在每个视图呈现之前执行一些操作,那么该怎么做呢? – 2014-01-20 14:25:24

+1

@Xtreme:只需使用''。它实际上不需要放在''内。另请参阅http://stackoverflow.com/questions/7343220/jsf-does-it-matter-whether-place-fevent-inside-fmetadata-or-not/7343242#7343242 – BalusC 2014-01-20 14:26:43

相关问题