2017-03-27 3 views
0

abrufen Ich habe die folgende Klasse.Kann ModelAttribute Elementvariable in JSP nicht

class Bar { 

    public Bar(String fooVal) { 
     this.foo = fooVal; 
    } 

    private String foo; 

    public String getFoo() { 
     return this.foo; 
    } 

    @Override 
    public String toString() { 
     return this.foo; 
    } 

}

Die folgenden Controller

class Controller { 
    @RequestMapping(value = "/foo", method = RequestMethod.GET) 
    public ModelAndView() { 
     return new ModelAndView("barJSP", "barModel", new Bar("testFooVal")); 
    } 
} 

Und jetzt ich Zugang in jsp bin versucht, den Wert von foo.

Ich habe die folgenden zwei Varianten von JSP in der barJSP versucht, die foo Vals zu drucken.

<% System.out.println(pageContext.findAttribute("barModel.foo")); %> 

Dies druckt null. Jedoch

Dies druckt testFooVal wie erwartet (es druckt tatsächlich die Sache, die toString() zurückgibt).

Mein Verständnis der JSP-Syntax ist das. wird verwendet, um auf Mitglieder zuzugreifen und sollte so lange funktionieren, wie Getter dafür definiert sind. Fehle ich etwas?

Antwort

1

Sie können JSP EL verwenden für leicht Zugriff auf Objekte:

${barModel.foo} 

Ansonsten haben Sie Modellklasse und Guss für die Umwandlung zu importieren:

<%@ page import="com.example.model.Bar"%> 
<% Bar b = (Bar)(pageContext.findAttribute("barModel")); 
    out.println(b.getFoo()); 
%> 
+0

Würde dies funktionieren angesichts der Existenz eines Getters? –

+0

@ArunavSanyal $ {barModel.foo} rufen implizit die Methode getFoo() auf. –

0

Verfahren findAttribute() sucht nach dem angegebenen Attribut in allen vier Ebenen in der folgenden Reihenfolge - Seite, Anfrage, Sitzung und Anwendung. Es gibt NULL zurück, wenn auf keiner Ebene ein Attribut gefunden wurde.

Im folgenden Fall

<% System.out.println(pageContext.findAttribute("barModel.foo")); %> 

das Attribut barModel.foo ist nicht zugänglich, weil es eine private Variable in der Klasse ist, und das Verfahren wird es nicht finden. So gibt es NULL zurück.

Aber im Fall von

<% System.out.println(pageContext.findAttribute("barModel")); %>

das Attribut barModel ist im Kontext zur Verfügung und wenn Sie es drucken die toString() Methode automatisch aufrufen.

+0

Mein Verständnis von Federmvc war das Modellattribut, private Mitglieder sind zugänglich, vorausgesetzt es existiert ein Getter dafür. Ich möchte die Kapselung nicht unterbrechen. –

Verwandte Themen