关于Spring MVC
@ModelAttribute
方法的问题,在控制器@RequestMapping
方法中设置模型属性,并使用@ModelAttribute
方法单独设置属性,哪一个被认为更好,更多使用?
从设计的角度来看,从以下方面考虑哪种方法更好:
方法1
@ModelAttribute("message")
public String addMessage(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("addMessage - " + userName);
return "Spring 3 MVC Hello World - " + userName;
}
@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("printWelcome - " + userName);
return "hello";
}
方法2
@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {
LOGGER.info("printWelcome - " + userName);
model.addAttribute("message", "Spring 3 MVC Hello World - " + userName);
return "hello";
}
答案 0 :(得分:19)
@ModelAttribute annotation
有两种用途,具体取决于使用方式:
在方法级别
在方法级别使用@ModelAttribute
为模型提供参考数据。 @ModelAttribute带注释的方法在选定的@RequestMapping
带注释的处理程序方法之前执行。它们有效地使用通常从数据库加载的特定属性预填充隐式模型。然后,可以通过所选处理程序方法中的@ModelAttribute
带注释的处理程序方法参数访问此类属性,可能会对其应用绑定和验证。
换句话说;用@ModelAttribute
注释的方法将填充模型中指定的“键”。这发生在@RequestMapping
之前
在方法参数级别
在方法参数级别
当您在方法参数上放置@ModelAttribute
时,@ModelAttribute
会将模型属性映射到特定的带注释的方法参数。这是控制器获取对包含表单中输入数据的对象的引用。
<强>实施例强>
方法级别
@Controller
public class MyController {
@ModelAttribute("productsList")
public Collection<Product> populateProducts() {
return this.productsService.getProducts();
}
}
因此,在上面的示例中,在执行productsList
之前填充了模型中的“@RequestMapping
”。
方法参数级别
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST)
public String processSubmit(@ModelAttribute("product") Product myProduct, BindingResult result, SessionStatus status) {
new ProductValidator().validate(myProduct, result);
if (result.hasErrors()) {
return "productForm";
}
else {
this.productsService.saveProduct(myProduct);
status.setComplete();
return "productSaved";
}
}
}
通过示例查看here以获取详细信息。
答案 1 :(得分:14)
一个并不比另一个好。它们都有另一个目的。
@ModelAttribute
更有意义。 我认为方法2更好,因为数据特定于该处理程序。