会话属性在 EL 表达式中没有响应

Session attribute not responding inside EL expression

我知道这可能看起来像 duplicate question。不幸的是,没有可接受的有效答案。即使是 OP 也面临着不同的问题,而不是它所说的问题。

POJO class 下面:

private boolean admin = false;
private boolean isNormal = false; 

public void setAdmin(boolean admin) {
    this.admin = admin;
}
public boolean getAdmin() {
    return admin;
}
public void setIsNormal(boolean isNormal) {
    this.isNormal= isNormal;
}
public boolean getIsNormal() {
    return isNormal;
}

// In this class I have many boolean flags like above two. I need to access those in the my JSP

Servlet 代码如下:

System.out.println(responseHeader.getAdmin()); //printed 'True'
session.setAttribute("header", responseHeader);
request.getRequestDispatcher("/DashBoard/Shipper").forward(request, response);

JSP 下面的代码:

<%StaticHeader sh = (StaticHeader)session.getAttribute("header");//getting the StaticHeader Object from the session
pageContext.setAttribute("headerFromSession",sh); // set the StaticHeader Object again into PageContext (may be unnecessary): 
%>

None 下面这些 场景没有工作,我也没有得到任何异常。

1.) <c:if test="${headerFromSession.getAdmin()}"> //seems to be standard, formal way. But it didn't work
2.) <c:if test="${headerFromSession.Admin}"> // Is this legal? I mean, 'admin' is a private variable. 
3.) <c:if test="${headerFromSession.ADMIN}">
4.) <c:if test="${headerFromSession[Admin]}">
5.) <c:if test="${headerFromSession[ADMIN]}">
6.) <c:if test="${headerFromSession}"> //This seems like totally not correct. Because I have many boolean flages which I have already set to the StaticHeader Object

这里有几个问题。

  1. 您的 bean(或您想要的 "POJO")不遵守 Javabeans specification as to boolean properties。特别是 boolean getter 的形式是 isPropertyName() 而不是 getPropertyName()

    相应地修复它:

    private boolean admin = false;
    private boolean normal = false; 
    
    public void setAdmin(boolean admin) {
        this.admin = admin;
    }
    
    public boolean isAdmin() {
        return admin;
    }
    
    public void setNormal(boolean normal) {
        this.normal = normal;
    }
    
    public boolean isNormal() {
        return normal;
    }
    

  2. 您正在为 reserved EL variable referring the HTTP request header 的名称设置 session 属性。简单地说:${header} 变量已经被保留。这应该用于访问 EL 中的 HTTP 请求 header,例如 ${header['User-Agent']}.

    给它一个不同的名字:

    session.setAttribute("staticHeader", staticHeader);
    

    请注意,为了清楚起见,我还重命名了 Java 变量,因为这绝对不代表“response header”。否则只会让阅读这段代码的其他人感到困惑,一旦你更熟练地使用 Java Servlets 和 HTTP 之后,你自己也可能会感到困惑(我仍然想知道 "static header" 在这种情况下到底意味着什么,作为一个有根据的猜测,我认为你把 "user roles" 或 "user groups" 复杂化了,但是唉)。

    这样它就可以在 EL 中以 ${staticHeader} 的形式使用,并且您不需要搞乱那个丑陋的 scriptlet 解决方法,即以不同的名称在页面上下文中放置一个副本。


  3. 您尝试访问 bean 属性 不符合 EL specification。您应该使用 ${bean.propertyName} 的形式而不是 ${bean.PropertyName} 并且肯定不是其他形式。如果您确实需要大括号表示法(因为它要作为另一个变量提供),那么您仍然需要确保字符串值为 propertyName,如 ${bean['propertyName']}.

    所以,应该这样做:

    <c:if test="${staticHeader.admin}">
    

    请注意,这不会访问 private 字段,而是调用 isAdmin() getter 方法。此外,private 字段的存在与 EL 无关,您甚至可以将其完全删除。


我热烈建议您(以及对该问题的所有评论者)暂停您当前正在工作的 JSP/Servlet 项目,并通过一个理智的 JSP/Servlet book/tutorial。以上都包含在其中。