这是Mojarra的错误还是我试图做一些规范不支持的事情?
我有一个复合组件“outerComposite”,ui:include
是一个带有另一个复合组件“innerComposite”的facelet。我想使用<ui:param>
将外部组合的客户端ID传递给内部组合。根据EL表达式的外观,这在Wildfly 10/11上有效或失败,但在Websphere Liberty 17.0.0.1上适用于所有情况。
outerCompositeUsingPage.xhtml
<h:head />
<h:body>
<h:form id="form">
<app:outerComposite id="outer" value="Test" />
</h:form>
</h:body>
outerComposite.xhtml ,其中包含 innerComposite 的facelet:
<cc:implementation>
<c:set var="clientIdViaSet" value="#{cc.clientId}" />
<div id="#{cc.clientId}">
<ui:include src="innerCompositeInclude.xhtml">
<ui:param name="clientIdDirect" value="#{cc.clientId}" /> <-- WORKS
<ui:param name="clientIdViaMethod" value="#{compositeHelperBean.getClientId(cc)}" /> <-- FAILS
<ui:param name="clientIdViaSet" value="#{clientIdViaSet}" /> <-- WORKS
</ui:include>
</div>
innerCompositeInclude.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:app="http://xmlns.jcp.org/jsf/composite/components/app" >
<app:innerComposite id="inner"
value1Key="Direct"
value1Value="#{clientIdDirect}"
value2Key="Via Method"
value2Value="#{clientIdViaMethod}"
value3Key="Via c:set"
value3Value="#{clientIdViaSet}"
/>
</ui:composition>
innerComposite.xhtml
<cc:interface>
<cc:attribute name="value1Key" type="java.lang.String" />
<cc:attribute name="value2Key" type="java.lang.String" />
<cc:attribute name="value3Key" type="java.lang.String" />
<cc:attribute name="value1Value" type="java.lang.String" />
<cc:attribute name="value2Value" type="java.lang.String" />
<cc:attribute name="value3Value" type="java.lang.String" />
</cc:interface>
<cc:implementation>
<div id="#{cc.clientId}">
<h:panelGrid columns="2">
<h:outputText value="#{cc.attrs.value1Key}" />
<h:outputText value="#{cc.attrs.value1Value}" />
<h:outputText value="#{cc.attrs.value2Key}" />
<h:outputText value="#{cc.attrs.value2Value}" />
<h:outputText value="#{cc.attrs.value3Key}" />
<h:outputText value="#{cc.attrs.value3Value}" />
</h:panelGrid>
</div>
</cc:implementation>
ComponentHelperBean.java
@ApplicationScoped
@Named
public class CompositeHelperBean {
public String getClientId(UIComponent comp) {
return comp.getClientId();
}
}
由于#{cc.clientId}
作为参数传递给包含文件,因此我希望#{cc.clientId}
为外部复合的值。这确实有效。
因为#{compositeHelperBean(cc)}
只调用cc.getClientId()
,所以我希望这会产生与直接EL表达式#{cc.clientId}
相同的结果。这是不的情况;相反,它解析为内部复合组件的客户端ID。
结果如下所示 Wildfly 10/11 :
Direct form:outer <--- OK
Via Method form:outer:inner <--- WRONG
Via c:set form:outer <--- OK
结果在 Websphere Liberty Profile 17.0.0.1
中显示如下Direct form:outer <--- OK
Via Method form:outer <--- OK
Via c:set form:outer <--- OK
我已经研究过Mojarra和MyFaces的代码。两者都有一个用于创建ValueExpression的TagHandlerImpl。在那里,他们使用正则表达式来确定EL是否与cc
有关。两种表达方式都不同,可以解释为什么行为不同。