当前位置 : 主页 > 编程语言 > java >

jsp – EL用于解释属性的范围(application,servletContext,httpSession)

来源:互联网 收集:自由互联 发布时间:2021-06-25
当我使用 c:out value =“${track}”在jsp中,属性跟踪应该放在哪里(servletContext,httpSession和request)? 我试图让控制器将属性轨道设置为httpSession,但是${track}在.jsp中没有给我任何东西.另一方面
当我使用< c:out value =“${track}”>在jsp中,属性跟踪应该放在哪里(servletContext,httpSession和request)?

我试图让控制器将属性轨道设置为httpSession,但是${track}在.jsp中没有给我任何东西.另一方面,如果我将它设置为servletContext,${track}会给我值.这似乎不对.你能否指出在.jsp(使用jstl)和控制器(.java)之间传递属性的方向?提前致谢.

它将在引擎盖下使用 JspContext#findAttribute()来查找属性.链接的javadoc提到以下内容:

Searches for the named attribute in page, request, session (if valid), and application scope(s) in order and returns the value associated or null.

因此,它将返回在按页,请求,会话和应用程序(servletcontext)范围的顺序搜索之后找到的第一个非空值.

如果您在多个范围中具有相同名称的属性和/或您希望从特定范围获取属性,则可以通过${pageScope},${requestScope},$提供的属性映射来访问它. {sessionScope}和/或${applicationScope}.例如.

${requestScope.track}

也可以看看:

> Our EL wiki page
> How to access objects in EL expression language ${}

回到实际问题:如果您在访问会话范围属性时遇到问题,那么它只能意味着JSP没有使用与servlet使用的相同的会话.您可以通过在servlet中打印会话ID来调试它,如下所示

System.out.println(session.getId());

并在JSP中

${pageContext.session.id}

两者都应该打印相同.如果没有,那么肯定不会共享同一个会话.会话是域,上下文和cookie依赖.

您只需打印${sessionScope}即可显示所有可用的会话属性.它将显示格式化的字符串,如AbstractMap#toString()所述,包含所有会话属性.

${sessionScope}
网友评论