Jsf 如何创建facescontext的实例

Jsf 如何创建facescontext的实例,jsf,jsf-2,jasper-reports,spring-batch,facescontext,Jsf,Jsf 2,Jasper Reports,Spring Batch,Facescontext,我使用springbatch使用JSF调用jasper报告。问题是,当调用该方法时,facescontext始终为null,因此我可以获取会话。对于我读过的不同问题,我意识到问题是因为批处理不在JSF生命周期中。如何创建facescontext实例,以便获取会话信息?我试图制作一个FacesServlet,但我不确定在哪一刻可以调用它,以及如何获取请求和响应信息 HttpServletResponse httpServletResponse = (HttpServletResponse) F

我使用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();

这本书最古老的技巧。请参阅:

我发布的代码是用于从托管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();
}

FacesContext
被设计成一个单件。这是处理它的唯一方法。这里的问题是,在Spring批处理上下文中真的有Servlet上下文吗?让我犹豫一下。除非您拥有它,否则您如何假装访问HttpSession信息?OP正在寻找错误的问题解决方案。因此,OP最终需要HTTP会话的句柄(原因不明)。为了实现这一点,OP只需要首先处理HTTP请求。手动创建
FacesContext
实例并不能更好地解决问题,因为您仍然需要HTTP请求和HTTP响应才能成功创建一个实例
FacesContext
毕竟在很大程度上也是ServletAPI的包装器。如果在基于servlet的框架中已经有了servlet API,那么为什么不直接使用它呢?如果有FacesContext,那么也有ExternalContext,并且有了这个类,就有了其他一切。