JSP-EL会话变量访问错误:javax.el.PropertyNotFoundException尽管所述属性是公共的

时间:2014-11-21 05:37:46

标签: java mysql jsp if-statement el

我正在尝试使用MySQL,JDBC,Netbeans创建一个简单的数据库Web应用程序。

我在.jsp页面中有以下代码

<c:if ${sessionScope.Staff.getStatus() == sessionScope.Staff.financial_staff_status} >
    Financial staff
</c:if> 

其中sessionScope.Staff包含Staff Data类型的对象:

public class StaffData 
{
    //constants
    public final byte default_staff_status = 0;
    public final byte financial_staff_status = 1;
    public final byte legal_staff_status = 2;
    public final byte secretarial_staff_status = 3;
    //other data

    StaffData()
    {
        //initializations
    }

    void authenticate(int staff_num, String passwd) throws ClassNotFoundException, SQLException
    {
        //connect to sever, blah, blah
    }

    public String getName()
    {
        return this.name;
    } 

    public int getNumber()
    {
        return this.staff_number;
    }

    public byte getStatus()
    {
        return this.status;
    }
}

我正在提前设置会话对象:

request.getSession().setAttribute("Staff", currentStaff);

我收到以下错误:

javax.el.PropertyNotFoundException: Property 'financial_staff_status' not found on type staff.StaffData

在会话中的人员数据对象中,可以访问诸如getName()之类的公共方法,但是诸如financial_staff_status之类的公共成员不能访问。

为什么我会遇到这个问题?问题似乎与最终变量有关。可以轻松访问非最终变量而不会出现问题。

1 个答案:

答案 0 :(得分:1)

EL表达式实际上有三个问题:

<c:if ${sessionScope.Staff.getStatus() == sessionScope.Staff.financial_staff_status} >
  1. 要评估的条件表达式应在强制test属性
  2. 范围内
  3. 属性status应作为Staff.status访问,因为它已有公共getter方法
  4. 属性financial_staff_status需要在StaffData类中使用公共getter方法。 EL严格遵守对象类的javabeans合规性以及如何访问属性(必须通过公共getter)。
  5. 此外,除非您在不同范围内具有多个具有相同名称的属性或希望明确说明,否则不一定要限定属性的范围。将从最窄的(pageScope)到最宽的(applicationScope)开始搜索不同的范围。

    financial_staff_status属性的公共getter添加到您的类后,表达式应为:

    <c:if test="${sessionScope.Staff.status == sessionScope.Staff.financial_staff_status}">
    

    或简单地说:

    <c:if test="${Staff.status == Staff.financial_staff_status}">