JSF 2 - Как я могу выполнить действие после того, как дочерний компонент Composite Component завершил операцию? - PullRequest
2 голосов
/ 06 июня 2011

Я все еще учусь использовать некоторые возможности 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 в качестве значения карты. Как я могу это сделать?

1 Ответ

1 голос
/ 06 июня 2011

Я бы просто передал ключ как атрибут пользовательского компонента на <f:attribute> и позволил обработчику обработать его.Вы можете получить его в методе обработчика по event.getComponent().getAttributes().

Например,

<composite:implementation>
    <p:fileUpload
        fileUploadListener="#{primeFacesFileUploadController.handler}"
        label="Browse"
        mode="advanced"
        allowTypes="png,gif,jpg">
        <f:attribute name="key" value="#{cc.attrs.uploadedFileKey}" />
    </p:fileUpload>
</composite:implementation>

с

public void handler(FileUploadEvent event) {
    String key = (String) event.getComponent().getAttributes().get("key");
    yourSessionBean.getMap().put(key, event.getFile());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...