55

Spring 3 アプリのすべてのビューには、信頼できる一連の属性があります。したがって、すべてのコントローラーの最初の行は次のようになります。

ControllerHelper.addDefaultModel(model, personManager, request);

そこに追加します

  • 個人がログインしている場合、データベースから取得したユーザー オブジェクトと氏名
  • 通常一度設定される変数のセット (例: imagesHost)
  • 訪問者が切り替えることができる言語のセット
  • 現在の言語
  • いくつかの統計 (例: システム内の合計人数)

これにより、各ビューでログインしたユーザーの名前を表示し、画像の場所、言語のリスト、およびサイトに関する全体的な統計を簡単に参照できます。

問題は、コントローラ モデル オブジェクトがすべてのデータを格納するのに最適な場所なのか、それとも、ビューがこの情報に簡単にアクセスできる、より便利な場所があるのか​​ということです。

ControllerHelperそして第二に、すべてのコントローラーの最初の行として上記の行を使用する必要がないことを本当に望んでいます。実際には常に最初の行であるとは限りません。理由もなくモデルを満たすリソースを無駄にしたくないため、そのコントローラーでリダイレクトする必要があるかどうかを最初に確認することがあります。フィルターや注釈、またはいくつかの Spring コールバック メカニズムにより、コントローラーが終了した後、ビューがレンダリングされる直前にControllerHelperコードが呼び出され、リダイレクトが返された場合はこれがスキップされるようにすることができますか?

4

6 に答える 6

58

あなたは書くことができますorg.springframework.web.servlet.HandlerInterceptor。(またはその便利なサブクラスHandlerInterceptorAdapter

@See:Spring Referenceの章:15.4.1リクエストのインターセプト-HandlerInterceptorインターフェイス

それは方法を持っています:

void postHandle(HttpServletRequest request,
                HttpServletResponse response,
                Object handler,
                ModelAndView modelAndView) throws Exception;

このメソッドは、コントローラーが実行された後、ビューがレンダリングされる前に呼び出されます。したがって、これを使用して、いくつかのプロパティをに追加できます。ModelMap

例:

/**
 * Add the current version under name {@link #VERSION_MODEL_ATTRIBUTE_NAME}
 * to each model. 
 * @author Ralph
 */
public class VersionAddingHandlerInterceptor extends HandlerInterceptorAdapter {

    /**
     * The name under which the version is added to the model map.
     */
    public static final String VERSION_MODEL_ATTRIBUTE_NAME =
                "VersionAddingHandlerInterceptor_version";

    /**        
     *  it is my personal implmentation 
     *  I wanted to demonstrate something usefull
     */
    private VersionService versionService;

    public VersionAddingHandlerInterceptor(final VersionService versionService) {
        this.versionService = versionService;
    }

    @Override
    public void postHandle(final HttpServletRequest request,
            final HttpServletResponse response, final Object handler,
            final ModelAndView modelAndView) throws Exception {

        if (modelAndView != null) {
            modelAndView.getModelMap().
                  addAttribute(VERSION_MODEL_ATTRIBUTE_NAME,
                               versionService.getVersion());
        }
    }
}

webmvc-config.xml

<mvc:interceptors>
    <bean class="demo.VersionAddingHandlerInterceptor" autowire="constructor" />
</mvc:interceptors>
于 2011-11-04T11:14:47.233 に答える
34

メソッドで @ModelAttribute を使用することもできます。

@ModelAttribute("version")
public String getVersion() {
   return versionService.getVersion();
}

これにより、コントローラー内のすべてのリクエスト マッピングに追加されます。これをスーパークラスに入れると、それを拡張するすべてのコントローラーで使用できるようになります。

于 2014-01-20T12:13:33.927 に答える
14

@ControllerAdvice で注釈が付けられたコントローラークラスを使用できます

「@ControllerAdvice は、コントローラーのすべてまたはサブセットで共有される @ExceptionHandler、@ModelAttribute、および @InitBinder メソッドのために 3.2 で導入されました。」

それに関するいくつかの情報については、SpringOne2GX 2014 http://www.youtube.com/watch?v=yxKJsgNYDQI&t=6m33sの間に記録されたビデオのこの部分を見てください。

于 2015-04-03T17:32:54.693 に答える
4

@ModelAttribute または HandlerInterceptor アプローチを使用する場合、リダイレクトで発生する問題が 1 つあります。ハンドラーがリダイレクト ビューを返すと、この方法で追加されたモデル属性がクエリ パラメーターとして追加されます。

この状況を処理するもう 1 つの方法は、セッション スコープの Bean を作成することです。これは、ベース アプリケーション コントローラーで自動配線するか、アクセスが必要なすべてのコントローラーで明示的に行うことができます。

利用可能なスコープと使用方法の詳細については、こちらを参照してください。

于 2014-06-13T10:14:03.777 に答える
1

すべてのビューがこれらの変数を解決できるいくつかのグローバル変数を追加する必要がある場合は、プロパティまたはマップに定義しないでください。その後、Spring DI を使用し、ビュー リゾルバー Bean を参照してください。resUrl などの static veriable など、非常に便利です。

<property name="viewResolvers">
        <list>
            <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="viewClass"
                    value="org.springframework.web.servlet.view.JstlView" />
                <property name="attributes" ref="env" />
                <property name="exposeContextBeansAsAttributes" value="false" />
                <property name="prefix" value="${webmvc.view.prefix}" />
                <property name="suffix" value="${webmvc.view.suffix}" />
            </bean>
        </list>
    </property>
于 2014-11-13T07:16:29.213 に答える