${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编程新手的真挚问答

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

 public class StandardSessionFacade implements HttpSession {
    private final HttpSession session;

    public StandardSessionFacade(HttpSession session) {
        this.session = session;
    }

    public long getCreationTime() {
        return this.session.getCreationTime();
    }

    public String getId() {
        return this.session.getId();
    }

    public long getLastAccessedTime() {
        return this.session.getLastAccessedTime();
    }

    public ServletContext getServletContext() {
        return this.session.getServletContext();
    }

    public void setMaxInactiveInterval(int interval) {
        this.session.setMaxInactiveInterval(interval);
    }

    public int getMaxInactiveInterval() {
        return this.session.getMaxInactiveInterval();
    }

    /** @deprecated */
    @Deprecated
    public HttpSessionContext getSessionContext() {
        return this.session.getSessionContext();
    }

    public Object getAttribute(String name) {
        return this.session.getAttribute(name);
    }

    /** @deprecated */
    @Deprecated
    public Object getValue(String name) {
        return this.session.getAttribute(name);
    }

    public Enumeration<String> getAttributeNames() {
        return this.session.getAttributeNames();
    }

    /** @deprecated */
    @Deprecated
    public String[] getValueNames() {
        return this.session.getValueNames();
    }

    public void setAttribute(String name, Object value) {
        this.session.setAttribute(name, value);
    }

    /** @deprecated */
    @Deprecated
    public void putValue(String name, Object value) {
        this.session.setAttribute(name, value);
    }

    public void removeAttribute(String name) {
        this.session.removeAttribute(name);
    }

    /** @deprecated */
    @Deprecated
    public void removeValue(String name) {
        this.session.removeAttribute(name);
    }

    public void invalidate() {
        this.session.invalidate();
    }

    public boolean isNew() {
        return this.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
Interface HttpSession

参考。

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

文档。

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