2013-05-30 9 views
9

Ich habe ein Facelet, das in verschiedenen Anwendungen verwendet werden kann. Ich kopiere es nicht, aber benutze es wieder. Ich muss die Backing-Bean übergeben, die die Ansicht als Parameter verwaltet, da einige Logik je nach der Anwendung, in der es verwendet wird, variieren kann.Übergeben der Backing Bean als Parameter zu einem Facelet gehören

Ich möchte keine zusammengesetzte Komponente verwenden, sondern nur die Facelet und geben Sie an, welche Bean die Ansicht verwalten soll. Wie kann ich das erreichen?

Lassen Sie mich ein Beispiel geben:

<ui:composition template="/resources/common/templates/template.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
    <ui:define name="content"> 
     <!-- somehow establish the backing bean that will manage formView.xhtml --> 
     <!-- f:set assign="ParameterBean" value="#{Bean}"/--> 
     <ui:include src="formView.xhtml" /> 
    </ui:define> 
</ui:composition> 

formView.xhtml:

<ui:composition template="/resources/common/templates/template.xhtml" 
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions"> 
    <ui:define name="content"> 
     <h:outputText value="#{ParameterBean.texto}" /> 
    </ui:define> 
</ui:composition> 

Antwort

22

Sie <ui:param> dafür verwenden können. Es muss in der <ui:include> geschachtelt werden.

<ui:include src="formView.xhtml"> 
    <ui:param name="ParameterBean" value="#{Bean}" /> 
</ui:include> 

Unrelated auf die konkrete Problem, Standard Java Naming Conventions Zustand, dass Instanz Variablennamen mit Kleinbuchstaben beginnen. Sie sollten Ihren Code so ändern, dass parameterBean und #{bean} verwendet werden.

+0

wie wollen Sie verweisen 'ParameterBean' auf der Instanzmethoden zu nennen? – Thufir

0

Weil ich es hilfreich gestern gefunden hätte, wenn ich für diese Suche wurde, hier ist eine einfache Version, wie dies zu tun, ohne die Fremd Vorlage definiert und Namespaces:

File1.xhtml (die Wurzel Tag keine Rolle spielt)

<ui:include src="File2.xhtml"> 
    <ui:param name="person" value="#{whatever_value_you_want_to_pass}" /> 
</ui:include> 

File2.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <h:outputLabel value="#{person.name}" /> 
</ui:composition> 


Sie können auch Nest weiter die gleiche Art und Weise.

File1.xhtml

<ui:include src="File2.xhtml"> 
    <ui:param name="person" value="#{whatever_value_you_want_to_pass}" /> 
</ui:include> 

File2.xhtml

<ui:composition ... xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <ui:include src="File3.xhtml"> 
    <ui:param name="name" value="#{person.name}" /> 
    </ui:include> 
</ui:composition> 

File3.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" ... > 
    <h:outputLabel value="#{name.length}" /> 
</ui:composition> 
+0

Ich kann nicht sehen, wie sich das von der Antwort unten unterscheidet? – Kukeltje

+0

Es fiel mir schwer, genau zu verstehen, wie die Antwort verwendet werden sollte, also versuchte ich, es für andere offensichtlicher zu machen. – Chris

+0

Dann können Sie die Frage "bearbeiten" und diese Dinge entfernen und im "Kommentar" erwähnen, warum Sie das getan haben. Wenn andere die Veränderung "akzeptieren", wird es sichtbar sein. Keine Notwendigkeit, eine zweite Antwort dann zu erstellen. – Kukeltje

Verwandte Themen