4

我已将一个<p:fileUpload />组件插入到我的JSF 2.1.5应用程序中。我正在使用PrimeFaces 3.4.1。该组件由@ViewScopedbean 支持。我的表格是这样的:

<?xml version='1.0' encoding='UTF-8' ?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
template="/templates/general_template.xhtml">

<ui:define name="metadata">
    <f:metadata>

        <f:viewParam id="NavIndex" name="NavIndex"
            value="#{navegableMassiveUserAdd._QueueIndex}" />
        <f:event type="preRenderView"
            listener="#{navegableMassiveUserAdd.initialize}" />
    </f:metadata>
</ui:define>

<ui:define name="general_content">
    <h:form>

        <p:fileUpload
            fileUploadListener="#{navegableMassiveUserAdd.listener}"
            mode="advanced" allowTypes="/(\.|\/)(xls|csv)$/"
            label="#{msg.SELECT}" multiple="false" />

        <p:commandButton id="cancelButton"
            action="#{navegableMassiveUserAdd.actionCancelAdd}"
            value="#{msg.CANCELAR}" ajax="false" style="margin: 9px 0px 5px;" />
    </h:form>
</ui:define>

这是我的主要模板:

<?xml version='1.0' encoding='UTF-8' ?>
<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui" xmlns:o="http://omnifaces.org/ui">


<h:head>
    <meta http-equiv="Pragma" CONTENT="no-cache"></meta>
    <meta http-equiv="cache-control" content="no-cache"></meta>
    <meta http-equiv="Expires" CONTENT="-1"></meta>
    <meta http-equiv="Content-Type"
        content="text/html; charset=ISO-8859-15" />
    <h:outputStylesheet library="css" name="prime_styles.css" />
    <h:outputScript library="js" name="prime_translations.js" />
</h:head>

<h:body>
    <ui:insert name="metadata" />
    <ui:insert name="general_logged_user">
        <div align="right">
            <span style="color: #B22222; padding: 3px;"> <h:outputText
                    value="#{loggedBean._Login}" />
            </span> <span style="color: #FFA54F; padding: 3px;"> <h:outputText
                    value="Auth Method: #{loggedBean._Usuario._CUser._AuthenticationMethod}" />
            </span>
        </div>
    </ui:insert>
    <f:view locale="#{localeBean.locale}">
        <ui:insert name="general_settings">
            <f:loadBundle basename="resources.system.bundles.Messages" var="msg" />
            <p:ajaxStatus style="width:0px;height:0px;" id="ajaxStatusPanel"
                styleClass="spinner_ajax_loading">

                <f:facet name="start">
                    <h:graphicImage value="/resources/images/loading.gif" />
                </f:facet>

                <f:facet name="complete">
                    <h:outputText value="" />
                </f:facet>
            </p:ajaxStatus>
            <p:growl id="messages" autoUpdate="true" />
        </ui:insert>

        <f:event type="preRenderView"
            listener="#{navigationManagerSystem.initialize}" />


        <h:panelGroup>
            <ui:insert name="general_header">
                <ui:include src="/components/header.xhtml" />
            </ui:insert>
            <h:panelGroup id="menuNavegacionPanel">

                <h:form>
                    <h:panelGroup id="navigationPanel"
                        rendered="#{navigationManagerSystem._ShowNavegacion}">
                        <h:panelGroup
                            rendered="#{!navigationManager._DisableNavigationButtons}">
                            <p:toolbar>
                                <p:toolbarGroup>
                                    <ui:repeat value="#{navigationManagerSystem._Navegables}"
                                        var="item">
                                        <p:button value="#{item._Title}"
                                            outcome="#{item._NavigationResult}">
                                            <f:param name="NavIndex" value="#{item._QueueIndex}" />
                                        </p:button>
                                    </ui:repeat>
                                    <p:button disabled="true"
                                        value="#{navigationManagerSystem._Navegable._Title}" />
                                </p:toolbarGroup>
                            </p:toolbar>
                        </h:panelGroup>

                    </h:panelGroup>
                </h:form>
            </h:panelGroup>
            <ui:insert name="general_content">
                <ui:include src="/system/content.xhtml" />
            </ui:insert>

        </h:panelGroup>
        <ui:insert name="general_footer">

            <ui:include src="/components/general_footer.xhtml" />

        </ui:insert>
    </f:view>

</h:body>

有了这个,当我上传我的文件时,bean 正在重建并且listener方法没有被调用。我的过滤器放在了我的web.xml中。此外,如果我更改表单并将其设置为enctype="multipart/form-data",正如我在文档中阅读的那样,我无法避免问题并且再次重建 bean,在这种情况下,即使我单击取消按钮也是如此。那是我的 bean 代码,SystemNavegable抽象类在哪里:

@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class NavegableMassiveUserAdd extends SystemNavegable {

/**
 * Field logger.
 */
protected final Log logger = LogFactory.getLog(this.getClass());

/**
 * Constructor for NavegableMassiveUserAdd.
 */
public NavegableMassiveUserAdd() {
    super();
    this.set_Title(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU,
            BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS, "Añadir usuarios"));
    this.set_TitleDescription(FacesUtils.getBundle(BundleNames.BUNDLE_SYSTEM_MENU,
            BundleKeys.SYSTEM_NAVEGABLE_ADD_USERS_DESCRIPTION, "Añadir usuarios"));
    this.set_NavigationResult(NavigationResults.MASSIVE_USER_ADD);
    this._Behaviour = NavegableBehaviour.ADD;
}
/**
 * Method actionCancelAdd.
 * 
 * @return
 */
public String actionCancelAdd() {
    return this._NavigationManagerSystem.cancelNavegable();
}

/**
 * Escuchador del evento Upload.
 * 
 * 
 * 
 * @param event
 *            FileUploadEvent
 * @throws IOException
 * @throws java.io.IOException
 */
public void listener(FileUploadEvent event) throws IOException {
    UploadedFile uploadItem = event.getFile();
    //More code
    }

有什么建议吗?提前致谢。

已编辑

完成了更多测试,我发现文件上传侦听器方法永远不会到达,我给支持 bean 的 Scope 无关紧要。我有以下依赖项:

<dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
    </dependency>

而且我怀疑问题可能是另一个过滤器与我为上传组件使用的过滤器冲突,如此处所述。FacesContext.getCurrentInstance().isPostback()不管问题是什么,当文件上传并带有 false时,我的 bean 的初始化方法会再次被调用。

4

2 回答 2

3

经过几次头脑风暴,我发现这是一个过滤器问题。由于上传过滤器与PrettyFaces过滤器冲突,我不得不将其添加到我的web.xml中:

<filter-mapping>
   <filter-name>PrimeFaces FileUpload Filter</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>FORWARD</dispatcher>
</filter-mapping>

非常感谢@Reinaldo de Carvalho 的回复

https://stackoverflow.com/a/9086137/1199132

于 2013-01-10T16:44:40.500 回答
0

就我而言,问题在于 Tomcat 服务器 POST 大小限制。因此,在 server.xml 中的 Connector 部分的参数 maxPostSize 被设置后,文件上传开始与 @ViewScoped bean 一起工作。

另请注意,tomcat 官方文档是不正确的,对于无限大小的 POST,maxPostSize 值必须设置为小于 0,因为当它等于 0 时表示大小为零。

http://tomcat.apache.org/tomcat-7.0-doc/config/ajp.html HttpRequest在tomcat中的最大允许大小?

于 2014-06-22T18:54:31.603 回答