3

Spring MVC Web アプリの再利用可能なパーシャル (ヘッダーなど) を、特定のコントローラー グループ (ページ コントローラー) が呼び出されるたびにユーザー名などの動的データで埋める方法を教えてください。

ヘッダ:

<#import "../spring.ftl" as spring />
<!DOCTYPE html>
<html>
<head>
<title>DW-Client</title>
</head>
<body>
<h2>Welcome ${menu.userName}</h2>

索引:

<#include "common/header.ftl">
<!-- stuff -->
<#include "common/footer.ftl" />

これは、この SO postのフォローアップのようなものです。しかし、その男はもはやアクティブではないようで、動的メニューのようなデータでSpring MVC Webアプリのパーシャルを埋めるための私たちのアプローチについて、いくつかの新鮮な意見を聞きたかった...

AbstractController他の人は、すべてのページ コントローラーによって拡張され、@ModelAttribute注釈付きのメソッドを介して変数を埋めるを使用することを提案しましたが、これは良いアイデアのようです。しかし、私の最初の考えは:

ポイントカットで AOP を使用しない理由ModelAndView.model1 つは、コントローラまたはメソッドに say で注釈を付けるだけ@MenuDataです。これで、コントロールが呼び出されるたびに、ModelAndView に必要な情報を追加するアスペクトによってインターセプトされます。

@RequestMapping(value = "/")
@MenuData
public ModelAndView homePath() {
    ModelAndView mav = new ModelAndView();
    mav.setViewName("index");        
    return mav;
}


@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MenuData {
}

@Aspect
@Component
public class MenuDataAspect {

    @Inject
    private MenuDataProvider menuDataProvider;


    @Pointcut("within(@MenuData *) && execution(public * * (..))")
    public void menuDataRequested() {            
    }

    @Around("menuDataRequested()")
    public Object provideMenuData(ProceedingJoinPoint pjp) throws Throwable {
        Object output = pjp.proceed();
        ModelAndView mav = (ModelAndView) output;
        mav.getModel().put("menu", menuDataProvider.getMenuData());            
        return mav;
    }

}

これで、ヘッダーのパーシャルで何かを言うことができるはず${menu.userName}です...このようにして、どのコントローラーにmenuDataを持たせるかを正確に制御できます。

この概念は、ポイントカットに Page で始まるすべてのコントローラーをインターセプトするように指示することで、さらに柔軟にすることができます (構文についてはわかりませんが、動作することはわかっています@Pointcut("within(*.Page*)")

もちろん、セッションではなくページに依存するさまざまなメニュー シナリオに対して、複数の注釈を定義することもできます。


このアプローチは良いアイデアのように見えますか、それとも落とし穴がありますか? 別の方法/より良い方法は何ですか? どのアプローチを使用しますか?

ありがとう!

4

1 に答える 1

4

AOP は、いくつかのコントローラ クラスでデータを初期化するのにやり過ぎのようです。

(a) アプリケーション全体の動作ではないこと、(b) いくつかのユーザー ページ レベルのコントローラーに限定されていること、(c) 従来の継承を使用して実装できることの複雑さに疑問を呈します。

技術的には機能しますが、継承を使用しない説得力のある理由は何ですか?

私がこれについてオーバーサイトを提供していた場合、あなたはトレードオフで私を売り込むために一生懸命働かなければならない.

于 2012-06-12T11:15:17.333 に答える