3

我有一个 1600 行长的控制器。这主要填充了一堆带有@ModelAttribute注释的公共方法。它也有一些@RequestMapping方法。

我想减少行数并分解这堂课。你如何处理带有@ModelAttribute注释的多个公共方法?不是在处理请求时都会调用它们吗?

4

3 回答 3

2

我有一个 1600 行长的控制器

吞咽。

你如何处理带有@ModelAttribute注释的多个公共方法?不是在处理请求时都会调用它们吗?

当用于注解一个方法时,这个注解表示该方法的返回值应该用于为该控制器类执行的每个请求填充模型,而不管@RequestMapping执行哪个方法。

我的建议是您执行审计以查看哪些视图(例如 JSP)使用由各种@ModelAttribute方法提供的哪些模型数据。很可能每个视图只使用该数据的一个子集。

一旦你弄清楚哪些组合@ModelAttribute@RequestMapping方法可以一起使用,然后将它们分解为单独的类。

如果这不起作用(也许所有视图确实使用了所有数据),那么考虑将@ModelAttribute方法从类中完全提取出来,并使用一种方法将它们缝合在一起,该方法手动将它们的输出合并在一起(例如,通过ModelModelMap对象从@RequestMapping方法到这个新方法,然后将模型的位添加到该对象。

请记住,@ModelAttribute-annotated 方法只是添加额外模型数据的便捷方式。它们不是唯一的方法。

于 2012-01-29T20:15:40.463 回答
1

@ModelAttribute 方法也可以返回 void:

@ModelAttribute
public void populateModel(Model model) {
    model.addAttribute("key", "value");
    // keep adding any number of attributes...
}
于 2012-02-03T18:13:09.690 回答
0

你不能将多个@ModelAttributes组合在一起吗?例如,如果您有三种方法,每种方法用于检索三个不同选择框的值,您也许可以将它们全部放在一个方法中。

于 2012-01-29T20:15:57.393 回答