Проблема проверки JSF2 Viewscope
Попытка отображения страниц динамически в зависимости от значения выпадающего списка. Все связанные компоненты обрабатываются должным образом. Когда я bean находится в области видимости, проверки не запускаются, тогда как сэмплы отлично работает с областью сеанса. Может кто-нибудь пожалуйста, помогите мне решить проблему?
Здесь следует мой код Main.xhtml. Эта страница содержит раскрывающийся список. Основываясь на выпадающем значении, динамически включающем страницы.
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition template="#{templates.standard}">
<ui:define name="contentArea">
<c:choose>
<c:when test="#{testBean.value == '1'}">
<h:panelGroup>
<ui:include src="Page1.xhtml" />
</h:panelGroup>
</c:when>
<c:when test="#{testBean.value == '2'}">
<h:panelGroup>
<ui:include src="Page2.xhtml" />
</h:panelGroup>
</c:when>
</c:choose>
</ui:define>
</ui:composition>
</html>
The below Page1.xhtml will be included dynamically in Main.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:panelGroup>
<h:inputText value="#{testBean1.date}"
id="date"
required="true" requiredMessage="Enter Valid date">
<f:validator validatorId="test.TestDateValidator" />
</h:inputText>
</h:panelGroup>
<h:panelGroup>
<h:message for="date"/>
</h:panelGroup>
Ответы
Ответ 1
Просмотр области видимости beans сохраняется в представлении JSF. Представление JSF доступно только тогда, когда оно было построено. Обработчики тегов, такие как JSTL <c:xxx>
, выполняются во время времени сборки. Таким образом, они запускаются до того, как будет доступно представление JSF. Таким образом, когда вы привязываете свойство видимого вида bean к атрибуту тега JSTL, оно не будет ссылаться на экземпляр bean с видом в представлении JSF, а вместо этого ссылается на только что созданный, со всеми свойствами, установленными на по умолчанию.
Итак, в основном вы получаете два разных экземпляра области с видимым охватом bean для каждого запроса. Один, который используется при восстановлении представления (тот, который недавно воссоздан в каждой форме), и другой, который используется во время обработки формы submit (тот, который фактически хранился в области просмотра).
Эта проблема с куриным яйцом уже сообщается как проблема JSF 1492 и исправлена для предстоящего JSF 2.2.
До тех пор лучше всего создать отдельный охват запроса bean, и пусть условие включения зависит от параметра запроса, который вводится @ManagedProperty
, или для отключения частичного сохранения состояния (которое может иметь память/производительность). Обратите внимание, что <ui:include>
также работает во время времени сборки, поэтому его перенос в компонент JSF с атрибутом rendered
ничего не поможет, поскольку он оценивается во время рендеринга представления.
См. также: