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。