如果放置在包含文件中,操作将不会回调bean。
主要文件:<h:form id="ifLogin">
<h:panelGrid
rendered="#{userSession.isLogin}"
columns="2" columnClasses="columnAlignLeft, columnAlignRight"
border="0" cellpadding="0">
<ui:include src="test.xhtml" />
...
</h:panelGrid>
</h:form>
包含文件(test.xhtml)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition 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:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<h:panelGrid border="0" columns="4">
<h:graphicImage value="#{msg.urlImageHome}"
style="height:26px;width:26px;" />
<f:subview>
<h:commandLink value="#{msg.home}" style="font-size: small;" immediate="true"
action="#{pageNavigationBean.updateCeaAppName}">
<f:param name="requestName" value="CEA_MAIN_PAGE" />
<f:param name="ceaAppName" value="" />
</h:commandLink>
</f:subview>
</h:panelGrid>
</ui:composition>
的解决方法是取出包含文件,直接将代码放在主文件中,如下所示:
主文件(不使用include)
<h:form id="ifLogin">
<h:panelGrid
rendered="#{userSession.isLogin}"
columns="2" columnClasses="columnAlignLeft, columnAlignRight"
border="0" cellpadding="0">
<h:panelGrid border="0" columns="4">
<h:graphicImage value="#{msg.urlImageHome}"
style="height:26px;width:26px;" />
<f:subview>
<h:commandLink value="#{msg.home}" style="font-size: small;" immediate="true"
action="#{pageNavigationBean.updateCeaAppName}">
<f:param name="requestName" value="CEA_MAIN_PAGE" />
<f:param name="ceaAppName" value="" />
</h:commandLink>
</f:subview>
</h:panelGrid>
...
</h:panelGrid>
</h:form>
我使用richface 4.3.1奇怪的是,当我从本地GAE运行时,这个问题没有发生。在线部署到GAE后,会出现问题(即如果使用include,则不会触发操作)。
这是jsf中的一个bug吗?或richface实现或GAE?任何帮助吗?
问题识别
不是使用<ui:include>
引起的
当包含文件从后bean动态生成时,问题就出现了,例如:
<ui:include src="#{pageNavigationBean.appDropDownMenuUrl}" />
如果明确提到url,它可以工作,例如:
<ui:include src="test.xhtml" />
好吧,如果从我的本地GAE运行,两种方式都在工作,但当在线部署时,我需要使用显式位置而不是从bean生成。可能是由于GAE问题,其中状态保存在客户端(javax.faces.STATE_SAVING_METHOD)。
我无法用完全相同的包含代码(test.xhtml)重现问题,但这里有一些建议:
- 转义'>'字符(用
>>>
代替>>>
) - 为
f:subview
指定id
属性(根据tld要求) - 将反斜杠('')更改为斜杠('/')。所以包含是
<ui:include src="/test.xhtml" />