2010-11-07 29 views
9

Ich habe eine JSP, wo ich versuche, JSTL-Tags zum Anzeigen von Daten aus einer In-Memory-Instanz einer Klasse verwenden. Die Daten bestehen aus einer Reihe von Strings, wobei jeder String die Adresse eines RSS-Feeds ist.javax.el.PropertyNotFoundException: Verwenden von JSTL in JSP

in der JSP, habe ich den folgenden Code:

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

Grundsätzlich rssfom ist eine Instanz der folgenden Klasse:

public class RSSFeedOccurrenceMiner extends RSSFeedMiner { 

    private HashMap<String, Counter> keywordFrequencies; 

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

Dieses erbt von Klasse RSSFeedMiner, die die folgende Variable enthält, und methoden:

private ArrayList<String> rssFeedURLs; 

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

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

Also in der JSP, ich dachte, ich wäre in der Lage zu uns Der Code oben, aber wenn die Seite ausgeführt wird, erhalte ich einfach eine leere Tabelle. Und in den Server-Logs, neige ich dazu, die Nachricht zu finden:

javax.el.PropertyNotFoundException: Anwesen 'rssFeedURLs' nicht auf Typ RSSFeedOccurrenceMiner gefunden

Was ist richtig meine Verwendung der Vererbung gegeben ist. Kann mir jemand sagen, ob JSTL die Vererbung zulässt oder ob etwas in meinem Code fehlt?

Ich möchte wirklich kein Scriptlet in der JSP verwenden.

Antwort

22

Ihre Getter-Methode folgt nicht der JavaBeans-Namenskonvention. Es sollte getRssFeedURLs genannt werden (selbst wenn Sie ein Akronym haben, sollte es wie ein normales Wort groß geschrieben werden). Wenn Sie in EL einen Eigenschaftsnamen angeben, wird der Getter für diese Eigenschaft aufgerufen. Um den Namen des Getters herauszufinden, wird der erste Buchstabe des von Ihnen bereitgestellten Eigenschaftsnamens in Großbuchstaben geschrieben (so wird rssFeedURLs in RssFeedURLs konvertiert) und an der Vorderseite steht get. Sie enden also mit getRssFeedURLs. Sie haben jedoch Ihre Methode als getRSSFeedURLs bezeichnet. Java kann die Methode nicht finden und Sie erhalten eine PropertyNotFoundException Ausnahme.

Wenn Sie Ihre Getter nicht richtig benennen, können Sie nicht mit EL darauf zugreifen.

+0

Stimmt, ich habe die Methode leicht umbenannt, sehe aber in diesem Fall nicht den Fehler. –

+0

@Mr Morgan, haben Sie die Methode umbenannt in 'getRssFeedURLs' und versuchen Sie es? –

+0

@Vivin Palaith: Ich bin in deiner Schuld. Das Umbenennen der Methode in die Java-Konvention funktionierte perfekt. Ich habe Probleme mit JSTL gehabt, aber nie so. Danke vielmals. –

10

Wenn der Name der Eigenschaft mit zwei oder mehr nachfolgenden Großbuchstaben beginnt, sollte auch in EL wie dieser zugegriffen werden. Um auf den Getter getRSSFeedURLs() zuzugreifen, benötigen Sie ${rssfom.RSSFeedURLs}.

Das ist auch in JavaBeans Spec angegeben.

8.8 Groß-/Kleinschreibung der abgeleiteten Namen. Wenn wir Entwurfsmuster verwenden, um einen Namen einer Eigenschaft oder eines Ereignisses abzuleiten, müssen wir entscheiden, welche Regeln für die Groß-/Kleinschreibung des abgeleiteten Namens befolgen sollen.

Wenn wir den Namen aus der Mitte eines normalen mixedCase-Java-Namens extrahieren, beginnt der Name standardmäßig mit einem Großbuchstaben. Java-Programmierer sind daran gewöhnt, dass normale Kennungen mit Kleinbuchstaben beginnen. Kräftige Rezensenten-Eingabe hat uns davon überzeugt, dass wir dieselbe konventionelle Regel für Eigentums- und Ereignisnamen befolgen sollten.

Wenn wir also einen Eigenschaften- oder Ereignisnamen aus der Mitte eines vorhandenen Java-Namens extrahieren, konvertieren wir das erste Zeichen normalerweise in Kleinbuchstaben. Um jedoch die gelegentliche Verwendung aller Großbuchstaben zu unterstützen, überprüfen wir, ob die ersten beiden Zeichen des Namens Großbuchstaben sind und so lassen Sie es. So zum Beispiel,

„FooBah“ wird „fooBah“
„Z“ wird „z“
„URL“ wird „URL“

Wir stellen ein Verfahren Introspector.decapitalize, die diese Umwandlungsregel implementiert.

Die JSP EL (Ausdruck Sprache, diese ${} Dinge) hält die JavaBeans Spec. Dies bezieht sich also nicht speziell auf JSTL (diese Tags).

+0

Die Eigenschaft in Java xZone hat Getter getXZone() ... aber Zugriff in Jsp el Ausdruck ist foo.XZone es ist, warum es besser Eigenschaften mit nur einem Buchstaben an der ersten Position dekapitialisiert zu vermeiden. –

+0

@Jesus: EL schaut nicht auf den Namen des Feldes, sondern leitet den Namen von Getter ab. Das Feld wird von EL vollständig ignoriert. Siehe auch a.o. http://StackOverflow.com/q/8577545 – BalusC

+0

Ja, was ich versuchte zu beachten ist, dass el infers name von getter so "XZone" als der Name der Eigenschaft, dann haben Sie die Eigenschaft namens xZone in Java obwohl XZone in Jsp Wenn es sich tatsächlich um die gleiche Eigenschaft handelt, kann es mögliche Fehler verursachen –

-1

Mein VO hat einen folgenden Code

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; 
      } 
    } 

Als ich es in einer jsp Seite wie unten zuzugreifen bin versucht, es wird folgender Fehler javax.el.PropertyNotFoundException geben: Eigenschaft ‚Id‘ nicht auf Typen gefunden DocumentPolicyVO

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

Bitte jeder kann den Grund erklären.

+0

Wenn Sie eine andere Frage haben, fragen Sie sie bitte, indem Sie auf die Schaltfläche [Frage stellen] (// stackoverflow.com/questions/ask) klicken. –

Verwandte Themen