2011-08-30 80 views
2

我试图用飞碟将JSF页面转换为PDF。JSF 2.0在当前会话中获取xhtml页面的内容

@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页面内容(使用所有参数值)?

+0

请注意,语法突出显示提示您Content-Disposition标头值中的引号已损坏。 – BalusC

回答

2

通过ExternalContext#getSession()获取HttpSession并将其ID添加为jsessionid URL路径片段。

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

请注意查询字符串,如果有的话,应该以后去那里和以前没有的。

+0

是的,它的工作原理非常感谢! – padevong