2

我正在使用 JSF 2.0 和 Primefaces 3.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 中的所有内容都配置正确。

  • 第二次尝试 - 包含页面中的菜单操作侦听器

    <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 回答