如果有人帮助我解决以下问题,我将不胜感激。
我有一个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();
}
}
答案 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
。