Должен ли я передавать ui:param в шаблоне, если я использую ui:составной и ui:вставка, ui:включение?

#jsf #facelets

Вопрос:

У меня есть одна страница main.xhtml, которая содержит пользовательский интерфейс:композиция. В этой композиции используется файл template1.xhtml. файл template1.xhtml содержит пользовательский интерфейс:вставка, пользовательский интерфейс:включает тег, указывающий на файл template2.xhtml. Теперь я хочу использовать параметры, которые передаются из ui:композиция внутри template2.xhtml.

main.xhtml

 <ui:composition template="template1.xhtml">
    <ui:param name="a1" value="val1"/>
</ui:composition>
 

шаблон 1.xhtml

 <ui:insert name="header">
    <ui:include src="template2.xhtml">
</ui:insert>
 

шаблон 2.xhtml

 <h:panelGroup rendered="#{not empty a1}" layout="block">
    <h4>#{a1}</h4>
</h:panelGroup>
 

Мой вопрос в том, могу ли я напрямую получить доступ к параметру с именем a1, или мне пришлось снова передать ui:param в ui:include?

Ответ №1:

Зависит от версии Facelets и JSF impl/версии.

В исходных наборах лиц 1.x любая <ui:param> родительская композиция наследуется всем <ui:include> дочерним элементам.

 <ui:include src="template2.xhtml" />
 

В Facelets 2.x, интегрированных в JSF 2.x, любая <ui:param> родительская композиция, которая должна быть повторно использована в <ui:include> (или <ui:decorate> ), должна быть явно передана.

 <ui:include src="template2.xhtml">
    <ui:param name="a1" value="#{a1}" />
</ui:include>
 

По крайней мере, это тот случай, когда вы используете Mojarra 2.x. В MyFaces 2.0 / 2.1, однако в этом не было необходимости, поскольку исходное поведение Facelets 1.x непреднамеренно проскользнуло в MyFaces 2.0 / 2.1.

 <ui:include src="template2.xhtml" />
 

Они исправили это в MyFaces 2.2, поэтому вам нужно явно передать их.

 <ui:include src="template2.xhtml">
    <ui:param name="a1" value="#{a1}" />
</ui:include>
 

В случае, если вы используете MyFaces 2.2 или новее и хотите сохранить исходное поведение Facelets 1.x, вы можете добавить следующий параметр контекста в web.xml :

 <context-param>
    <param-name>org.apache.myfaces.STRICT_JSF_2_FACELETS_COMPATIBILITY</param-name>
    <param-value>true</param-value>
</context-param>
 
 <ui:include src="template2.xhtml" />
 

Для Mojarra не существует такого параметра контекста, поэтому на него не следует полагаться, если вы хотите, чтобы ваш код работал одинаково во всех реализациях JSF.

Комментарии:

1. Есть какие-нибудь подробности о части PrimeFaces?

2. А? PrimeFaces не является приложением JSF.