编程语言
首页 > 编程语言> > java-会话属性在EL表达式内不响应

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 propertiesJavabeans 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 headerreserved 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