我正在开发一个相当简单的 Web 应用程序,它使用 JSP 和 Java servlet,在 tomcat 上运行。我已经能够在 servlet 的 session 中设置属性,以便将信息传递给 JSP,然后将其呈现给用户。我已经用不同类的几个不同对象完成了此操作,并且效果很好。突然间,当我设置特定类型的对象(包含配置信息)时,该属性根本没有显示在 JSP 中。我设置的其他属性仍然存在,但是配置对象完全丢失了。我打印了属性名称列表,但我使用的名称甚至不存在(尽管我设置的其他属性的其他名称存在)。
什么会导致这种情况?我的配置类没有什么不同或奇怪的地方。我真的很感激任何关于什么样的事情可能导致这种行为的想法。我用谷歌搜索了一遍,但找不到任何东西。
预计到达时间:如果重要,属性的名称是“配置”。我找不到任何关于保留字或任何东西的信息......我在 servlet 中将此属性设置为与其他一些功能(如“用户”)相同的功能。然后我重定向到一个试图获取用户和配置的 JSP。所以一切都在同时进行。用户很好,而配置甚至没有出现在属性名称列表中。
ETA2:这是日志中不断出现的异常:
java.lang.Exception
at pms.SessionListener.printStackTrace(Unknown Source)
at pms.SessionListener.attributeAdded(Unknown Source)
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1498)
at org.apache.catalina.session.StandardSession.setAttribute(StandardSession.java:1390)
at org.apache.catalina.session.StandardSessionFacade.setAttribute(StandardSessionFacade.java:154)
at PMS.getTaskInfo(Unknown Source)
at PMS.doGet(Unknown Source)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:282)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:357)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1687)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
最佳答案
根据对问题的评论:
The session is absolutely there, and I can retrieve other attributes that were set in the servlet at the same time from the session in the JSP. It's just this one particular attribute that won't show up. I found lots of stuff on the session not being there, but not why one attribute won't work when others do.
然后某事删除或取消了该属性。
session.removeAttribute("name");
或
session.setAttribute("name", null);
甚至在 JSP 中
<c:set var="name" value="${null}" scope="session" />
或者可能是您自己设置了 null
而不是 fullworthy 对象。
为了更好地确定一个和另一个,我会让属性实现 HttpSessionBindingListener
并将堆栈转储到 valueUnbound()
上。
public class Foo implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("Value bound"); // Logger?
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.err.println("Value unbound"); // Logger?
Thread.dumpStack();
}
// ...
}
关于java - 为什么在 Java servlet 的 session 中设置属性有时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505892/