2013-01-22 14 views
5

Ich p1 auf eine andere Seite page.xhtml einen Parameter übergeben:Wie Wert einer ui abzurufen: param im Backing Bean

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

Ist das möglich zu bewerten #{p1} innerhalb @PostConstruct Methode der Träger Bohne page.xhtml? Mit dem folgenden Stück Code kann #{p1} nicht lösen:

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

Warum das ich benötige?

Ich verwende eine Xhtml-Datei (sagen component.xhtml) als benutzerdefinierte UI-Komponente. Diese Datei hat eine Backing-Bean, von der ich Komponentendaten erhalten soll. Da ich diese xhtml-Datei zweimal oder öfter in meine JSF-Hauptseite einfüge, möchte ich verschiedene Objekte an jede von component.xhtml übergeben, damit meine Komponente jedes Mal mit meinen benutzerdefinierten Daten arbeitet.

+0

In dem Verfahren zum Sichern Bean dieser Code befindet? – partlov

+0

aktualisiert meine Frage: @ PostConstruct-Methode. – Mohsen

+0

Das kann ein Problem sein. Die @ PostConstruct-Methode kann ausgeführt werden, bevor die Seite erstellt wird. Versuchen Sie, 'f: event' für' preRenderView' zu definieren und sehen Sie, ob es gelöst ist. – partlov

Antwort

8

In Mojarra können Sie es als ein Attribut der FaceletContext bekommen. Sie können es in der einer verwalteten Bean, die garantiert ist, zum ersten Mal in der enthaltenen Seite (und somit nicht in der übergeordneten Seite vor der <ui:param> im Komponentenbaum deklariert) wird verwiesen/konstruiert werden.

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

In MyFaces, die ganzen FaceletContext ist in Managed Beans nicht verfügbar, da es bis Ende Ansicht Kompilierzeit verworfen hat und dieses Konstrukt würde dann nicht funktioniert. Um unabhängig von der JSF-Implementierung zu sein, sollten Sie erwägen, sie stattdessen über <c:set scope="request"> festzulegen. Es ist dann als Anforderungsattribut verfügbar.

In Bezug auf die konkrete funktionelle Anforderung, erstellen Sie eine Composite-Komponente mit einer Backing-Komponente. Für einige Beispiele siehe our composite component wiki page und diesen Blog über using multiple input components in a composite component. Siehe auch When to use <ui:include>, tag files, composite components and/or custom components?

0

Dies funktioniert für mich:

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

page.xhtml:

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

Ihre Bohne:

@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; 
    }} 
Verwandte Themen