2013-05-30 15 views
9

Mam moduł Facelet, który może być używany w różnych aplikacjach. Nie kopiować, ale użyć ponownie. Muszę przekazać komponent bean, który będzie zarządzał widokiem jako parametrem, ponieważ niektóre logiki mogą się różnić w zależności od aplikacji, w której jest używany.Przekazywanie komponentu bean bean jako parametru do narzędzia Facelet obejmuje:

Nie chcę używać komponentu kompozytowego, ale po prostu dołącz Facelet i określ, który komponent bean będzie zarządzał widokiem. Jak mogę to osiągnąć?

Podam przykład:

<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> 

Odpowiedz

22

Można użyć <ui:param> do tego. Musi być zagnieżdżony w <ui:include>.

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

niezwiązane do konkretnego problemu, standard Java Naming Conventions stan tej instancji nazwy zmiennych muszą zaczynać się małą literą. Powinieneś zmienić swój kod w taki sposób, aby użyć odpowiednio parameterBean i #{bean}.

+0

jak można odwołać 'ParameterBean' wywołać metody na przykład? – Thufir

0

Bo bym jest pomocna wczoraj, kiedy szukałem tego, tutaj jest prosta wersja, jak to zrobić, bez obcego szablonu, definiuje i przestrzenie nazw:

File1.xhtml (korzeń tag nie ma znaczenia)

<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> 


można także dodatkowo w gniazdo w ten sam sposób.

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

Nie widzę, jak to się różni od odpowiedzi poniżej? – Kukeltje

+0

Trudno mi było dokładnie zrozumieć, w jaki sposób należy użyć tej odpowiedzi, więc starałem się, aby było to bardziej oczywiste dla innych. – Chris

+0

Następnie możesz "edytować" pytanie i usunąć te rzeczy oraz wspomnieć o "komentarzu", dlaczego to zrobiłeś. Gdy inni zaakceptują zmianę, będzie ona widoczna. Nie trzeba wtedy tworzyć drugiej odpowiedzi. – Kukeltje

Powiązane problemy