2011-06-22 14 views
45

Czy można zdefiniować zmienną i ponownie użyć zmiennej później w wyrażeniach EL?Definiowanie i ponowne użycie zmiennej EL na stronie JSF

Na przykład:

<h:inputText 
    value="#{myBean.data.something.very.long}" 
    rendered="#{myBean.data.something.very.long.showing}" 
/> 

co mam na myśli coś takiego:

<!-- 
    somehow define a variable here like : 
    myVar = #{myBean.data.something.very.long} 
--> 
<h:inputText 
    value="#{myVar}" 
    rendered="#{myVar.showing}" 
/> 

jakieś pomysły? Dziękuję Ci !

Odpowiedz

85

Można użyć <c:set> na to:

<c:set var="myVar" value="#{myBean.data.something.very.long}" scope="request" /> 

To wyrażenie EL zostaną następnie ocenione raz i przechowywane w zakresie żądania . Zauważ, że działa to tylko wtedy, gdy wartość jest dostępna podczas view build time. Jeśli to nie jest przypadek, to trzeba by usunąć scope attribtue tak, że staje się prawdziwą „alias”:

<c:set var="myVar" value="#{myBean.data.something.very.long}" /> 

Uwaga zatem nie w tym robi cache oceniana wartość w zakresie żądanie! Zostanie ona ponownie oceniona za każdym razem.

+1

Wow, dzięki! Myślałem, że ui: param dostarcza tylko zmienną do użycia w szablonie, który wykorzystuje ui: composition. Czy to oznacza, że ​​każda strona jsf, którą tworzę, jest faceletią, mimo że nie używam ui: composition? – bertie

+0

@BalusC, co masz na myśli mówiąc, nie buforuj wartości? –

+6

@Msaleh: Za każdym razem, gdy wywołasz '# {myVar}', wartość '# {myBean.data.something.very.long}' zostanie ponownie obliczona. Nie będzie on oceniany tylko raz podczas zestawu. Jest to zatem jedynie "alias". – BalusC

18

Podobnie jak w przypadku każdego widoku w MVC, strona powinna być jak najprostsza jak . Jeśli chcesz użyć skrótu, umieść skrót w komponencie kontroler (fasola @ManagedBean lub @Named).

Kontroler:

@Named 
public MyBean 
{ 
    public Data getData() 
    { 
     return data; 
    } 

    public Foo getFooShortcut() 
    { 
     return data.getSomething().getVery().getLong(); 
    ] 
} 

Widok:

<h:inputText 
    value="#{myBean.fooShortcut}" 
    rendered="#{myBean.fooShortcut.showing}" 
/> 
+0

Idealne rozwiązanie do przechwytywania moich obiektów metadanych z komponentu bean. Dzięki! – nettie