2017-03-27 8 views
0

私は以下のクラスを持っています。JSPでModelAttributeメンバー変数を取得できません

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

}

次コントローラ

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

そして今、私はfooの値JSPにアクセスしようとしています。

foo Valsを印刷しようとしたbarJSPには、次の2つのJSPバリアントがあります。

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

これはnullを出力します。しかし

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

予想通りこれはtestFooValを印刷します(それは実際に事のtoString()リターンを出力します)。

私はjspの構文を理解しています。メンバにアクセスするために使用され、ゲッタが定義されている限り動作する必要があります。何か不足していますか?

答えて

1

あなたは簡単にアクセスするオブジェクトに対してJSP ELを使用することができます。

${barModel.foo} 

そうでない場合は、あなたが変換するためのモデルクラスとキャストをインポートする必要があります。

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

これはゲッターの存在を前提としていますか? –

+0

@ArunavSanyal $ {barModel.foo}は暗黙的にgetFoo()メソッドを呼び出します。 –

0

すべてで指定された属性を検索しfindAttribute()方法次の4つのレベル - ページ、リクエスト、セッション、およびアプリケーション。 レベルのいずれにも属性が見つからない場合はNULLを返します。それはクラスのprivate変数であり、この方法は、それを見つけることができませんので、以下の場合

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

属性barModel.foo

はアクセスできません。したがって、それはNULLを返します。

しかし属性barModel

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

の場合の

は、コンテキスト内で利用可能であり、あなたが印刷するときに自動的に toString()メソッドを呼び出します。

+0

spring mvcについての私の理解はモデル属性であり、プライベートメンバーはアクセス可能であり、そこにゲッタが存在するならばアクセス可能です。私はカプセル化を中断したくない。 –

関連する問題