Spring 模型对象(及其属性)是否绑定到它们各自的控制器端点/模板?
Are Spring Model objects (and their attributes) tied to their respective controller endpoints / templates?
我刚开始 spring 所以请多多包涵。我刚刚解决了我的代码中的一个错误,该错误来自我的假设,即一旦将属性添加到任何模型对象,它也将可用于其他端点的模板实现。
@GetMapping("/user_page")
public String getUserPage( Model model ) {
Page page = new Page();
model.addAttribute("user_page", page);
return "user_page";
在我的 Thymeleaf 模板中,我能够在 user_page.html
处很好地使用此属性。现在在另一个端点和模板上,我也试图使用这个 user_page
属性。请注意,它抛出了一些错误:
Exception evaluating SpringEL expression:
和
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null
Thymeleaf 似乎找不到 user_page
属性。
但我也没有向处理此其他端点的控制器添加 Model
参数。在向方法参数添加 Model
并再次添加页面 model.addAttribute("user_page", page);
后,这次添加到处理不同端点的控制器,问题就消失了。
Spring 是否将非单例 Model
对象自动装配到这些控制器?为什么我必须将相同的页面实例添加到模型两次?那么这些模型是否专门绑定到它们各自的控制器 returns 的模板(甚至可能是端点)?
阅读Dispatcher Servlet Processing Sequence。
Are Spring Model objects (and their attributes) tied to their respective controller endpoints / templates?
没有“模型各自的控制器”这样的东西;相反,每次都会实例化 Model
实现的一个新实例,调用任何处理程序方法。
当 HTTP 请求到达调度程序 servlet,后者将 servlet 请求-响应对象传递到相应的处理程序方法时,SpringMVC 的基础结构查找相应处理程序方法的签名并传递一个新的实例Model
(以及许多其他),如果它是预期的。
您还可以在模板的表单中使用 modelAttribute
元素,这样,您将直接将数据绑定到处理程序方法的 Model 参数,该参数会预先填充表单数据。在这种情况下,您还可以启用 Bean Validation。
我刚开始 spring 所以请多多包涵。我刚刚解决了我的代码中的一个错误,该错误来自我的假设,即一旦将属性添加到任何模型对象,它也将可用于其他端点的模板实现。
@GetMapping("/user_page")
public String getUserPage( Model model ) {
Page page = new Page();
model.addAttribute("user_page", page);
return "user_page";
在我的 Thymeleaf 模板中,我能够在 user_page.html
处很好地使用此属性。现在在另一个端点和模板上,我也试图使用这个 user_page
属性。请注意,它抛出了一些错误:
Exception evaluating SpringEL expression:
和
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null
Thymeleaf 似乎找不到 user_page
属性。
但我也没有向处理此其他端点的控制器添加 Model
参数。在向方法参数添加 Model
并再次添加页面 model.addAttribute("user_page", page);
后,这次添加到处理不同端点的控制器,问题就消失了。
Spring 是否将非单例 Model
对象自动装配到这些控制器?为什么我必须将相同的页面实例添加到模型两次?那么这些模型是否专门绑定到它们各自的控制器 returns 的模板(甚至可能是端点)?
阅读Dispatcher Servlet Processing Sequence。
Are Spring Model objects (and their attributes) tied to their respective controller endpoints / templates?
没有“模型各自的控制器”这样的东西;相反,每次都会实例化 Model
实现的一个新实例,调用任何处理程序方法。
当 HTTP 请求到达调度程序 servlet,后者将 servlet 请求-响应对象传递到相应的处理程序方法时,SpringMVC 的基础结构查找相应处理程序方法的签名并传递一个新的实例Model
(以及许多其他),如果它是预期的。
您还可以在模板的表单中使用 modelAttribute
元素,这样,您将直接将数据绑定到处理程序方法的 Model 参数,该参数会预先填充表单数据。在这种情况下,您还可以启用 Bean Validation。