开发者社区> 问答> 正文

${pageContext.session.new}服务器报错 ?报错

${pageContext.session.new}服务器报错,但改成${pageContext.session.isNew()}就没问题,目的就是通过EL调用JSP内置对象的方法,查看是否是新session

${pageContext.session.id}
${pageContext.request.remoteAddr}

这两条都没问题到了
${pageContext.session.new} 就出错
改成${pageContext.session.isNew()}就可以了

求大神告知为什么 ,来自it编程新手的真挚问答

展开
收起
爱吃鱼的程序员 2020-06-23 14:04:55 1293 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    首先HttpSession只是一个接口,具体的实现在容器。如果是tomcat的实现类则是
    org.apache.catalina.session.StandardSessionFacade,其代码如下:

    publicclassStandardSessionFacadeimplementsHttpSession{privatefinalHttpSessionsession;publicStandardSessionFacade(HttpSessionsession){this.session=session;}publiclonggetCreationTime(){returnthis.session.getCreationTime();}publicStringgetId(){returnthis.session.getId();}publiclonggetLastAccessedTime(){returnthis.session.getLastAccessedTime();}publicServletContextgetServletContext(){returnthis.session.getServletContext();}publicvoidsetMaxInactiveInterval(intinterval){this.session.setMaxInactiveInterval(interval);}publicintgetMaxInactiveInterval(){returnthis.session.getMaxInactiveInterval();}/**@deprecated*/@DeprecatedpublicHttpSessionContextgetSessionContext(){returnthis.session.getSessionContext();}publicObjectgetAttribute(Stringname){returnthis.session.getAttribute(name);}/**@deprecated*/@DeprecatedpublicObjectgetValue(Stringname){returnthis.session.getAttribute(name);}publicEnumeration<String>getAttributeNames(){returnthis.session.getAttributeNames();}/**@deprecated*/@DeprecatedpublicString[]getValueNames(){returnthis.session.getValueNames();}publicvoidsetAttribute(Stringname,Objectvalue){this.session.setAttribute(name,value);}/**@deprecated*/@DeprecatedpublicvoidputValue(Stringname,Objectvalue){this.session.setAttribute(name,value);}publicvoidremoveAttribute(Stringname){this.session.removeAttribute(name);}/**@deprecated*/@DeprecatedpublicvoidremoveValue(Stringname){this.session.removeAttribute(name);}publicvoidinvalidate(){this.session.invalidate();}publicbooleanisNew(){returnthis.session.isNew();}}

    楼主可看到这个类有getId()和isNew()这两个方法,因为按照el的取值规则

    ${pageContext.session.id}回去调用getId(),StandardSessionFacade有这个方法,所以没问题

    ${pageContext.session.new}因为是属性的引用,所以就会去找有没有getNew()这个方法,显然没有所以报错

    改成${pageContext.session.isNew()},有这个方法当然没问题

    希望对你有用,代码处问题最好的方式就是追踪溯源看代码

    session里面有new这个方法吗

    内置的session对象没有new属性,而是isNew属性,所以会报错啊。

    javax.servlet.http
    InterfaceHttpSession

    参考。

    http://tool.oschina.net/apidocs/apidoc?api=javaEE6

    文档。

    另外一点,tomcat的session实现StandardSessionFacade是一个门面模式,因为在不同的情况下底层的session机制会不一样

    2020-06-23 14:05:11
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
如何运维千台以上游戏云服务器 立即下载
网站/服务器取证 实践与挑战 立即下载
ECS块储存产品全面解析 立即下载