2

タイル 3 を統合してすべてのページに共通のビュー テンプレートを使用する Spring MVC 3 アプリケーションがあります。簡単にするために、このテンプレートはヘッダー、本文、およびフッター部分で構成されていると仮定します。ヘッダー部分とフッター部分には、データベースから取得された同じタイプのデータが常に表示されます。ボディ部分はリクエストごとに変わります。

Spring MVC は MVC アーキテクチャに基づいているため、最初のアイデアは、各コントローラーがヘッダーとフッター部分に表示されるデータを提供する必要があるということでした。これは、複数のコントローラーで同じコードの重複につながるため、見苦しく、適切ではないと感じます。また、このタイプのデータをセッション値として保存することは、良い解決策ではないようです。

この問題は通常どのように解決されますか?

どうもありがとう!

4

2 に答える 2

1

共通データをモデルに注入するインターセプターを作成できます。インターセプターを使用する優れた機能は、選択した URL に簡単にマップできることです。

public class CommonDataInjectingInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    private CommonDataHolder holder;

    public void setCommonDataHolder(CommonDataHolder holder) {
        this.holder = holder;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if (holder != null && modelAndView != null) {
            modelAndView.addObject("menu", holder.getMenu());
            modelAndView.addObject("footer", holder.getFooter());
        }
    }
}

もう 1 つの方法は、@ControllerAdviceすべてのコントローラーで共有される一般的な動作を定義する を作成することです。@ControllerAdviceSpring 3でのそのような機能はかなり基本的なものです。Spring 4 では、影響を受けるコントローラーを制御する新しいオプションが導入されています。

@ControllerAdviceと組み合わせて使用​​すると、@ModelAttribute非常に便利です。Ayub Malik が彼の回答で部分的に説明したように。

@ControllerAdvice
public class CommonDataControllerAdvice {
    @Autowired
    private CommonDataHolder holder;

    public void setCommonDataHolder(CommonDataHolder holder) {
        this.holder = holder;
    }

    @ModelAttribute("menu")
    public Menu menu() {
        return holder.getMenu();        
    }

    @ModelAttribute("footer")
    public Footer footer() {
        return holder.getFooter();
    }
}

Spring 3 コントローラーのアドバイス:

http://docs.spring.io/spring/docs/3.2.7.RELEASE/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html

Spring 4 コントローラーのアドバイス

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html

于 2014-02-11T22:15:24.103 に答える