在JSF中的View Scoped bean中注入SessionScoped Bean

时间:2014-04-16 13:00:04

标签: java primefaces

我正在使用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)$/"/>

现在,我遇到的问题是点击保存按钮后图片会保存在数据库中。但是一旦我更改了标签,例如:保存图像后,此功能现在位于“我的个人资料”标签中在数据库中如果我将点击更改为用户(假设),再次从我转到我的个人资料选项卡图片未显示

再次如果我退出然后登录并再次转到“我的个人资料标签”,图片显示。所以,总之,我想说的是图片不会在标签更改时持续存在。

任何人都可以给出任何合适的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我假设您在xhtml中使用StreamedContent。如果是这样,问题是您在imageController.image中设置uploadedImage时不会更新userDetailsController属性。您只能在@PostConstruct上初始化此属性。