1

我有一个控制器向 JSP 页面返回类型类型的ArrayList对象MyClassMyClass1ArrayList 中的对象属于不同的类,假设MyClass2每个类都扩展了 MyClass。我可以使用 forEach 标记遍历集合并获取当前元素类型,这要归功于字段typeinMyClass但是当我尝试访问特定字段时MyClass1出现此错误。

javax.el.PropertyNotFoundException: Property 'noContentMessage' not found on type it.sei.core.rinterface.MyClass1.

这是我的代码:

class MyClass {
    String type;
    String variable;
}

class MyClass1 extends MyClass{
    String someOtherField;
}

class MyClass2 extends MyClass{
    String noContentMessage;
}



<core:forEach items="${model.GraphList}" var="element" varStatus="index"> 
<script language="javascript" type="text/javascript">

 var  type = '${element.type}';
 switch (type)
            {
                case "type1":
                    {
                       var variable = '${element.variable}';

                    }
                    break;

                case "type2":
                    {
                       var message = '${element.noContentMessage}';

                    }
                    break;
             }
             </script>   
          </core:forEach>

那么为什么会这样呢?在 JSTL 中不可能处理这种情况吗?

4

1 回答 1

1

JSP EL 从不访问字段。只有属性,即公共吸气剂。

为要从 JSP EL 使用的字段添加公共 getter:

public String getNoContentMessage() {
    return this.noContentMessage;
}

编辑:

此外,您的 switch 块是 JavaScript 代码,在页面生成很久之后在客户端执行。对于 JSP 引擎,JavaScript 代码是纯文本,并且会生成 switch 块的所有分支。因此,对于集合中的每个对象,都会评估所有 JSP EL 表达式。

代码应重写为

<script language="javascript" type="text/javascript">
     var  type = '${element.type}'; // is it necessary?
     <c:if test="${element.type == 'type1'}">
         var variable = '${element.variable}';
     </c:if>
     <c:if test="${element.type == 'type2'}">
         var message = '${element.noContentMessage}';
     </c:if>
</script>  

尽管我不明白为集合中的每个元素一次又一次地重新定义相同的 JS 变量有何意义。

于 2013-07-23T10:54:07.967 回答