2013-07-23 100 views
1

我有一個控制器返回到一個JSP頁面類型爲MyClass類型ArrayList的對象的控制器。 ArrayList中的對象屬於不同的類,比如說它們分別是MyClass1MyClass2,它們每個都擴展MyClass。我可以使用forEach標記迭代集合並獲取當前元素類型,這要歸功於MyClass中的字段type,但是當我嘗試訪問MyClass1的特定字段時,出現此錯誤。jstl核心爲每個異類集合

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不可能處理這種情況嗎?

+0

向我們展示這個班級的獲得者。 – NINCOMPOOP

回答

1

JSP EL從不訪問字段。只有屬性,即公共獲得者。

添加公共getter方法,你想從JSP EL使用的字段:

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

編輯:

另外,你的開關塊是JavaScript代碼,在客戶端執行,不久之後該頁面已生成。對於JSP引擎,JavaScript代碼是純文本,並且會生成切換塊的所有分支。因此,對於集合中的每個對象,都會評估所有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變量,一遍又一遍,每一個集合中的元素。

+0

這解決了它!發現問題出在開關組件上。謝謝你的幫助! – frin