JSF 2.0获取当前会话中的xhtml页面内容

时间:2011-08-30 18:14:22

标签: session jsf pdf flying-saucer

我正在尝试使用Flying Saucer将JSF页面转换为PDF格式。

@ManagedBean
@SessionScoped
public class ReportController {
    ...
    public void createPDF() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        try {
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(new URL("http://myserver.com/report.xhtml").toString());
        renderer.layout();
        HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
        response.reset();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "inline; filename="report.pdf");
        OutputStream browserStream = response.getOutputStream();
        renderer.createPDF(browserStream);
        } catch (Exception ex) {
            ...
        }
        facesContext.responseComplete();
    }
}

在/report.xhtml页面中,我有一些支持bean参数,这些值应该出现在pdf中。但他们没有。如果我访问xhtml页面,则值正确显示。 我认为这是因为renderer.setDocument(String uri)为来自指定url的加载文档创建了新连接(和新会话)。如何在当前会话中获取xhtml页面内容(包含所有参数值)?

1 个答案:

答案 0 :(得分:2)

HttpSession抓取ExternalContext#getSession(),并将其ID添加为jsessionid网址路径片段。

HttpSession session = (HttpSession) externalContext.getSession(true);
String url = "http://myserver.com/report.xhtml;jsessionid=" + session.getId();
// ...

请注意,查询字符串(如果有)应该在之后出现,而不是之前。