2013-01-22 9 views
5

olewam parametr p1 do innej strony page.xhtml:Jak odzyskać wartość ui: param w fasoli podkładowej

<ui:include src="page.xhtml"> 
    <ui:param name="p1" value="#{someObject}"/> 
</ui:include> 

Czy to możliwe, aby ocenić #{p1} wewnątrz metody @PostConstruct fasoli poparciem page.xhtml? Stosując następujący fragment kodu, #{p1} nie można rozwiązać:

FacesContext currentInstance = FacesContext.getCurrentInstance(); 
currentInstance.getApplication().evaluateExpressionGet(currentInstance, "#{p1}", String.class); 

Dlaczego potrzebne?

Używam pliku xhtml (np. Component.xhtml) jako niestandardowego składnika interfejsu użytkownika. Ten plik ma komponent bean, z którego powinienem pobrać dane komponentu. Ponieważ umieszczam ten plik xhtml dwa lub więcej razy na mojej głównej stronie JSF, chcę przekazać różne obiekty do każdego pliku component.xhtml, aby mój komponent działał z moimi niestandardowymi danymi za każdym razem.

+0

W których metoda tworzenia kopii fasola jest to kod znajduje? – partlov

+0

zaktualizowałem moje pytanie: @PostConstruct method. – Mohsen

+0

To może być problem. Metoda @PostConstruct może być wykonana przed utworzeniem strony. Spróbuj zdefiniować 'f: event' dla' preRenderView' i sprawdź, czy jest rozwiązane. – partlov

Odpowiedz

8

W Mojarra można go uzyskać jako atrybut FaceletContext. Można go uzyskać w komponencie zarządzanym, który gwarantuje, że odniesie się/skonstruuje go po raz pierwszy na dołączonej stronie (a zatem nie znajduje się na stronie nadrzędnej, zanim zostanie zadeklarowany w drzewie komponentów).

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY); 
Object p1 = faceletContext.getAttribute("p1"); 

W MyFaces cała FaceletContext nie jest dostępny w zarządzanych fasoli jak to wyrzucić do końca Czas budować i ten konstrukt będzie wtedy nie działa. Aby być niezależną od implementacji JSF, możesz chcieć ustawić ją za pomocą <c:set scope="request">. Jest wtedy dostępny jako atrybut żądania.

Co do konkretnego wymagania funkcjonalnego, należy rozważyć utworzenie komponentu złożonego z komponentem pomocniczym. Kilka przykładów można znaleźć na stronie our composite component wiki page i na tym blogu na temat using multiple input components in a composite component. Zobacz także When to use <ui:include>, tag files, composite components and/or custom components?

0

Działa to dla mnie:

<ui:include src="page.xhtml"> 
    <ui:param name="p1" value="#{someObject}"/> 
</ui:include> 

page.xhtml:

<c:set var="data" value="#{p1}" scope="request"/> 

Twój fasola:

@ViewScoped 
public class ManagedBean{ 

    private Object someObject; 

    public Object getSomeObject(){ 
     if(someObject== null){ 
      HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
      someObject= request.getAttribute("data"); 
      } 
      return someObject; 
    } 

    public void setSomeObject(Object someObject){ 
      this.someObject = someObject; 
    }} 
Powiązane problemy