2014-12-16 2 views
1

У меня часто возникает следующая проблема. У меня есть приложение JSF и facelet, где я пишу выражение EL, как это:Разрешение переменной EL в JSF: есть ли способ контролировать, когда это происходит?

<h:outputText value="#{myBean.foo}"> 

Пока как myBean, как переменные, имеет жизнь достаточно долго, нет никаких проблем, чтобы оценить myBean.foo в любой момент времени, но если myBean является переменной, которая ссылается на какой-либо компонент в течение короткого периода времени, когда оценивается myBean.foo, может быть слишком поздно, так что JSF жалуется, что myBean разрешает null. Это хорошо известно, но проблема в том, что мне непонятно, чего ожидать в разных ситуациях.

Конкретный пример n. 1: если вы выполните следующие действия с PrimeFaces OrderList:

<p:orderList value="#{bean.myValue}" var="item"> 
    <p:column> 
    <p:commandLink action="#{bean.doSomething(item)}" /> 
    </p:column> 
</p:orderList>` 

Это не будет работать, потому что, когда doSomething называется переменная item больше не определяется (хотя объект он ссылается еще жив) и, следовательно, он разрешен до null. Это known issue. Однако тот же шаблон отлично работает с <p:dataTable>, например. Во всяком случае, сейчас я не заинтересован в этой конкретной проблеме, я просто хочу объяснить свои сомнения.

Конкретный пример n. 2: Я написал составной компонент с бэкэндом. Бэк-бэк расширяет UINamingContainer и использует его StateHelper для сохранения объекта модели. Этот композит позволяет писать дочерние теги и я хотел бы написать что-то вроде этого:

<myns:myCc var="myVar"> 
    <h:inputText value="#{myVar.foo}" /> 
</myns> 

С «MYVAR» Я хочу, чтобы дать имя объекта модели. Чтобы сделать эту работу, я попытался сохранить объект модели в карте запроса в начале метода encodeChildren и удалить его потом: это работает для рендеринга, но если я затем обработаю вход с помощью действия commandButton, это не сработает, потому что когда действие выполняется, в нем говорится, что myVar не может быть разрешен: другими словами, он пытается разрешить все выражение слишком поздно. Затем я попытался «навсегда» сохранить объект модели в карте видимости вида, но он тоже не работает. Однако, если я изменить это:

(при условии, modelObject это поле свойство в бэк-бина, который хранит свою модель объекта) это работает. Таким образом, это не проблема в моей модели, но в том, как я пытаюсь сделать объект модели доступным для EL-выражений для дочерних тегов.

Конкретный пример n. 3: Я часто использую тег <ui:param>, чтобы дать beans более короткое имя и облегчить шаблоны. Например:

<ui:param name="bean" value="#{longNamedAndPageSpecificBean}" /> 

Так что, в оставшейся части страницы я могу просто использовать #{bean.foo} вместо #{longNamedAndPageSpecificBean.foo}. Это прекрасно работает даже для действий, переданных командам. Однако, если я передаю выражение метода, например #{bean.myActionMethod}, атрибуту составного компонента, объявленному с method-signature, когда это выражение метода действительно вызывается, я получаю сообщение об ошибке, которое bean разрешает null ... Причина, по которой она работает в одном случае (с действиями commandButton), а не в другом (с действиями, используемыми составным компонентом), является большим источником путаницы для меня.

Буду признателен, если кто-то может помочь мне лучше понять этот аспект JSF и предложить лучшие подходы/обходные пути с вышеупомянутыми конкретными примерами.

ответ

0

Ваш вопрос выглядит слишком большим, но я могу сказать, что в течение времени сборки доступны только области с привязкой к сеансу и запросам.

То же самое относится к фазе выполнения.

Только этап рендеринга должен обеспечить доступность временных варов «myVar».

Лучший способ понять, что его действительно hapening это отлаживать, потому что его зависит от реализации компонента

+0

А что о том случае, когда реализация компонента является мина (случай 2)? Во всяком случае, именно эта неопределенность (необходимость отладки для понимания вещей), во многих случаях, повышает производительность JSF. Вещи не работают «линейно», потому что «это зависит». Если, конечно, не существует эмпирического правила, объясняющего разные формы поведения, и в этом и заключается суть вопроса. –

 Смежные вопросы

  • Нет связанных вопросов^_^