java-会话属性在EL表达式内不响应
作者:互联网
我知道这看起来像是duplicate question.不幸的是,没有可接受的有效答案.甚至OP都面临着一个不同的问题,而不是它所说的问题.
下面的POJO类:
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):
%>
以下所有情况均无效,并且我也未获得任何例外.
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”)不遵循boolean properties的Javabeans specification.特别是布尔型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;
}
>您要在引用HTTP request header的reserved EL variable的名称上设置会话属性.简而言之:${header}变量已被保留.应该将其用于访问EL中的HTTP请求标头,例如${header [‘User-Agent’]}.
给它起一个不同的名字:
session.setAttribute("staticHeader", staticHeader);
请注意,为了清楚起见,我还重命名了Java变量,因为它绝对不代表“ response header”.否则,这只会让其他阅读此代码的人感到困惑,也可能稍后使您自己困惑,一旦您更熟练地使用Java Servlet和HTTP(我仍然想知道“静态标头”在这种情况下到底是什么意思,根据我的推测认为您使“用户角色”或“用户组”变得过于复杂,但这很遗憾.
这样,它就可以在EL中以${staticHeader}的形式使用,而您不必为将副本放在页面上下文中使用其他名称的那种丑陋的scriptlet解决方法所困扰.
>您尝试访问bean属性的尝试不符合EL specification的规定.您应使用${bean.propertyName}的形式,而不是${bean.PropertyName}的形式,并且肯定不能使用其他形式.如果您确实需要大括号表示法(因为它将作为另一个变量提供),则仍然需要确保字符串值是propertyName,如${bean [‘propertyName’]}中一样.
因此,应该这样做:
<c:if test="${staticHeader.admin}">
请注意,这不会访问私有字段,而是调用isAdmin()getter方法.而且,私有字段的存在与EL无关,您甚至可以将其完全删除.
我热烈推荐您(和所有对此问题的评论者)暂停您当前正在使用的JSP / Servlet项目,并阅读一本理智的JSP / Servlet书/教程.以上所有内容都覆盖其中.
标签:jsp-tags,el,java,jsp 来源: https://codeday.me/bug/20191120/2043591.html