2012-03-25 23 views
21

Zrobiłem duży postęp w konwersji moich aplikacji JSF na strony z książkami, ale zastanawiam się, czy robię to we właściwy sposób. Jedno pytanie brzmi: czy istnieje najlepsza praktyka dla tagów f: metadata?Podczas korzystania z <ui: composition> templating, gdzie powinienem zadeklarować <f:metadata>?

Mój typowy klient Facelets strona wygląda tak:

<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 

Więc f: f metadanych i dziecko : viewParam znaczniki występują w ciele mojej stronie. Mój szablon pattern.xhtml zawiera również sekcję (o nazwie "header"), która może umieścić te znaczniki w sekcji nagłówka. Czy należy je tam umieścić? Czy to robi różnicę, czy też jestem nastawiony na jakiś efekt uboczny, którego jeszcze nie widziałem?

Odpowiedz

39

Technicznie nie ma znaczenia, gdzie w widoku jest zadeklarowany <f:metadata>, o ile jest w widoku najwyższego poziomu (czyli przy szablonach w kliencie szablonu, a więc nie w szablonie głównym). Po utworzeniu widoku metadane zasadniczo nie są częścią drzewa komponentów JSF, ale głównego katalogu widoku (który można uzyskać w trybie pojedynczego widoku przez ViewDeclarationLanguage#getViewMetadata()).

Najbardziej samodzielne dokumentowanie polegałoby na umieszczeniu <f:metadata> w górnej części widoku, aby na pierwszy rzut oka można było zobaczyć dowolne metadane bez potrzeby przewijania do połowy lub do dołu kodu źródłowego widoku.

Używając zwykłej strony, po prostu umieść ją tuż przed numerem <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> 

Podczas korzystania templating, zalecanego podejścia, zgodnie the <f:metadata> tag documentation, byłoby zadeklarować oddzielny <ui:insert name="metadata"> w szablonie głównym i niech klient określić <f:metadata> w <ui:define name="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

Muszę powiedzieć, że wygląda nieco czystsze niż to, co robiłem. Jakoś nie przyszło mi do stworzenia ** ui: insert ** tylko dla celów metadanych, ale teraz będę. – AlanObject

+0

Czy oznacza to, że 'f: metadata' nie może być umieszczony na przykład w szablonie strony, aby można go było ponownie użyć? Co zrobić, jeśli istnieje jakieś działanie, które chcemy wykonać dla każdego widoku, zanim zostaną renderowane? –

+1

@Xtreme: Po prostu użyj ''. W rzeczywistości nie jest wymagane umieszczanie wewnątrz ''. Zobacz także http://stackoverflow.com/questions/7343220/jsf-does-it-matter-whether-place-fevent-inside-fmetadata-or-not/7343242#7343242 – BalusC