#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.