Многократное повторное использование одной и той же страницы

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