2011-11-15 120 views
2

我有一个页面,有一个输入栏和一个按钮。单击该按钮会根据输入字段中输入的值生成PDF报告。我的问题在于,输入字段需要一些特殊的格式,而且我有一个验证器,如果所需的格式不存在,将会触发。如何在提交表单提交文件下载后清除验证错误?

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

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

回答

0

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

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

E.g.

<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模式和不喜欢的东西在doGet()方法如下一个servlet:

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. 
+0

感谢BalusC,我认为也许可以通过一些JSF技巧在一个请求中完成它。我明天肯定会给你一个想法,谢谢。 – user790399