将支持bean作为参数传递给Facelet包含

11

我有一个Facelet,可能会在不同的应用程序中使用。 我不想复制它,而是重用它。我需要将管理视图的后备bean作为参数传递, 因为某些逻辑可能根据使用它的应用程序而异。

我不想使用组合组件,只想包含Facelet并指定哪个bean将管理视图。我该怎么做?

让我举个例子:

<ui:composition template="/resources/common/templates/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions">
    <ui:define name="content">
        <!-- somehow establish the backing bean that will manage formView.xhtml --> 
        <!-- f:set  assign="ParameterBean" value="#{Bean}" / -->
        <ui:include src="formView.xhtml" />
    </ui:define>
</ui:composition>

formView.xhtml:

<ui:composition template="/resources/common/templates/template.xhtml"
    xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich" xmlns:fn="http://java.sun.com/jsp/jstl/functions">
    <ui:define name="content">
        <h:outputText value="#{ParameterBean.texto}" />
    </ui:define>
</ui:composition>
2个回答

24
你可以使用 <ui:param> 来实现。它需要嵌套在 <ui:include> 中。
<ui:include src="formView.xhtml">
    <ui:param name="ParameterBean" value="#{Bean}" />
</ui:include>

与具体问题无关,标准的Java命名约定指出实例变量的名称必须以小写字母开头。您应该相应地更改代码, 使用parameterBean#{bean}


你如何引用 ParameterBean 来调用实例上的方法? - Thufir

0

因为昨天我在寻找这个的时候会发现这非常有帮助,所以在这里提供一个简单版本的方法,不需要额外的模板、定义和命名空间:

File1.xhtml(根标签不重要)

<ui:include src="File2.xhtml">
  <ui:param name="person" value="#{whatever_value_you_want_to_pass}" />
</ui:include>

File2.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets" ... >
  <h:outputLabel value="#{person.name}" />
</ui:composition>


您也可以以相同的方式进一步嵌套。

File1.xhtml

<ui:include src="File2.xhtml">
  <ui:param name="person" value="#{whatever_value_you_want_to_pass}" />
</ui:include>

File2.xhtml

<ui:composition ... xmlns:ui="http://java.sun.com/jsf/facelets" ... >
  <ui:include src="File3.xhtml">
    <ui:param name="name" value="#{person.name}" />
  </ui:include>
</ui:composition>

File3.xhtml

<ui:composition ... xmlns:h="http://java.sun.com/jsf/html"
  xmlns:ui="http://java.sun.com/jsf/facelets" ... >
  <h:outputLabel value="#{name.length}" />
</ui:composition>

我看不出这与下面的答案有什么不同? - Kukeltje
我很难理解答案应该如何使用,所以我尝试让它更明显易懂,方便其他人。 - Chris
然后您可以“编辑”问题并删除这些内容,并在“评论”中说明您为什么这样做。当其他人“接受”更改时,它将变得可见。然后无需创建第二个答案。 - Kukeltje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接