2010-11-07 75 views
9

我有一個JSP,我試圖使用JSTL標籤來顯示類的內存中實例的數據。數據由一系列字符串組成,其中每個字符串是RSS源的地址。javax.el.PropertyNotFoundException:在JSP中使用JSTL

在JSP,我有以下代碼:

<table border = "1"> 
    <tr> 
     <c:forEach var = "rssFeedURL" items = "${rssfom.rssFeedURLs}"> 
      <td align = "left">${rssFeedURL}</td> 
     </c:forEach> 
    </tr> 
</table> 

基本上,rssfom是下面的類的一個實例:

public class RSSFeedOccurrenceMiner extends RSSFeedMiner { 

    private HashMap<String, Counter> keywordFrequencies; 

    public RSS_Feed_OccurrenceMiner() { 
     super(); 
     this.keywordFrequencies = new HashMap(); 
    } 
    ... 
} 

這繼承類RSSFeedMiner包含以下變量和方法:

private ArrayList<String> rssFeedURLs; 

public ArrayList<String> getRSSFeedURLs() { 
    return rssFeedURLs; 
} 

public void setRSSFeedURLs(ArrayList<String> rssFeedURLs) { 
    this.rssFeedURLs = rssFeedURLs; 
} 

所以在JSP中,我想我能夠把我們e上面的代碼,但是當頁面運行時,我只是收到一個空表。而在服務器日誌中,我往往會發現消息:

javax.el.PropertyNotFoundException:房產「rssFeedURLs」在類型RSSFeedOccurrenceMiner

給我的使用繼承哪個是正確的沒有發現。那麼任何人都可以告訴我JSTL是否允許繼承,或者我的代碼中是否存在某些缺失?

我真的不想在JSP中使用scriptlet。

回答

22

您的getter方法不遵循JavaBeans命名約定。它應該被命名爲getRssFeedURLs(即使你有一個首字母縮寫詞,它應該像普通詞一樣大寫)。在EL中,當你指定一個屬性名稱時,它實際上最終會調用該屬性的getter。要計算出吸氣劑的名稱,它會將您提供的屬性名稱中的第一個字母大寫(因此rssFeedURLs轉換爲RssFeedURLs)並將get固定在其前面。所以你最終與getRssFeedURLs。但是,您已將方法命名爲getRSSFeedURLs。 Java找不到該方法,因此你會得到一個異常。

如果您沒有正確命名您的getter,您將無法使用EL訪問它們。

+0

的確,我將這個方法稍微改了一下,但是在這種情況下並不認爲這是錯誤的。 – 2010-11-07 16:42:30

+0

@Mr Morgan,你是否將方法重命名爲'getRssFeedURLs'並嘗試使用? – 2010-11-07 16:45:13

+0

@Vivin Palaith:我在你的債務。將該方法重命名爲Java約定完美運行。之前我曾經遇到過JSTL的問題,但從來不喜歡這個。非常感謝。 – 2010-11-07 16:48:17

10

如果屬性名稱以兩個或更多後續大寫字母開頭,則應該像在EL中一樣訪問它。因此,要訪問獲取者getRSSFeedURLs(),您需要${rssfom.RSSFeedURLs}

也在JavaBeans Spec中指定。

8.8推斷名稱的大寫。

當我們使用設計模式來推斷一個屬性或事件名稱時,我們需要決定遵循哪些規則 來大寫推斷的名稱。如果我們從正常的 mixedCase樣式Java名稱的中間提取名稱,那麼默認情況下名稱將以大寫字母開頭。 Java程序員習慣於以小寫字母開頭的普通標識符。 有力的評論者意見讓我們相信,我們應該遵循相同的傳統規則 來了解財產和事件名稱。

因此,當我們從現有的Java名稱中提取屬性或事件名稱時,我們通常會將第一個字符轉換爲小寫字母。 但是,爲了支持所有 大寫名稱的偶爾使用,我們檢查名稱的前兩個字符是否都是大寫字母,並且如果 因此請保持獨立。因此,例如,

「FooBah」變成「fooBah」
「Z」變成「Z」
「URL」變成「URL」

我們提供了一個方法Introspector.decapitalize,將實現該轉換規則。

JSP EL(表達式語言,那些${}東西)遵守JavaBeans規範。因此這與JSTL(那些標籤)沒有特別的關係。

+0

java xZone中的屬性具有getter getXZone()...但是在jsp el表達式中的訪問是foo.XZone,這就是爲什麼在第一個位置只有一個字母已解除資源化的情況下,它更好地避免了屬性。 – 2016-09-30 10:00:35

+0

@Jesus:EL不會看字段的名稱,但會從getter中推斷名稱。 EL完全忽視這個領域。另見a.o. http://stackoverflow.com/q/8577545 – BalusC 2016-09-30 10:06:15

+0

是的,我試圖指出的是,埃爾推斷從getter的名稱,因此推斷「XZone」作爲屬性名稱,那麼你有在java中的名爲xZone的屬性雖然在jsp中XZone當actualy是相同的屬性,所以它可能會導致可能的錯誤 – 2016-09-30 10:34:02

-1

我VO有下面的代碼

public class DocumentPolicyVO { 
      @JsonProperty("Id") 
      private String Id; 
      @JsonProperty("Id") 
      public String getId() { 
       return Id; 
      } 
    @JsonProperty("Id") 
      public void setId(String Id) { 
       this.Id = Id; 
      } 
    } 

當我試圖訪問它在JSP頁面如下,這是給下面的錯誤javax.el.PropertyNotFoundException:房產「ID」的類型未找到DocumentPolicyVO

<select name="settingsListExcludingEnvironmentList" class="selectComboboxCheck"> 
                <c:forEach var="settingsType" items="${settingsListExcludingEnvironmentList}"> 
                 <option value="${settingsType.Id}">${settingsType.Name}</option> 
                </c:forEach> 
             </select> 

請有人可以解釋原因。

+0

如果您有其他問題,請通過單擊[Ask Question](問問題)(// stackoverflow.com/questions/ask)按鈕來提問。 – 2016-06-09 07:07:12