Java jsf参数不';下载内容后无法清除

Java jsf参数不';下载内容后无法清除,java,jsf,parameters,primefaces,download,Java,Jsf,Parameters,Primefaces,Download,当我下载一个内容时,单击primefaces命令按钮,我设置了一个jsf参数,该参数对于必填字段验证非常有用。 下载完成后,如果我清除了一些必需的字段值,然后单击另一个没有传递jsf参数的commandButton来触发验证,则会触发验证,验证失败。 下面是示例jsf代码: <p:inputTextarea value="#{flowScope.inputText}" required="#{not empty param.includeInSave)}&qu

当我下载一个内容时,单击primefaces命令按钮,我设置了一个jsf参数,该参数对于必填字段验证非常有用。 下载完成后,如果我清除了一些必需的字段值,然后单击另一个没有传递jsf参数的commandButton来触发验证,则会触发验证,验证失败。 下面是示例jsf代码:

<p:inputTextarea value="#{flowScope.inputText}" required="#{not empty param.includeInSave)}" requiredMessage="Required Input Text" />
                                    
<p:commandButton id="add_table_row" value="Call action without validation" action="add_table_row" update=":table_pnl" />

<p:commandButton id="download_pdf" value="Download" action="download_pdf" ajax="false" onclick="if(!confirm('Start download?')) return false;">
     <f:param name="includeInSave" value="true" />

<p:commandButton id="save" value="Save" action="save" ajax="false" onclick="if(!confirm('Save?')) return false;">
     <f:param name="includeInSave" value="true" />
</p:commandButton>


                    

因此,当我点击“下载pdf”时,验证就会被触发,并且可以正常工作。 在清除InputExtArea值并单击“add_table_row”命令按钮后,该操作仍然在请求中包含IncludeInserve参数,因为验证再次触发。 如果我点击“save”commandButton,这种情况就不会发生,这在jsf代码中是相同的,但它不会在java代码中下载文件。 因此,我认为我必须在java中的HttpServletResponse中设置一些不同之处

在java代码中,我将以以下方式下载该文件:

public static Boolean downloadBytes(byte[] bytes, String name, String mimeType, RequestContext requestContext) {
     
    HttpServletResponse response = (HttpServletResponse) requestContext.getExternalContext().getNativeResponse();
    response.reset();
    response.setContentType(mimeType);
    response.setHeader("Content-disposition", "attachment; filename=" + name);
    response.setHeader("Content-Length", Integer.toString(bytes.length));
    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0);

    ServletOutputStream outputStream = null;
    try {
        outputStream = response.getOutputStream();
        int size = 4096;
        int i = 0;
        while(i  < bytes.length)
        {
            int max_range = Math.min(i + size, bytes.length);
            byte[] mini_buf = Arrays.copyOfRange(bytes, i, max_range);
            i+= size;       
            outputStream.write(mini_buf);
        }
        
        FacesContext.getCurrentInstance().responseComplete();
        return Boolean.TRUE;
    } catch (Exception e) {
        return Boolean.FALSE;
    } finally {  
        try {  
            if (outputStream != null) {  
                outputStream.close();  
            }  
        } catch (IOException err) {  
            err.printStackTrace();  
        }  
    }  
}
publicstaticbooleanloaddbytes(字节[]字节,字符串名称,字符串mimeType,RequestContext){
HttpServletResponse=(HttpServletResponse)requestContext.getExternalContext().getNativeResponse();
response.reset();
response.setContentType(mimeType);
response.setHeader(“内容处置”、“附件;文件名=“+name”);
setHeader(“Content-Length”,Integer.toString(bytes.Length));
setHeader(“缓存控制”,“无缓存,无存储,必须重新验证”);//HTTP 1.1。
response.setHeader(“Pragma”,“无缓存”);//HTTP 1.0。
response.setDateHeader(“Expires”,0);
ServletOutputStream outputStream=null;
试一试{
outputStream=response.getOutputStream();
int size=4096;
int i=0;
while(i

我希望有人能帮助我。谢谢

您能提供所使用的版本吗?我的jsf版本是2.1.7