2

JSF2.0とPrimefaces3.2を使用してアプリケーションを開発していますが、次の問題が発生しています。コンテンツがajaxリクエストで動的に読み込まれる場合、ActionListenersが呼び出されません。

メインレイアウト:

<div id="content">
    <h:form name="content_form" id="content_form">
        <ui:insert name="content" />
    </h:form>
</div>

インデックスページ(コンテンツはメニューアクションに基づいて動的にロードされます):

<ui:composition template="layout.xhtml">
    <ui:define name="content">
        <ui:include src="#{ajaxViewBean.viewName}" /> 
    </ui:define>
</ui:composition>

メニューアクションは次のように生成されます。

        FacesContext context = FacesContext.getCurrentInstance();
        MethodExpression methodExpression = context
                .getApplication()
                .getExpressionFactory()
                .createMethodExpression(
                        context.getELContext(),
                        "#{ajaxViewBean.setViewName('" + navItem.getUrl()
                                + "')}", null,
                        new Class[] { ActionEvent.class });
        displayMenuItem.setUpdate(":content_form");
        displayMenuItem
                .addActionListener(new MethodExpressionActionListener(
                        methodExpression));

メニュー項目をクリックすると、AjaxViewBeanの「リクエストスコープ」を呼び出して現在のビューページを設定し、メインレイアウトの「content_form」を更新します

含まれるページ(アクションリスナーが機能しない)

  • 最初の試行-ファイルのアップロード(uploadFile.xhtml)

    <h:body>
    <h:form enctype="multipart/form-data">
    
        <p:fileUpload fileUploadListener="#{fileUploadController.handleFileUpload}"  
                      mode="advanced"  
                      update="messages"   
                      multiple="true"  
                      sizeLimit="100000"   
                      allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>  
    
        <p:growl id="messages" showDetail="true"/>  
    </h:form>
    

    fileUploadControllerが呼び出されることはありません。uploadfile.xhtmlを直接リクエストした場合、または最初の読み込み時に含めた場合は、ファイルをアップロードできるので、アップロードが機能し、すべてがweb.xmlで正しく構成されていることを確認できます。

  • 2回目の試行-インクルードページのメニューアクションリスナー

    <h:body>
    <h:form>
        <p:menu type="tiered" style="width:180px">
            <p:submenu label="Ajax Menuitems" icon="ui-icon-refresh">
                <p:menuitem value="Save"
                    actionListener="#{ajaxViewBean.setViewName()}" update="messages"
                    icon="ui-icon-disk" />
                <p:menuitem value="Update" actionListener="#{buttonBean.update}"
                    update="messages" icon="ui-icon-arrowrefresh-1-w" />
            </p:submenu>
        </p:menu>
    </h:form>
    

    また、メインページで発生しているイベントリスナーは、上記のコードから動的に生成されますが、発生することはありません。

Mavenの依存関係:

<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-api</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>com.sun.faces</groupId>
    <artifactId>jsf-impl</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>com.sun.facelets</groupId>
    <artifactId>jsf-facelets</artifactId>
    <version>1.1.14</version>
</dependency>
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>el-impl</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>3.2</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.2.2</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.3</version>
</dependency>  

私が何かを逃している場合、誰かがアドバイスをお願いできますか、またはこれをどのように解決できますか?

実際、これはStackoverflowでの私の最初の投稿なので、自分自身を明確にし、形式が台無しにならないことを願っています

4

2 に答える 2

2

修正済み!、私は答えを投稿しています (おそらく誰かに役立つかもしれません) 次の手順:

強調すべきこと:

  • ただし、部分的な状態の保存をグローバルに無効にすると、ビュー ステートのサイズが大きくなるという欠点があります。したがって、サーバー側の状態保存方法を使用している場合はサーバーのメモリ使用量が増加し、クライアント側の状態保存方法を使用している場合はネットワーク帯域幅の使用量が増加します。基本的に、JSF 1.x の場合と同じビュー ステート情報を取得します。可能であれば、web.xml で次のコンテキスト パラメータを使用して、ビューごとに部分的な状態の保存を無効にすることもできます。
于 2012-05-16T12:37:29.397 に答える
1

ご覧のとおり、フォームをネストしています。これは HTML/XHTML では許可されていません。

囲みcontent_formページとインクルードページにもそれぞれフォームがあります。

を削除してみてくださいcontent_form:

<div id="content">
    <ui:insert name="content" />
</div>

を変更しdisplayMenuItemて、更新をcontentdiv に設定します。

displayMenuItem.setUpdate(":content");

お役に立てば幸いです。

于 2012-05-15T20:18:28.483 に答える