gpt4 book ai didi

java - 如何避免使用带磁贴的 Spring MVC 将相同类型的数据移交给多个 Controller 的 View

转载 作者:行者123 更新时间:2023-11-30 09:19:35 25 4
gpt4 key购买 nike

我有一个 Spring MVC 3 应用程序,它集成了 tiles 3 以对每个页面使用通用 View 模板。为了简单起见,假设此模板由页眉、正文和页 footer 分组成。页眉和页 footer 分始终显示相同类型的数据,这些数据是从数据库中检索到的。正文部分随请求而变化。

由于Spring MVC是基于MVC架构的,所以我的第一个想法是每个 Controller 都必须提供显示在页眉和页 footer 分的数据。这很丑陋并且感觉不合适,因为它会导致在多个 Controller 中复制相同的代码。此外,将此类数据存储为 session 值似乎不是一个好的解决方案。

这个问题通常是怎么解决的?

非常感谢!

最佳答案

您可以创建一个拦截器,将公共(public)数据注入(inject)您的模型。使用拦截器的一个很好的特性是您可以轻松地将它们映射到您选择的 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());
}
}
}

另一种方法是创建一个 @ControllerAdvice,它将定义在所有 Controller 之间共享的通用行为。 Spring 3 中这种@ControllerAdvice 的功能相当基础。 Spring 4 引入了新的选项来控制哪些 Controller 应该受到它的影响。

@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 Controller 通知:

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

Spring 4 ControllerAdvice

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

关于java - 如何避免使用带磁贴的 Spring MVC 将相同类型的数据移交给多个 Controller 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com