使用Primefaces 3.5 fileupload,呈现的属性无法正常工作

时间:2013-04-04 07:48:42

标签: jsf primefaces

我的目标是在PrimeFaces v3.5中fileUpload成功后隐藏上传组件。以下是视图片段 -

<h:form>
<!-- Here are some more components of PrimeFaces, So i am not updating the entire form-->
    <p:fileUpload id="fileUpload"
        rendered="#{!fileUploadController.hidden}"
        label="Choose Script to upload here"
        style="font-size: 100% !important;" showButtons="false"
        fileUploadListener="#{fileUploadController.upload}"
        mode="advanced" auto="true" sizeLimit="100000"
        allowTypes="/(\.|\/)(py|txt)$/" update="fileUpload" />
<!-- Here are some more components of PrimeFaces, So i am not updating the entire     
</h:form>

我的Managed Bean位于 -

之下
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.apache.commons.io.FilenameUtils;
import org.primefaces.event.FileUploadEvent;
@ManagedBean
@ViewScoped
public class FileUploadController implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    // private String destination = null;
    private String destination = "D:/temp";
    private boolean hidden = false;
    public FileUploadController() {
//      System.out.println("destination=" + destination);
    }
    // private String destination = "D:/download";
    public void upload(FileUploadEvent event) {
        String fileName = FilenameUtils.getName(event.getFile().getFileName());
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Success! ", fileName + " is uploaded.");
        FacesContext.getCurrentInstance().addMessage(null, msg);
        try {
            System.out.println("I am trying to copy it...");
            copyFile(fileName, event.getFile().getInputstream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void copyFile(String fileName, InputStream in) {
        try {
            System.out.println("filename= " + fileName + ", dest="
                    + destination);
            // write the inputStream to a FileOutputStream
            OutputStream out = new FileOutputStream(new File(destination
                    + File.separator + fileName));
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            System.out.println("New file created!");
            setHidden(true);
        } catch (IOException e) {
            System.out.println("ERROR " + e.getMessage());
        }
    }
    /**
     * @return the hidden
     */
    public boolean isHidden() {
        return hidden;
    }
    /**
     * @param hidden
     *            the hidden to set
     */
    public void setHidden(boolean hidden) {
        this.hidden = hidden;
    }
}

文件上传已成功完成,但fileUpload未隐藏。

1 个答案:

答案 0 :(得分:8)

您无法ajax更新自身有条件渲染的组件。 JSF ajax引擎JavaScript不会在HTML DOM树中添加/删除更新目标,而是替换HTML DOM树中的更新目标。如果没有呈现JSF组件,那么JSF ajax引擎将无法替换任何内容。相反,您需要ajax更新始终呈现的父级。你可以使用<h:panelGroup>来获取它。

<h:panelGroup id="fileUploadGroup">
    <p:fileUpload id="fileUpload"
        rendered="#{!fileUploadController.hidden}"
        ...
        update="fileUploadGroup" />
</h:panelGroup>