【问题标题】:Reusing the same page multiple times多次重复使用同一个页面
【发布时间】:2026-02-04 01:15:01
【问题描述】:

是否可以多次重复使用附加到不同对象的一个​​页面?

我有一个页面,您可以输入个人信息(姓名、地址、社交号码……)连接到一个 bean:前景。 在某些情况下,我必须收集链接的个人信息。信用评分示例(个人和担保人)。

所以我想使用 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>

和面孔上下文

<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 种可能的解决方法: - 复制页面并在 faces-config 中定义 2 个 bean(指向同一个 java 类) - 不要使用 tabpanel 和 include,而是输入 person1 info ,然后保存并加载 person2 info 并保存 person2。

Workaround1 的缺点是它两次维护相同的代码。 Workaround2 的缺点是它不是那么“酷”(从用户体验的角度来看)

【问题讨论】:

    标签: java jsf xhtml include


    【解决方案1】:

    您可以使用&lt;ui:param&gt;&lt;ui:include&gt;传递参数:

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

    对于上面的示例,在每个包含中,所需的人将作为#{person} 可用。那些&lt;f:subview&gt; 标签是为了防止重复的组件 ID 错误,因为它们最终在同一个 UINamingContainer 父级中。

    【讨论】:

    • 当我这样做时,我收到以下错误:javax.servlet.ServletException: 组件 ID 前景详细信息:creditScoreView:privatePerson 已在视图中找到。我该如何解决这个问题? privatePerson 是在前景.xhtml 中使用的组件 id
    • 显然 RichFaces 选项卡不是 UINamingContainer 组件。尝试将带有唯一 ID 的 &lt;f:subview&gt; 放在 &lt;ui:include&gt; 周围。