我有一个Web应用程序,其中包含两个servlet,一个用于呈现我的JSP页面,另一个用于生成PDF。我在JSP页面之间使用会话状态,并希望将会话对象传递给PDF servlet。
以下是我在JSP中设置会话值的示例:
MyObject o = (MyObject)session.getAttribute("my.object");
if (o == null)
{
o = new MyObject();
session.setAttribute("my.object", o);
}
然后我从JSP中的链接发送到我的新servlet以生成PDF
<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 :(得分:1)
您是否可以通过任何机会检查是否有此信息:&lt;%@ page session =“false”%&gt; ?
如果您使用JSP隐式会话对象来设置值,那么它应该可供servlet使用。
您的代码看起来有效..
答案 1 :(得分:0)
不要在JSP中设置它。由于JSP是HTTP响应的一部分并且已经提交了响应,因此可能已经太晚了。每当需要创建新会话时,servlet容器需要将会话cookie添加到HTTP响应头。但是,当响应已经提交时,情况就不会发生。根据servletcontainer的不同,在尝试执行此操作时,您应该在服务器日志中看到IllegalStateException
。
在将请求转发给JSP(其中一个你说它“呈现”JSP)之前,将它设置在servlet中。
与具体问题无关,请勿在需要会话的情况下使用request.getSession(false)
,只需使用request.getSession()
即可。那些潜在的NPE和零检查是笨拙的。在JSP中编写原始Java代码(使用 scriptlets )也被视为poor practice。