【发布时间】:2012-06-15 05:26:55
【问题描述】:
如何在 Spring MVC Web 应用程序中使用动态数据(如用户名)填充可重用部分(如标题),每次调用一组控制器(页面控制器)但不为其他控制器(表单控制器、ajax、.. .)?
标题:
<#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" />
这是对this SO post 的一种跟进。然而,这家伙似乎不再活跃,我想听听一些关于我们用动态菜单之类的数据在 spring mvc web 应用程序中填充部分的方法的新意见......
另一个人建议使用AbstractController,它被所有页面控制器扩展并通过@ModelAttribute 注释方法填充变量,这似乎是一个不错的主意。但我最初的想法是:
为什么不使用带有切入点的 AOP 来填充 ModelAndView.model 只需使用 @MenuData 来注释控制器或方法。现在,每当调用控件时,它都会被向 ModelAndView 添加所需信息的 Aspect 拦截:
@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*)") 或 pageController 包中的所有控制器或随便。
当然,也可以为不同的菜单场景定义多个注释,这些注释不依赖于会话,而是依赖于页面。
所以我想知道,这种方法看起来是个好主意还是有什么陷阱?你会做什么不同/更好?您使用哪种方法?
谢谢!
【问题讨论】:
标签: java spring model-view-controller spring-mvc aop