首先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()},有这个方法当然没问题
希望对你有用,代码处问题最好的方式就是追踪溯源看代码