JSF:页面加载后的自动触发事件

时间:2012-12-24 08:43:20

标签: jsf java-ee jsf-2 primefaces

我正在使用这个primefaces媒体标签来查看PDF

<p:media value="#{bean.path}" width="100%" height="600px">    
</p:media>


现在从此页面中的特定文件夹加载PDF文件(ViewPDF.xhtml)后,我想从文件夹中删除该PDF文件。我搜索并尝试了<f:event>标记,并使用了它的type="postAddToView"但它在浏览器中显示PDf之前删除了文件,我想要在浏览器中加载PDF文件后删除它。我应该用什么呢?
任何帮助都将非常感谢

1 个答案:

答案 0 :(得分:0)

PDF文件未在“页面加载后”下载完成。它是由完全独立的HTTP请求下载的,该请求在页面加载后启动。您可以映射所需网址格式的过滤器,并在chain.doFilter()调用后执行作业。但这有点奇怪。

我了解您正在生成PDF报告,这些报告应仅在提交时显示。在这种情况下,您应该创建一个单独的servlet,它根据某些请求参数生成PDF,并将其直接写入响应输出流而不是文件输出流。最后,让JSF使用正确的请求参数为该servlet生成正确的URL。

E.g。

public void submit() {
    // ...

    path = externalContext.getRequestContextPath() + "/pdf"
        + "?foo=" + URLEncoder.encode(foo, "UTF-8")
        + "?bar=" + URLEncoder.encode(bar, "UTF-8")
        + "?baz=" + URLEncoder.encode(baz, "UTF-8");
}

和这样的servlet(假设您使用iText生成PDF):

@WebServlet("/pdf/*")
public class PdfServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String foo = request.getParameter("foo");
        String bar = request.getParameter("bar");
        String baz = request.getParameter("baz");
        // ...

        response.setContentType("application/pdf");
        PdfWriter.getInstance(document, response.getOutputStream());
        // ...
    }

}

如果您想隐藏请求参数,您也可以通过自动生成/唯一ID将它们存储在会话中,并将其作为请求参数传递。