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.model
1 つは、コントローラまたはメソッドに 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*)")
。
もちろん、セッションではなくページに依存するさまざまなメニュー シナリオに対して、複数の注釈を定義することもできます。
このアプローチは良いアイデアのように見えますか、それとも落とし穴がありますか? 別の方法/より良い方法は何ですか? どのアプローチを使用しますか?
ありがとう!