当我在jsp中使用<c:out value="${track}">
时,属性track
应该放在哪里(servletContext,httpSession和request)?
我试图让控制器将属性track
设置为httpSession,但是${track}
不会在.jsp中提供任何内容。另一方面,如果我将它设置为servletContext,${track}
会给我值。这似乎不对。你能否指出在.jsp(使用jstl)和控制器(.java)之间传递属性的方向?提前谢谢。
答案 0 :(得分:4)
它将在引擎盖下使用JspContext#findAttribute()
来查找属性。链接的javadoc提到以下内容:
在页面,请求,会话(如果有效)和应用程序范围
按顺序中搜索命名属性,并返回关联值或null。
因此,它将返回在按页面,请求,会话和应用程序(servletcontext)范围的顺序搜索之后找到的第一个非null值。
如果您在多个范围中具有相同名称的属性和/或您希望从特定范围获取该属性,则可以通过${pageScope}
,{{提供的属性映射来访问该属性1}},${requestScope}
和/或${sessionScope}
。 E.g。
${applicationScope}
回到实际问题:如果您在访问会话范围属性时遇到问题,那么它只能意味着JSP没有使用与servlet使用的相同的会话。您可以通过在servlet中打印会话ID来调试它,如下所示
${requestScope.track}
和JSP中的
System.out.println(session.getId());
两者都应该打印相同。如果没有,那么肯定不会共享同一个会话。会话是域,上下文和cookie依赖。
只需打印${pageContext.session.id}
即可显示所有可用的会话属性。它将以AbstractMap#toString()
中所述的格式显示字符串,其中包含所有会话属性。
${sessionScope}