0

如果我放置在一个包含文件中,该操作将不会回调 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>

解决方法是取出包含文件,直接将代码放到主文件中,如下所示:

主文件(不使用包含)

<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 后,出现问题(即如果使用包含,则不会触发操作。

这是jsf中的错误吗?或richface实现或GAE?有什么帮助吗?

4

2 回答 2

1

问题识别

这不是使用引起的<ui:include>

当包含文件是从后台bean动态生成时,问题就出现了,例如:

<ui:include src="#{pageNavigationBean.appDropDownMenuUrl}" />

如果明确提及 url,它会起作用,例如:

<ui:include src="\test.xhtml" />  

好吧,如果从我的本地 GAE 运行,两种方式都可以工作,但是当在线部署时,我需要使用显式位置而不是从 bean 生成。可能是由于 GAE 问题导致状态保存在客户端(javax.faces.STATE_SAVING_METHOD)。

于 2013-03-19T02:42:44.643 回答
0

我无法使用完全相同的包含代码(test.xhtml)重现该问题,但这里有一些建议:

  1. 转义 '>' 字符(替换>>>&gt;&gt;&gt;
  2. 指定id属性f:subview(根据 tld 是必需的)
  3. 将反斜杠 ('\') 更改为斜杠 ('/')。所以包容将是<ui:include src="/test.xhtml" />
于 2013-03-17T04:00:39.207 回答