私は人を作成するビュースコープのBeanを持っています。人は写真を持つことができます。この写真は、人物が作成されたのと同じページにアップロードされています。写真はデータベースにもディスクにも保存されません (人物がまだ作成されていないため)。人は他の場所で作成することができ、これは同じ Bean を使用するため、Bean はビュー スコープである必要があります。Bean がセッション スコープであり、ユーザーが画像をアップロードしても人物を保存しない場合、ユーザーが次に人物を作成しようとしたときに画像が表示されます。
2 つの Bean を使用してこれを解決しました。1 つのビュー スコープ 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 Bean:
@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>