#java #jsf #xhtml #include
#java #jsf #xhtml #включить
Вопрос:
Можно ли повторно использовать одну страницу несколько раз, прикрепленную к разным объектам?
У меня есть страница, на которой вы можете вводить личную информацию (имя, адрес, социальный номер, …), подключаясь к одному компоненту: перспектива. В некоторых случаях я должен собирать связанную личную информацию. пример для оценки кредитоспособности (лицо и гарант).
Поэтому я хотел использовать с 2 включениями. Но как я могу убедиться, что include1 содержит информацию для person1, а include2 содержит информацию для person2?
<rich:tabPanel id="creditScoreTab" switchType="client" >
<rich:tab id="mainContractor" >
<ui:include src="includes/prospect.xhtml" />
</rich:tab>
<rich:tab id="guarantor">
<ui:include src="includes/prospect.xhtml" />
</rich:tab>
</rich:tabPanel>
и facescontext
<managed-bean>
<managed-bean-name>prospect</managed-bean-name>
<managed-bean-class>be.foo.Prospect</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
</managed-bean>
Я нашел 2 возможных обходных пути:
-дублируйте страницу и определите 2 компонента в faces-config (указывая на один и тот же класс Java)
-не используйте tabpanel и include, но введите информацию о персонах1, затем сохраните ее и загрузите информацию о персонах2 и сохраните персонах2.
Обходной путь1 отрицательным моментом является то, что он поддерживает один и тот же код дважды. Обходной путь2 отрицательный момент заключается в том, что это не так «круто» (с точки зрения ux)
Ответ №1:
Вы можете использовать <ui:param>
для передачи параметров в <ui:include>
:
<rich:tabPanel id="creditScoreTab" switchType="client" >
<rich:tab id="mainContractor" >
<f:subview id="mainContractorView">
<ui:include src="includes/prospect.xhtml">
<ui:param name="person" value="#{bean.person1}" />
</ui:include>
</f:subview>
</rich:tab>
<rich:tab id="guarantor">
<f:subview id="guarantorView">
<ui:include src="includes/prospect.xhtml">
<ui:param name="person" value="#{bean.person2}" />
</ui:include>
</f:subview>
</rich:tab>
</rich:tabPanel>
В приведенном выше примере в каждом include желаемый пользователь будет доступен как #{person}
. Эти <f:subview>
теги предназначены для предотвращения повторяющихся ошибок идентификатора компонента, поскольку они попадают в один и тот же UINamingContainer
родительский элемент.
Комментарии:
1. Когда я делаю это, я получаю следующую ошибку: javax.servlet. Исключение ServletException: идентификатор компонента prospectdetail:creditScoreView:privatePerson уже найден в представлении. Как я могу это решить? privatePerson — это идентификатор компонента, используемый в prospect.xhtml
2. По-видимому, вкладки RichFaces не
UINamingContainer
являются компонентами. Попробуйте ввести<f:subview>
уникальный идентификатор вокруг<ui:include>
.