1

まず、構造を説明します。テンプレートを使用して動的に生成されたメニューで共通のヘッダーを提供するJSFFaceletsページがいくつかあります。そのテンプレート内で、メニューは次のコードで生成されます。

<ui:repeat var="item" value="#{mainMenuBackingBean.subMenuItemsList}">
                        <td class="#{item.cssClass}">
                            <h:outputLink id="submenu_#{item.nameText}" value="#{item.linkPath}" disabled="#{item.disabled}">
                                #{item.nameText}
                            </h:outputLink>
                        </td>
                    </ui:repeat>

個々のページには、メニューの設定方法を知っているページバッキングBeanがあります。したがって、ページがレンダリングされる前に、メニューは次のコードで設定されます。

<f:event listener="#{specificPageBackingBeanHere.setup}" type="preRenderView"></f:event>

これは、すべての特定のページバッキングBeanが拡張する抽象クラスのsetupメソッドを呼び出します。次に、いくつかの呼び出しを行って、mainMenueBackingBeanのメニューリストに適切な要素を追加します。これまでのところ、これは私たちにとって完全にうまくいき、今まで問題はありませんでした。

新しいページに、次のコードで実装された動的レイアウトのテーブルがあります。

<table class="gridall">
        <tr>
            <td colspan="4" style="text-align: center;"><b>Table Title</td>
        </tr>
        <tr>
            ...
            column headings here
            ...
        </tr>
        <ui:repeat var="item" value="#{outgoingFaxBacking.outgoingList}">
            <tr bgcolor="#{item.status.color}">
                <td style="text-align: center;" class="itemsTopCell">
                    <h:commandLink value="#{item.itemNo}" action="#{outgoingFaxBacking.testMe}" > 
                        <f:ajax render=":rightColumn"/>
                    </h:commandLink>
                    <br/>
                    <b>Last: #{item.lastString}</b>
                </td>
                <td class="itemsTopCell">
                    #{item.description}
                </td>
                <td style="text-align: center" class="itemsTopCell">
                    <h:outputText value="#{item.quantity}">
                        <f:convertNumber maxFractionDigits="2"/>
                    </h:outputText>
                </td>
                <td style="text-align: center;" class="itemsTopCell">
                    <h:inputHidden id="notFilledNote" value="#{outgoingFaxBacking.notFilledNote}"/>
                    <h:commandButton  action="#{outgoingFaxBacking.markNotFilled(item.id)}" onclick="return(notFilled());" value="Not Filled">
                        <f:ajax execute="notFilledNote" render="@form"/>
                    </h:commandButton>
                </td>
            </tr>
            <tr bgcolor="#{item.status.color}">
                <h:panelGroup rendered="#{empty item.note}">
                    <td style="border-top: 1px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>
                <h:panelGroup rendered="#{not empty item.note}">
                    <td style="border-top: 1px; border-bottom:0px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>     
            </tr>
            <h:panelGroup rendered="#{not empty item.note}">
                <tr bgcolor="#{item.status.color}">
                    <td colspan="4" style="border-top: 1px;">
                        #{item.note}
                    </td>
                </tr>
            </h:panelGroup>
            <tr>
                <td style="border: 0px;font-size:2%" colspan="3">
                 &nbsp;
                </td>
            </tr>
        </ui:repeat>
    </table>

ページは最初から完全にレンダリングされます。問題は、テーブル内のcommandLinkまたはcommandButtonのいずれかをクリックすると(このテーブルのみで、ページ上の他のコマンド要素がこれを引き起こさない)、次のように読み取るエラーが生成されることです。

serverError:クラスjavax.faces.view.facelets.TagAttributeException /WEB-INF/templates/secure.xhtml @ 130,106 id = "submenu _#{item.nameText}":プロパティ'nameText'がタイプorg.ppa.dbに見つかりません。 serializabledb.FaxItemsContainer

エラーの場所(@ 130,106)は、上記で引用したメニューコードですが、表示されているオブジェクトのタイプ(FaxItemsContainer)は、メニューではなく、上記の動的テーブルで使用されます。これを少しいじって、ajaxの問題やui:includeの問題などではないことを確認した後、最終的にテーブルの変数名を「item」から「faxItem」に変更すると表示されます。働くために。

したがって、最終的に、私の質問は、ui:repeat(および他のJSFコンポーネント)の変数名はスコープ内でローカルであると考えたため、同じページの2つのui:repeatsが同じ変数名を使用することは問題ではありません。そうではありませんか?同じページのui:repeatタグには、本当に一意の変数名が必要ですか?

Tomcat7でMojarra2.1.3を実行しています。

4

0 に答える 0