gpt4 book ai didi

java - 来自多个来源的 Spring MVC 复杂模型填充

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:56:02 24 4
gpt4 key购买 nike

好吧,我的问题可能听起来有点模糊,但不管怎样,我的问题就在这里。我正在使用 Spring MVC 3.1.M1、JSP 2.1 构建一个 Web 应用程序(没有 Tiles,我使用纯 JSP 标记文件来组成我的布局)。

基本上,我的页面是使用一些常见部分的布局构建的 - 页眉、页脚、横幅、菜单等。这些部分中的大多数是动态的,即包含当前用户的相关信息。

JSP 没有“组件”概念,所以我无法在某个地方定义我的模板的一部分及其支持的 Java 代码,并将它们耦合在一起。在我的@Controllers 中,我必须完全填充我的模型,包括页眉、页脚、菜单和其他内容的数据。我真正想做的是避免这种代码重复。具有一些通用模型填充方法的抽象 BaseController 类看起来也不太好。

JSP 和 Spring MVC 经常一起使用,所以我希望在这个主题上存在一些最佳实践。让我们讨论一下。

最佳答案

好的,所以我花了一些时间研究 Spring MVC 引用和示例应用程序,并找到了一些其他方法来完成我的任务。他们在这里:

1) 方法一,不好用,这里提一下。使用 populateHeaderData(Model model)、populateFooterData(Model model) 等方法抽象 BaseController。所有扩展 BaseController 的 Controller 类中的所有 @RequestMapping 方法都调用这些方法来填充特定于布局的模型数据。

优点:

缺点:代码重复保持不变,只是减少了重复代码的数量

2) @ModelAttribute 方法,即隐式模型丰富。看起来像

@Controller
@RequestMapping(value="/account")
public class AccountController {

@ModelAttribute("visitorName")
private String putVisitor() {
return visitorService.getVisitorName();
}

// handler methods
}

在 JSP 中,

<span id="username">Welcome, ${visitorName}!</span>

优点:无需显式调用模型扩充方法 - 它可以正常工作

缺点:这是一件棘手的事情。 Spring MVC 使用“推”模板模型而不是“拉”。在这种情况下,这意味着当调用此类中定义的任何 @RequestMapping 方法时,都会调用此类的所有 @ModelAttribute 方法。如果模板确实需要 visitorName 以及模板是否确实存在用于特定操作,则没有区别。这包括表单提交的 POST 请求等。实际上,这迫使我们更改 Controller 分离。例如,所有表单提交都应该在单独的 Controller 类中,并且处理程序方法应该以某种方式按布局分组。我得想一想,也许它并没有第一眼看上去那么糟糕。

更多缺点:假设我们的布局 A 和 B 具有相同的非静态页眉,B 和 C 具有相同的非静态页脚(所有其他部分都不同)。我们不能为布局 B 实现基类,因为 Java 中没有多重继承。

向听众提问:Spring MVC 引用声明“处理程序方法支持以下返回类型:一个 ModelAndView 对象,模型隐式地丰富了命令对象和 @ModelAttribute 注释的引用数据访问器方法的结果......”。这些命令对象到底是什么?

3) 我自己的pull-like方法。我们可以以

的形式创建自定义上下文
@Component("headerContext")
public class HeaderContext {

@Autowired
private VisitorService visitorService;

public String getVisitorName() {
return visitorService.getVisitorName();
}

// more getters here

}

然后,通过

将这些 bean 暴露给 JSP EL
<!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/"/>
<beans:property name="suffix" value=".jsp"/>
<beans:property name="exposedContextBeanNames" value="headerContext,footerContext"/>
</beans:bean>

并在 header.tag(重用 header 的 JSP 标记文件)

<span id="username">Welcome, ${headerContext.visitorName}!</span>

优点:“拉”策略(没有人问 - 没有任何内容被执行),易于创建上下文 @Scope("request") 并启用请求范围的缓存,多重继承没有问题。只需在一处编码,在一处配置,并且可以作为常用表达式在任何 JSP 或标记文件中使用。

缺点:在一个框架内混合推和拉(必须考虑更多),在上下文实现类中不支持 Spring MVC(我的意思是 Controller 处理程序方法中这些讨厌的预填充参数),只是 Spring Bean 。

关于java - 来自多个来源的 Spring MVC 复杂模型填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5383112/

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