10

我有一个 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。

4

3 回答 3

23

您的 getter 方法不遵循 JavaBeans 命名约定。它应该被命名getRssFeedURLs(即使你有一个首字母缩写词,它也应该像普通单词一样大写)。在 EL 中,当您指定属性名称时,它实际上最终会调用该属性的 getter。为了找出 getter 的名称,它将您提供的属性名称中的第一个字母大写(因此rssFeedURLs被转换为RssFeedURLs)并附get加到它的前面。所以你最终得到getRssFeedURLs. 但是,您已将方法命名为getRSSFeedURLs. Java 找不到该方法,因此您会遇到PropertyNotFoundException异常。

如果你没有正确命名你的 getter,你就不能用 EL 访问它们。

于 2010-11-07T16:40:58.080 回答
11

如果属性名称以两个或多个后续大写字母开头,那么也应该像在 EL 中那样访问它。因此,要访问getRSSFeedURLs()您需要的吸气剂${rssfom.RSSFeedURLs}

这也在JavaBeans Spec中指定。

8.8 推断名称的大写。

当我们使用设计模式来推断属性或事件名称时,我们需要决定遵循哪些规则来将推断的名称大写。如果我们从普通的混合大小写样式 Java 名称的中间提取名称,那么默认情况下,名称将以大写字母开头。Java 程序员习惯于让普通标识符以小写字母开头。审稿人的积极意见使我们相信我们应该遵循同样的属性和事件名称的常规规则。

因此,当我们从现有 Java 名称的中间提取属性或事件名称时,我们通常将第一个字符转换为小写。然而,为了支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写的,如果是,则不管它。例如,

“FooBah” 变成 “fooBah”<br> “Z” 变成 “z”<br> “URL” 变成 “URL”

我们提供了一个方法 Introspector.decapitalize 来实现这个转换规则。

JSP EL(表达式语言,那些${}东西)遵循 JavaBeans 规范。因此,这与 JSTL(那些<c:xxx>标签)没有特别的关系。

于 2010-11-07T17:19:04.917 回答
-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: Property 'Id' not found on type DocumentPolicyVO

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

请任何人都可以解释原因。

于 2016-06-09T06:11:56.393 回答