3

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

<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没有隐藏。

4

1 回答 1

10

您不能对本身有条件渲染的组件进行 ajax 更新。JSF ajax 引擎 JavaScript 不会在 HTML DOM 树中添加/删除更新目标,而是替换 HTML DOM 树中的更新目标。如果 JSF 组件没有被渲染,那么 JSF ajax 引擎将没有任何东西可以替换。相反,您必须对始终呈现的父级进行 ajax 更新。您可以在其中使用 a <h:panelGroup>

<h:panelGroup id="fileUploadGroup">
    <p:fileUpload id="fileUpload"
        rendered="#{!fileUploadController.hidden}"
        ...
        update="fileUploadGroup" />
</h:panelGroup>
于 2013-04-04T12:29:10.777 回答