request.getSession()为null

时间:2012-02-06 13:49:36

标签: jsf servlets jasper-reports

如果有人帮助我解决以下问题,我将不胜感激。 我有一个jasper报告,我填写PrintingBean并且一切都很好。当我点击打印预览按钮(打开小程序)时,我的应用程序会在以下位置抛出空指针异常:

if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty())

好像它会进行新的会话(但我无法在gui上看到它,这一切都很好)。我的manageBean是一个SessionScoped。这是我的整个方法:

private void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    JasperPrint jasperPrint = null;

    try {
        PrintingBean bean = (PrintingBean) request.getSession().getAttribute("printMB");
        if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty()) {
            jasperPrint = printManager.print(bean.getPrintingDataList());
        }
    } catch (Exception ex) {
        Logger.getLogger(JasperPrintServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
    if (jasperPrint != null) {
        response.setContentType("application/octet-stream");
        ServletOutputStream ouputStream = response.getOutputStream();

        ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
        oos.writeObject(jasperPrint);
        oos.flush();
        oos.close();

        ouputStream.flush();
        ouputStream.close();
    }
}

2 个答案:

答案 0 :(得分:1)

会话由名为JSESSIONID的Cookie维护。通常,此cookie由服务器在会话开始时设置,并且该cookie在整个会话期间的每个后续单个HTTP请求上从客户端返回到服务器。客户端(webbrowser)透明地完成所有操作。另见How do servlets work? Instantiation, sessions, shared variables and multithreading

在applet中,您需要模拟与webbrowser正在进行的操作相同的操作。当applet连接到servlet并且需要访问与为applet提供服务的页面相同的会话时,你应该确保将相同的会话cookie附加到applet发送的HTTP请求。

最简单的方法是将会话ID作为参数传递给applet:

<param name="JSESSIONID" value="#{session.id}">

(注意:我假设您使用Facelets作为视图技术,如果您使用的是JSP,那么您应该使用${pageContext.session.id}代替

这样您就可以相应地在applet中设置所需的会话cookie:

String jSessionID = getParameter("JSESSIONID");
URL servletURL = new URL(getCodeBase(), "yourServletURL");
URLConnection connection = servletURL.openConnection();
connection.setRequestProperty("Cookie", "JSESSIONID=" + jSessionID);
// ...

这应该会在request.getSession()上的servlet中为您提供相同的会话。

答案 1 :(得分:0)

如果有请求,则必须有会话。我认为.getAttribute("printMB")为空。您必须先检查,然后再将其投放到PrintingBean