如何在使用rich:fileUpload上传文件之前设置bean属性?

时间:2010-11-11 19:35:37

标签: java jsf file-upload richfaces

我的应用程序有一个模态面板,用户可以在其中上传文件并在下拉选择中选择“文档类型”。

我在上传活动期间使用<f:setPropertyActionListener>设置了文档类型值,但有时在处理完上传后设置属性。可能它正在发生,因为正在生成另一个请求,并且此请求由另一个Web容器线程处理。

<rich:modalPanel id="attachFiles" autosized="true">
    <h:form id="formUpload" enctype="multipart/form-data">
        <h:selectOneMenu id="docType"  value="#{myMB.docType}" required="true" >
            <f:selectItems value="#{myMB.docTypesSelectItems}"  />
    </h:selectOneMenu>`
        <rich:fileUpload id="upload" fileUploadListener="#{myMB.handleUpload}">
            <a4j:support event="onupload">
                <f:setPropertyActionListener value="#{myMB.docType}" 
                    target="#{myMB.docType}" />
            </a4j:support>
        </rich:fileUpload>
</rich:modalPanel>

当它发生时,myMB.docType的值在执行myMB.handleUpload期间为空,这是预期的,因为该字段应该是必需的。

有没有办法确保方法myMB.handleUpload仅在 docType的属性设置后才执行?

3 个答案:

答案 0 :(得分:1)

我有类似的问题。

更改

<a4j:support event="onupload">

<a4j:support event="onclick">

设置文档类型操作将在上载文件之前执行。究竟何时打开资源管理器文件系统

答案 1 :(得分:0)

<f:setPropertyActionListener value="#{myMB.docType}" target="#{myMB.docType}" />

我不懂你的意思。目标与值相同。你基本上是用自己设定目标的价值。价值本身不仅仅是null吗?

无论如何,我不做RichFaces,所以我不能详细介绍,但是我知道它正在使用Flash上​​传组件,并且这样的构造通常会激发一个单独的(和独立的)请求不会考虑所有其他HTML表单参数。此后,“正常”JSF输入在单独的HTTP请求中。所以你有点迷失在这里而没有带来一些令人讨厌的JS / ajax黑客。至少在理论上。

你最好的办法是在监听器方法中将上传的文件作为bean属性保存,然后在普通bean的action方法中进一步处理(以同一形式连接到某个UICommand组件的方法)

答案 2 :(得分:0)

我会将Ajax功能添加到select组件中。这样,每次用户更改select的值时,都会立即更新bean值。在文件上传方法中,您可以依靠bean值来表示用户所做的最新选择。

您只需要处理用户启动文件上传而不触及选择的情况。您需要具有合理的默认值,否则您必须处理非选择并在上传文件之前以某种方式使选择字段。