2012-03-25 23 views
21

JSF uygulamalarını kitap-işaretli sayfalara dönüştürmede çok ilerleme kaydettim, ancak bunu doğru şekilde yapıp yapmadığımı merak ediyorum. Tek soru şu: f: metadata etiketleri için en iyi uygulama yeri var mı?<ui: composition> templating kullanıldığında, <f:metadata> bildirmeliyim?

Benim tipik Facelets istemci sayfa şuna benzer:

<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 

Yani f: meta ve çocuk f: viewParam etiketler benim sayfasının gövdesinde karşılaşılır. Ayrıca, model.xhtml şablonumda, bu etiketleri başlık bölümüne yerleştirebilecek bir bölüm ("başlık" olarak adlandırılır) vardır. Oraya konulmalı mı? Fark yaratıyor mu yoksa henüz görmediğim bir yan etki için mi kurdum?

cevap

39

Teknik olarak, <f:metadata> bildirimini, en üst düzey görünümde olduğu sürece (şablon şablonunda, şablon şablonunda ve dolayısıyla ana şablonda değilken) görüntülediğinizde önemli değildir. Görünüm oluşturulduğunda, meta veriler temel olarak JSF bileşen ağacının bir parçası değil, görünüm köküdür (ViewDeclarationLanguage#getViewMetadata() tarafından her bir görünüm için elde edebilirsiniz).

Çoğu belge, görünümün üst kısmına <f:metadata> kodunu koymaktır; böylece, ilk bakışta meta veriyi, görüntü kaynak kodunun yarısına veya altına kaydırmaya gerek kalmadan görebilirsiniz.

Düz bir sayfa kullanırken, <h:head>'dan hemen önce koyun.

<!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 belirtildiği gibi çiftleşmiş, önerilen yaklaşım kullanılarak, ana şablon ayrı <ui:insert name="metadata"> bildirmek ve istemci <ui:define name="metadata"> içinde <f:metadata> tanımlayalım olacaktır.

<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

Yaptığımdan biraz daha temiz görünüyor. Her nasılsa bana sadece meta veri amaçları için bir ** ui: insert ** oluşturmak için gerçekleşmedi, ama şimdi yapacağım. – AlanObject

+0

"f: metadata" örneğin yeniden kullanılabilir hale getirmek için bir sayfa şablonuna yerleştirilemez mi? Daha sonra ne yapmaları gerektiğinden önce her görünüm için yürütmek istediğimiz bir eylem varsa ne yapmalı? –

+1

@ Xtreme: Sadece '' kullanın. Aslında ' 'içine yerleştirilmeye gerek yoktur. Ayrıca bkz. Http://stackoverflow.com/questions/7343220/jsf-does-it-matter-whether-place-fevent-inside-fmetadata-or-not/7343242#7343242 – BalusC