java - Spring MVC - 使用 Poincuts 用动态数据填充 Spring MVC partials

标签 java spring model-view-controller spring-mvc aop

每次调用某组 Controller (页面 Controller )但不调用其他 Controller (表单 Controller 、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,它被所有页面 Controller 扩展并通过一个带注释的 @ModelAttribute 方法填充一个变量,这似乎是个好主意。但我最初的想法是:

为什么不使用带切入点的 AOP 来填充 ModelAndView.model 可以只用 @MenuData 来注释 Controller 或方法。现在,无论何时调用 Controller ,它都会被一个将所需信息添加到 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} 或我的标题部分中的任何内容...这样我就可以准确控制哪个 Controller 应该有 menuData。

通过告诉切入点拦截所有以 Page 开头的 Controller ,可以使这个概念更加灵活(不确定语法,但我知道它会起作用,比如 @Pointcut("within(*. Page*)") 或 pageController 包中的所有 Controller 或其他任何内容。

当然,也可以为不同的菜单场景定义多个注释,这些注释不依赖于 session ,而是依赖于页面。


所以我想知道,这种方法看起来是个好主意还是有任何缺陷?你会做什么不同/更好的事情?您使用哪种方法?

谢谢!

最佳答案

AOP 对于在几个 Controller 类中初始化数据似乎有些矫枉过正。

我质疑以下方面的复杂性:(a) 不是应用程序范围的行为,(b) 仅限于少数用户页面级 Controller ,以及 (c) 可以使用传统继承来实现。

虽然它在技术上可行,但使用继承的令人信服的理由是什么?

如果我在这方面提供过站服务,您将不得不更加努力地工作才能在权衡中说服我。

关于java - Spring MVC - 使用 Poincuts 用动态数据填充 Spring MVC partials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10994825/

相关文章:

java - 在 Eclipse 中使用 Java 打印 Unicode 字符可以,但当我导出到 jar 时则不行

Java - 如何从用户获取不确定数量的输入

java - Kerberos 身份验证

java - Java中根据模型- View - Controller 制作 View

java - 将 jcache 与 hazelcast 一起使用时获取 IllegalArgumentException

java - 存储用户数据 Java Swing

Spring Cloud Config 对称 key

spring - 实体 : Autowired is null 中的计算字段

objective-c - 带有 Web 查询的 MVC

visual-studio-2010 - 找不到命名空间(ASP.NET MVC 3)