我使用springbatch使用JSF调用jasper报告。问题是当调用方法时,facescontext总是为null,所以我可以得到会话。对于我读过的不同问题,我意识到问题是因为批处理不在JSF生命周期中。我可以创建facescontext的实例,这样我就可以得到会话信息了吗?我尝试制作一个FacesServlet,但我不确定在哪个时刻,我可以调用它,以及如何获取请求和响应信息。
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.addHeader("Content-disposition", "attachment; filename=" + nombreReporte + ".pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
FacesContext.getCurrentInstance().responseComplete();
答案 0 :(得分:0)
这本书最古老的技巧。请参阅:Access FacesContext From servlet
答案 1 :(得分:0)
我发布的代码是我用来从托管bean生成JasperReports的代码,它可以工作:
public ServletContext getContext() {
return (ServletContext)getFacesContext().getExternalContext().getContext();
}
public HttpServletResponse getResponse() {
return (HttpServletResponse)getFacesContext().getExternalContext().getResponse();
}
public static FacesContext getFacesContext() {
return FacesContext.getCurrentInstance();
}
public void generate() {
HttpServletResponse response = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream outStream;
try {
outStream = response.getOutputStream();
} catch (IOException e) {
_logger.severe("IOException getting outputStream during report generation!!", e);
e.printStackTrace();
}
ServletContext context = getContext();
InputStream fs = context.getResourceAsStream("/Reports/" + jrxml);
//Following there is a lot of code for generating my custom reports
........................
//At the end
FacesContext.getCurrentInstance().responseComplete();
}