【发布时间】:2014-09-13 21:31:09
【问题描述】:
我正在使用 Prime Faces 4.0 在 JSF 2.0 中构建一个 Web 应用程序。在我的项目中,我有使用 Prime Faces 的图像上传功能。我的要求是:有一个选择按钮,用户将通过该按钮浏览,然后通过上传按钮 图片将被上传,但不会保存在数据库中。点击保存按钮后,页面中有一个单独的保存按钮,图片将保存在数据库中。
但我的问题是::为了上传图像,我有一个在 SessionScoped 中的 managedBean calle ImageController.java,保存按钮由一个 actionlistener 方法组成,该方法在 ViewScoped 中的 managedBean 类中定义。
我提供 ImageController.java 类的代码
package com.edfx.tum.web.controller;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;
import com.edfx.tum.dto.UserDTO;
@SessionScoped
@ManagedBean(name = "imageController")
public class ImageController extends BaseWebController implements Serializable {
private static final long serialVersionUID = -3975946403680318499L;
private StreamedContent image;
private byte[] uploadedImage;
public void initImage() {
UserDTO user = getCurrentUser();
byte[] img = user.getUserPhoto();
setUploadedImage(img);
if (img != null) {
image = new DefaultStreamedContent(new ByteArrayInputStream(img));
} else {
image = null;
}
}
public StreamedContent getImage() {
return this.image;
}
public byte[] getUploadedImage() {
return uploadedImage;
}
public void setUploadedImage(byte[] uploadedImage) {
this.uploadedImage = uploadedImage;
}
public void setImage(StreamedContent image) {
this.image = image;
}
@PostConstruct
public void init() throws FileNotFoundException, IOException {
initImage();
}
public void handleFileUpload(FileUploadEvent event) {
UploadedFile uploadedFile = event.getFile();
byte[] img = uploadedFile.getContents();
image = new DefaultStreamedContent(new ByteArrayInputStream(img));
setUploadedImage(img);
}
}
保存按钮的 actionlistener 绑定到的 managedBean 的名称是 UserDetailsController 并且通过以下方式我将依赖项注入到 UserDetailscontroller.java 类中
@ViewScoped
@ManagedBean(name = "userDetailsController")
public class UserDetailsController extends BaseWebController implements Serializable {
@ManagedProperty(value = "#{imageController}")
private ImageController imageController;
public ImageController getImageController() {
return imageController;
}
public void setImageController(ImageController imageController) {
this.imageController = imageController;
}
//other codes here
public void submit(ActionEvent actionEvent) {
try {
UserDTO userDTO = (UserDTO) actionEvent.getComponent().getAttributes().get("user");
if (userDTO != null) {
userDTO.setUserPhoto(imageController.getUploadedImage());
processDBPeopleUpdate(userDTO);
}
} catch (Exception e) {
LoggingUtils.printStackTrace(e, log);
}
}
}
不要担心“processDBPeopleUpdate(userDTO);”将其编码为普通的 saveOrUpdate() 方法,用于将 dto 保存到数据库。
下面是一段xhtml代码::
<p:fileUpload id="fileUpload" styleClass="imageStyle" mode="advanced" dragDropSupport="false" update="myProfileForm:growl myProfileForm:profileImage" sizeLimit="1000000" fileUploadListener="#{imageController.handleFileUpload}" allowTypes="/(\.|\/)(gif|jpeg|png|tiff|exif)$/"/>
现在,我面临的问题是,单击保存按钮后,图片会保存在数据库中。但是一旦我更改了标签,例如:保存图片后,此功能现在位于“我的个人资料”标签中如果我将点击更改为用户(假设),则在数据库中,我再次转到“我的个人资料”选项卡,图片未显示
再次,如果我注销然后登录并再次转到“我的个人资料选项卡”,图片正在显示。所以,总之,我想说的是,在选项卡更改时图像不会持续存在。
任何人都可以为此提供任何合适的解决方案吗?
【问题讨论】:
-
那么,CDI Bean 注入真的与渲染/保存数据有关吗? - xhtml 会很高兴看到您的更新/渲染部分是什么样的,而且您的数据库也很重要,如果它没有正确保存,那么它当然不会显示它!
标签: java primefaces