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>

私はリッチフェイス 4.3.1 を使用しています。奇妙なことに、ローカル GAE から実行するとこの問題は発生しません。オンラインで GAE にデプロイした後、問題が発生します (つまり、インクルードを使用すると、アクションがトリガーされません。

それはjsfのバグですか?またはリッチフェイスの実装またはGAE?何か助けはありますか?

4

2 に答える 2

1

問題の特定

使用によるものではありません<ui:include>

インクルード ファイルがバック Bean から動的に生成される場合に問題が発生しました。たとえば、次のようになります。

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

URL を明示的に言及すると、次のように機能します。

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

まあ、私のローカル GAE から実行している場合、どちらの方法でも機能しますが、オンラインで展開する場合は、Bean から生成する代わりに明示的な場所を使用する必要があります。これは、状態がクライアント側 (javax.faces.STATE_SAVING_METHOD) で保存される GAE の問題が原因である可能性があります。

于 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 に答える