Я все еще учусь использовать некоторые возможности Composite Components в JSF 2. У меня есть опыт разработки JSF 1.2, и я недавно прочитал книгу "Core Java Server Faces 3rd Edition", написанную Гири и Хорстманном.
То, что я пытаюсь сделать, - это создать составной компонент, который оборачивает компонент загрузки файла (в настоящее время используется PrimeFaces <p:fileUpload>
). Мне нужно связать загруженный файл со строковым ключом в управляемом бине сессионной области (будет использоваться позже). Я пытаюсь предоставить ключ с помощью атрибута в моем интерфейсе Composite Component с именем 'uploadedFileKey'. Вот интерфейс:
<html xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
<composite:attribute name="uploadedFileKey"
type="java.lang.String"
required="true" />
</composite:interface>
...
</html>
Реализация проста и использует тег fileUpload PrimeFaces, как я упоминал ранее. Для этого требуется управляемый компонент с обработчиком событий, который я также создал на основе примера кода из демонстрационного веб-приложения PrimeFaces. Вот моя реализация:
<composite:implementation>
<p:fileUpload
fileUploadListener="#{primeFacesFileUploadController.handler}"
label="Browse"
mode="advanced"
allowTypes="png,gif,jpg" />
</composite:implementation>
Я не собираюсь включать здесь весь компонент контроллера, но вот объявление класса:
@ManagedBean(name="primeFacesFileUploadController")
@RequestScoped
public class PrimeFacesFileUploadController {
// ...
}
Загрузка файла PrimeFaces не отличается от других, которые я видел. Он использует пользовательский Filter
в сервлете Faces, чтобы получить доступ к загружаемым данным. Фактическая часть загрузки файла работает нормально, и когда загрузка прошла успешно, загруженный файл сохраняется во временном файле на моем сервере Tomcat.
Моя проблема не в том, как заставить мой Composite Component выполнить действие после успешной загрузки. Я хочу, чтобы мой составной компонент сохранял uploadedFileKey
в Map
на конкретном управляемом компоненте в области сеанса с загруженным File
в качестве значения карты. Как я могу это сделать?