Отображение загруженного изображения в JSF

У меня есть компонент с областью видимости, где я создаю человека. У человека может быть изображение. Это изображение загружается на той же странице, на которой создан человек. Картинка не сохраняется ни в базе данных, ни на диске (, так как человек еще не создан ). Компонент должен иметь область просмотра, поскольку человек может быть создан в другом месте, и для этого используется тот же компонент. Если bean-компонент находится в области действия сеанса и пользователь загружает изображение, но не сохраняет человека, изображение будет отображаться в следующий раз, когда пользователь попытается создать человека.

Я решил это, используя два компонента; один bean-компонент с областью видимости для создания человека и bean-компонент с областью действия сеанса для загрузки изображения и получения изображения в виде потока. Однако это вызывает проблему, отмеченную выше.

Как я могу решить это лучше?

Компонент загрузки:

@ManagedBean(name = "uploadBean")
@SessionScoped
public class UploadBean
{
    private UploadedFile    uploadedFile;

    public UploadedFile getUploadedFile()
    {
        return uploadedFile;
    }

    public StreamedContent getUploadedFileAsStream()
    {
        if (uploadedFile != null)
        {
            return new DefaultStreamedContent(new ByteArrayInputStream(uploadedFile.getContents()));
        }
        return null;
    }

    public void uploadFile(FileUploadEvent event)
    {
        uploadedFile = event.getFile();
    }
}

Компонент create -a -person:

@ManagedBean(name = "personBean")
@ViewScoped
public class PersonBean
{
    private Person newPerson = new Person();

    public Person getNewPerson()
    {
        return newPerson;
    }

    private UploadedFile getUploadedPicture()
    {
        FacesContext context = FacesContext.getCurrentInstance();
        ELContext elContext = context.getELContext();
        UploadBean uploadBean = (UploadBean) elContext.getELResolver().getValue(elContext, null, "uploadBean");
        return uploadBean.getUploadedFile();
    }

    public void createPerson()
    {
        UploadedFile uploadedPicture = getUploadedPicture();
        // Create person with picture;
    }
}

Соответствующая часть страницы JSF:

<h:form enctype="multipart/form-data">
    <p:outputPanel layout="block" id="personPicture">
        <p:graphicImage height="150"
            value="#{uploadBean.uploadedFileAsStream}"
            rendered="#{uploadBean.uploadedFileAsStream != null}" />
    </p:outputPanel>
        <p:fileUpload auto="true" allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
            fileUploadListener="#{uploadBean.uploadedFile}"
            update="personPicture" />
    <p:commandButton value="Save" actionListener="#{personBean.createPerson()}"/>
</h:form>
9
задан siebz0r 16 July 2012 в 14:46
поделиться