【问题标题】:How to set a bean property before uploading a file using rich:fileUpload?如何在使用 rich:fileUpload 上传文件之前设置 bean 属性?
【发布时间】:2010-11-11 19:35:36
【问题描述】:

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

我在上传事件期间使用<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 的属性设置后才执行?

【问题讨论】:

    标签: java jsf file-upload richfaces


    【解决方案1】:

    我也有类似的问题。

    改变

    <a4j:support event="onupload">
    

    <a4j:support event="onclick">
    

    设置文件类型动作将在上传文件之前执行。正是在资源管理器文件系统打开时

    【讨论】:

      【解决方案2】:
      <f:setPropertyActionListener value="#{myMB.docType}" target="#{myMB.docType}" />
      

      我不明白你。目标与值相同。你基本上是用 self 设置目标的值。值本身不是已经null了吗?

      无论如何,我不做 RichFaces,所以我不能详细介绍,但我知道它在上传组件的封面下使用 Flash,并且这样的构造通常会触发一个单独的(和独立的)请求,该请求不考虑所有其他 HTML 表单参数。 “正常的”JSF 输入随后出现在一个单独的 HTTP 请求中。因此,如果没有引入一些讨厌的 JS/ajax hack,您就会迷失在这里。至少在理论上是这样。

      最好的办法是在侦听器方法中将上传的文件作为 bean 属性保存,然后在普通 bean 的操作方法中进一步处理(以相同形式附加到某些 UICommand 组件的方法)。

      【讨论】:

      • BalusC,我将目标设置为与值相同,因为我没有看到在#{myMB.docType} 中设置&lt;h:selectOneMenu 的选定值的其他方法。有什么建议吗?
      • 问题是 docType 链接到正在上传的文件。如果仅在 OK 按钮中处理,则 docType 的值将是最后一个,而不是上传文件之前选择的值。例如:用户可以选择 docType1,上传文件,然后将组合值更改为 docType2。他期望(从用户的角度)哪个 docType 将被保存?我正在考虑仅在用户在 docType &lt;h:selectOneMenu&gt; 中选择一个值后启用 rich:fileUpload 组件。
      • 另一件事,它应该代表上传文件的 content 类型吗?如果是这样,为什么不直接从标题中获取它和/或通过文件扩展名确定?
      • 不,它是最终用户使用的内部分类器。类似:“报告”、“销售分析”、“内部电子邮件”。
      • 好的,有道理。至于选择问题,你有没有去掉不必要的f:setPropertyActionListener
      【解决方案3】:

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

      您只需要处理这种情况,即用户无需触摸选择即可开始文件上传。要么您需要有一个合理的默认值,要么您必须处理非选择并在上传文件之前以某种方式要求选择字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 2011-10-12
        • 2012-12-20
        • 2017-08-12
        相关资源
        最近更新 更多