我有一个JSP,在这里我试图使用JSTL标记显示类的内存实例中的数据。数据由一系列字符串组成,其中每个字符串都是RSS提要的地址。
在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中,我认为我可以使用上面的代码,但是当页面运行时,我只是收到一个空表。在服务器日志中,我倾向于找到消息:
javax.el.PropertyNotFoundException:在类型RSSFeedOccurrenceMiner上找不到属性’rssFeedURLs’
考虑到我对继承的使用,这是正确的。那么有人可以告诉我JSTL是否允许继承,或者我的代码中缺少某些内容?
我真的不想在JSP中使用scriptlet。
您的getter方法不遵循JavaBeans命名约定。它应该被命名getRssFeedURLs(即使您有首字母缩写词,也应该像普通单词一样大写)。在EL中,当您指定属性名称时,它实际上最终会调用该属性的getter。为了弄清楚吸气剂的名称,它使用您提供的属性名称中的第一个字母大写(因此rssFeedURLs将其转换为RssFeedURLs),并附加在get其前面。所以你最终得到了getRssFeedURLs。但是,您已将方法命名为getRSSFeedURLs。Java找不到该方法,因此您会遇到PropertyNotFoundException异常。
getRssFeedURLs
rssFeedURLs
RssFeedURLs
get
getRSSFeedURLs
PropertyNotFoundException
如果您没有正确命名吸气剂,则无法使用EL访问它们。