【问题标题】:How to clear validation errors after providing a file download on form submit?在表单提交上提供文件下载后如何清除验证错误?
【发布时间】:2011-11-15 13:37:39
【问题描述】:

我有一个页面,其中有一个输入字段和一个按钮。单击该按钮会根据输入字段中输入的值生成 PDF 报告。我的问题在于输入字段需要一些特殊的格式,并且我有一个验证器,如果所需的格式不存在,它将触发。

假设我在字段中输入了无效值,然后单击按钮。由于验证,不会生成 PDF 报告,并且该字段按预期变为红色。但随后我输入了一个正确的值(该字段仍为红色)并按下按钮。报告已生成,但该字段仍为红色。那是因为我在 PDF 生成后使用了 FacesContext.getCurrentInstance().responseComplete(),因此绕过了正常的 Faces 生命周期,并且不再针对此请求触发验证错误的清除。

如何生成 PDF 报告但仍强制 Faces 确定应清除验证错误?谢谢!

【问题讨论】:

    标签: validation jsf download


    【解决方案1】:

    这不能在一个 HTTP 响应中完成。您需要让客户端发送两个请求,以便您可以返回两个响应;一个清除错误,另一个返回 PDF。您只需要在 bean 的 action 方法中进行一些修改,并且可能添加一个文件服务 servlet。

    基本上,您需要将 PDF 存储在本地(临时)磁盘位置或内存中,并让 JSF 有条件地渲染一些 JavaScript,然后再下载 PDF。 PDF 可以通过 servlet 或其他指向本地磁盘位置的 webapp 上下文下载。

    例如

    <h:form>
        ...
        <h:commandButton value="Download" action="#{bean.submit}" />
        <h:panelGroup rendered="#{not empty bean.pdfURL}">
            <script>window.location = '#{bean.pdfURL}';</script>
        </h:panelGroup>
    </h:form>
    

    public void submit() {
        // Create PDF and store as byte[] in memory, or as File on disk.
        // Then create an unique URL to the PDF.
        pdfURL = externalContext.getRequestContextPath() + "/pdf/" + pdfID;
    }
    

    它应该在成功的表单提交上生成以下内容(这也应该清除验证错误!)

    <script>window.location = '/contextname/pdf/uniquefilename.pdf';</script> 
    

    如果您在服务器配置中将/some/path/to/pdf 注册为另一个webapp 上下文,那么您只需将File 存储在其中即可下载。但如果你不能因为你无法控制服务器配置,那么你需要创建一个映射到/pdf/* 的 URL 模式的 servlet,并在 doGet() 方法中执行类似以下操作:

    String filename = request.getPathInfo().substring(1);
    File pdf = new File("/some/path/to/pdf", filename);
    
    response.setHeader("Content-Type", "application/pdf");
    response.setHeader("Content-Length", String.valueOf(file.length()));
    
    InputStream input = new FileInputStream(pdf);
    OutputStream output = response.getOutputStream();
    // Now just write input to output.
    

    【讨论】:

    • 感谢 BalusC,我认为也许可以通过一些 JSF 技巧在单个请求中完成。明天我一定会试试你的想法,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多