我有一个视图范围的 bean,我在其中创建了一个人。一个人可以有一张照片。这张照片是在创建此人的同一页面上上传的。图片未存储在数据库或磁盘中(因为尚未创建此人)。bean 必须是视图范围的,因为可以在其他地方创建一个人,并且这使用相同的 bean。如果 bean 是 session 范围的,并且用户上传了图片但没有保存人员,则该图片将在用户下次尝试创建人员时显示。
我用两个豆子解决了这个问题;一个视图范围 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>