2011-11-07 8 views
7

I、クラスの数に広がるコントローラメソッドの数を有しています。すべてのメソッドは、Modelオブジェクトを受け取り、私の方法の全ては、(主にナビゲーションバーの表示を制御)モデルにいくつかの共有プロパティを移入します。 Springに '基本'メソッドをプラグインする方法はありますか?私は、私の共有プロパティを設定し、特定のコントローラメソッドに入る(またはそれに関しては逆にする)ことができる1つのメソッドが必要です。誰もそれをする方法を知っていますか? HandlerIntercepto RのようなのSpring FrameworkのMVCベースコントローラ方法

答えて

3

サウンドは良い方法かもしれません。

これは少しのAOPのようなものです。PreHandleまたはPostHandleメソッドを持つクラスを定義し、実行するリクエストを設定できます。それはあなたがのModelAndViewにアクセスできるようになりますので、あなたのケースでは、あなたはおそらく、PostHandleをしたいので、あなたは、共有アイテムを移入することができます。

+0

はどうもありがとうございました! – Nik

2

春と春のMVCのいくつかの拡張ポイントは、あなたが取ることができますがあります。

  • HandlerInterceptor - 各ハンドラメソッド
  • Spring AOP傍受するための簡単な方法 - 前/アドバイスの後に一致するすべてのあなたのコントローラを
  • WebArgumentResolver - おそらく、引数の解決をカスタマイズしてコントローラを呼び出す前に処理することができますか?
1

実装しているロジックが一般的に特定のビューに結合されていないクロスカット問題である場合は、コントローラの機能階層を作成するのではなく、インターセプタを使用することをおすすめします。コントローラーの階層構造によって、例外マッピングやセッションデータの管理/ライフサイクルのようなことに対処することが難しくなります。また、ビュー層は、顧客の需要の変化に対して時間の経過とともに変化する可能性が最も高い場所であるため、今後の機能階層の証明は行われません。

org.springframework.web.servlet.HandlerInterceptorはあなたが要求、要求を処理し、コントローラ、およびModelMapにアクセスすることができます「postHandle」メソッドを持っています。それはあなたが必要とするものでなければなりません。あなたはそれを変更する必要があるときは、コントローラからいくつかのコントロールが必要な場合は、常に例えば、示すことにメタデータを追加することができ、そのヘッダーのクラスが使用するには(そして将来的には、それは、XMLまたは注釈に1つの文字列です。代わりに、あなたは何を継承したクラス変更し、必要とするすべての)

あなたはこのようにして電源を入れます:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <bean class="a.package.MyHandlerInterceptor"/> 
     </list> 
    </property> 
</bean> 
関連する問題