2011-03-03 56 views
0

我有一个web应用程序,其中包含两个servlet,一个用于呈现我的JSP页面,另一个用于生成PDF。我在JSP页面之间使用会话状态,并希望将会话对象传递给PDF servlet。如何在servlet之间共享会话状态?

这里是我如何在JSP设置会话值的示例:

MyObject o = (MyObject)session.getAttribute("my.object"); 
if (o == null) 
{ 
    o = new MyObject(); 
    session.setAttribute("my.object", o); 
} 

然后我从一个链接后回我的PDF生成新的servlet在我的JSP

<a href="../pdfgen?f=d&t=c" target="_blank">Generate a draft report for review</a> 

我想我可以使用HTTPRequest对象来返回我的servlet中的会话,如下所示:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    HttpSession session = request.getSession(false); 
    MyObject o = (MyObject) session.getAttribute("my.object"); 
} 

使用上面的代码,我从请求中获得一个空会话对象。

如果我使用request.getSession(true),我得到一个会话对象,但当然它不包含属性my.object中的任何内容。

这应该如何工作?关于在servlet之间共享会话状态的规则是什么?

的Tomcat 6

TIA

回答

0

不要在JSP设置。因为JSP是HTTP响应的一部分,并且已经提交了响应,所以可能已经太晚了。无论何时需要创建新会话,servlet容器都需要将会话cookie添加到HTTP响应头。但是,当答复已经提交时,这不会发生。根据servlet容器的不同,尝试这样做时,您应该在服务器日志中看到IllegalStateException

在将请求转发到JSP(您声称它“呈现”JSP的请求之一)之前,将其设置在servlet中。


无关的具体问题,不要在你的情况下需要会话使用request.getSession(false),只需使用request.getSession()。那些潜在的NPE和nullcheck是笨拙的。在JSP中编写原始Java代码(使用scriptlets)被认为是poor practice

+0

谢谢你的小脚本的意见,我也是这么想的,但是我不认为代码的根本上重新架构是边界,现在,这是什么,将需要。 – Simon 2011-03-04 18:37:27

+0

我正在使用默认的JSP servlet来呈现主页面。 PDF servlet是完全独立的。由于我正在处理完全不同的servlet,因此我不太了解JSP如何实现响应。 – Simon 2011-03-04 18:42:03

+0

发送HTTP响应头时会提交响应。您最好的尝试是将scriptlet放在JSP页面的**顶部**之前,并且可以将任何字符/行的模板文本发送到客户端,从而强制提交响应。如果这没有帮助,请创建一个在'doGet()'中执行作业的servlet,然后将请求转发到JSP以显示HTTP响应(然后更改URL以调用该servlet而不是JSP)。 – BalusC 2011-03-04 18:46:18

1

你能检查一下你是否有这样的机会:<%@ page session =“false”%>?

如果您正在使用JSP隐式会话对象来设置值,它应该可用于该servlet。

你的代码看起来有效,但..

+0

不,没有这样的声明。据我所知,我对此感到困惑,因为这不起作用。我只是从请求中获得一个空会话对象。 – Simon 2011-03-04 18:32:57

+0

这是MyObject()可序列化吗? – basav 2011-03-04 19:28:40