Определение и повторное использование переменной EL на странице JSF - PullRequest
55 голосов
/ 22 июня 2011

Можно ли определить переменную и использовать ее позже в выражениях EL?

Например:

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

Я имею в виду что-то вроде:

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

Есть идеи?Спасибо!

Ответы [ 2 ]

103 голосов
/ 22 июня 2011

Вы можете использовать <c:set> для этого:

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

Это выражение EL будет затем оценено один раз и сохранено в области запроса. Обратите внимание, что это работает только тогда, когда значение доступно во время просмотра времени сборки . Если это не так, вам нужно удалить атрибут scope, чтобы он стал истинным псевдонимом:

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

Обратите внимание, что этот не кэширует оцененное значение в области запроса! Он будет пересматриваться каждый раз.

Не НЕ использовать <ui:param>. Когда не используется для передачи параметра в template, как определено в <ui:composition> или <ui:decorate>, и, таким образом, по существу злоупотребляет им, то поведение не определено, и фактически это будет ошибка в реализации JSF. использовал, если бы это было возможно. На это никогда не следует полагаться. Смотрите также JSTL в JSF2 Facelets ... имеет смысл?

20 голосов
/ 22 июня 2011

Как и в любом представлении в MVC, страница должна быть максимально простой . Если вы хотите ярлык, поместите ярлык в контроллер (@ManagedBean или * 1006).* bean).

Контроллер:

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

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

Вид:

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