如何使用带有参数的ui:include?

35

我有两个JSF 1.2页面(one.xhtml和other.xhtml),
它们被以下规则包含到当前页面中:

...
    <c:if test="#{flowScope.Bean.param1}">
        <ui:include src="one.xhtml"/>
    </c:if> 

    <c:if test="#{!flowScope.Bean.param1}">
        <ui:include src="other.xhtml"/>
    </c:if> 
...

只要one.xhtmlother.xhtml之间仅通过操作参数不同:

one.xhtml:<h:commandLink action="actionOne">
other.xhtml:<h:commandLink action="actionTwo">

是否可能使用一些通用的xhtml?
而不是像one.xhtml和other.xhtml那样,类似于这样:

...
    <c:if test="#{flowScope.Bean.param1}">
        <ui:include src="general.xhtml" param="actionOne"/>
    </c:if> 

    <c:if test="#{!flowScope.Bean.param1}">
        <ui:include src="general.xhtml" param="actionTwo"/>
    </c:if> 
...

感谢你的帮助。

2个回答

67

你需要将 <ui:param> 嵌套在 <ui:include> 中,以便向所包含的文件传递参数。

<ui:include src="general.xhtml">
    <ui:param name="action" value="actionOne" />
</ui:include>

并且在包含文件中:

<h:commandButton action="#{action}" />

请注意,这只支持字符串,而不是操作方法。对于后者,您需要升级到JSF 2.0并使用组合组件


谢谢,我知道CC很棒,但在当前的JSF 1.2项目中无法使用它们。我会尝试你的解决方案,并回复结果。 - sergionni
它将根据您在问题中提出的方式工作。但是,如果您使用的是#{bean.doSomething}而不是actionOne,那么您确实需要获取JSF 2.0组合组件。 - BalusC
奇怪的是,它抛出了:action="#{action}": 'action'标识为空,无法调用。 - sergionni
2
作为一条注释,param 不仅适用于字符串,还适用于整个对象。 - Adam
2
@Adam:在使用<ui:param>时是的。这不是什么秘密。但是对于<f:param>不适用,它将始终转换为字符串。也许你最初的困惑是基于此的。 - BalusC
2
@BalusC:我只是想为将来的参考进行详细说明。感谢您提到f:param及其与ui:param的比较。我以前从未使用过f库版本,现在会记住它们之间的区别。 - Adam

23

除了BalusC的答案之外:

请注意,这仅支持字符串而不是操作方法。对于后者,您需要升级到JSF 2.0并使用组合组件。

虽然有些丑陋,但在JSF 1.2中也有一种方法可以实现此目的:

<ui:include src="general.xhtml">
    <ui:param name="actionBean" value="#{myBackingBean}" />
    <ui:param name="actionMethod" value="edit" />
</ui:include>

<h:commandButton action="#{actionBean[actionMethod]}" />

请问为什么对于actionBean的值,我们需要用#{}将其括起来才能正常工作? - Nik Mohamad Lokman

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