会话属性在 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
这里有几个问题。
您的 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;
}
您正在为 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 解决方法,即以不同的名称在页面上下文中放置一个副本。
您尝试访问 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。以上都包含在其中。
我知道这可能看起来像 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
这里有几个问题。
您的 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; }
您正在为 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 解决方法,即以不同的名称在页面上下文中放置一个副本。您尝试访问 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。以上都包含在其中。