簡體   English   中英

在JSF中將SessionScoped Bean注入View Scoped Bean中

[英]Injecting a SessionScoped Bean inside a View Scoped bean in JSF

我正在使用Prime Faces 4.0在JSF 2.0中構建Web應用程序。在我的項目中,我具有使用Prime Faces的圖像上傳功能。 我的要求是:有一個“選擇”按鈕,用戶可以通過該按鈕進行瀏覽,然后通過“上傳”按鈕圖像進行上傳,但不會保存在數據庫中。單擊“保存”按鈕圖像時頁面上會有一個單獨的保存按鈕,保存在數據庫中。

但是我的問題是:::對於上傳圖像,我在SessionScoped中有一個ManagedBean調用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);
 }
}

保存按鈕的動作監聽器綁定到的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)”; 將其編碼為將dto保存到數據庫的普通saveOrUpdate()方法。

以下是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)$/"/>

現在,我面臨的問題是,單擊“保存”按鈕后,圖片將保存在數據庫中。但是,例如,一旦更改了選項卡: 如果將圖像保存到數據庫中,則此功能在“我的資料”選項卡中點按“用戶”(假設),然后再次轉到“我的個人資料”標簽,圖片未顯示

再次,如果我注銷然后再登錄並再次進入“我的個人資料標簽”,則該圖片顯示出來。所以,我想說一句,該圖像在標簽更改后不會持續存在。

誰能為此提供任何合適的解決方案?

我假設您在xhtml中使用StreamedContent。 如果是這樣,問題是你不更新imageController.image當您設置屬性uploadedImageuserDetailsController 您只能在@PostConstruct上初始化此屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM