我有一个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。
答案 0 :(得分:23)
您的getter方法不遵循JavaBeans命名约定。它应该被命名为getRssFeedURLs
(即使你有一个首字母缩略词,它应该像普通词一样大写)。在EL中,当您指定属性名称时,它实际上最终会调用该属性的getter。要弄清楚getter的名称,它会将您提供的属性名称中的第一个字母大写(因此rssFeedURLs
转换为RssFeedURLs
)并将get
添加到前面它。所以你最终得到了getRssFeedURLs
。但是,您已将方法命名为getRSSFeedURLs
。 Java无法找到该方法,因此您会收到PropertyNotFoundException
异常。
如果您没有正确命名您的getter,则无法使用EL访问它们。
答案 1 :(得分:10)
如果属性名称以两个或更多后续大写字母开头,那么它也应该像EL中那样被访问。因此,要访问getter getRSSFeedURLs()
,您需要${rssfom.RSSFeedURLs}
。
这也在JavaBeans Spec中指定。
8.8推断名称的大写。
当我们使用设计模式推断属性或事件名称时,我们需要确定哪些规则 跟随大写推断名称。如果我们从正常的中间提取名称 mixedCase样式的Java名称,默认情况下,名称将以大写字母开头。 Java程序员习惯于使用小写字母开头。 强有力的评论者输入使我们确信我们应该遵循同样的传统规则 对于财产和事件名称。
因此,当我们从现有Java名称的中间提取属性或事件名称时,我们 通常将第一个字符转换为小写字母。 但支持偶尔使用所有 大写名称,我们检查名称的前两个字符是否都是大写和if 所以不管它。例如,
“FooBah”成为“fooBah”
“Z”变为“z”
“URL”变为“URL”我们提供了一个实现此转换规则的方法Introspector.decapitalize。
JSP EL(表达式语言,那些${}
个东西)遵循JavaBeans规范。因此,这与JSTL(那些<c:xxx>
标签)没有特别的关系。
答案 2 :(得分:-1)
我的VO有以下代码
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:viewportHeight="81.875"
android:viewportWidth="65.59"
android:width="24dp"
>
<group name=""dot_name
pivotX="viewportHeight / 2"
pivotY="viewportWidth / 2"> <!--Calculate the values by yourself, write the calucalted values in there. This moves the reference point to the middle -->
<path
android:fillColor="#FF000000"
android:pathData="M-0.01,32.82a32.81,32.81 0,1 1,65.61 0c0,28.94 -32.8,49.04 -32.8,49.04S-0.01,61.77 -0.01,32.82Z"
/>
</group>
</vector>
当我尝试在jsp页面中访问它时,如下所示,它给出以下错误javax.el.PropertyNotFoundException:Property&#39; Id&#39;找不到类型DocumentPolicyVO
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;
}
}
请有人解释原因。