Java SpringMVC是否会在每次调用时创建一个定义为ModelAttribute的新对象?

Java SpringMVC是否会在每次调用时创建一个定义为ModelAttribute的新对象?,java,spring-mvc,Java,Spring Mvc,我正在处理一组类似于向导的页面,在这些页面中,用户必须在多个视图中输入数据位以进行最终提交,允许它们在完成最终提交之前来回移动。我试图对所有视图使用同一个Bean(定义为ModelAttribute),基本上只是将这个Bean作为令牌传递,每个视图在其中添加一点点数据 问题是SpringMVC似乎在不断调用时创建了一个新Bean。我对模型的模糊理解是,它基本上类似于将某个对象放入会话,该对象将一直存在,直到会话完成。情况似乎并非如此 所以,我想第一个问题是…模型属性在哪里“存活”,存活多长时间?

我正在处理一组类似于向导的页面,在这些页面中,用户必须在多个视图中输入数据位以进行最终提交,允许它们在完成最终提交之前来回移动。我试图对所有视图使用同一个Bean(定义为ModelAttribute),基本上只是将这个Bean作为令牌传递,每个视图在其中添加一点点数据

问题是SpringMVC似乎在不断调用时创建了一个新Bean。我对模型的模糊理解是,它基本上类似于将某个对象放入会话,该对象将一直存在,直到会话完成。情况似乎并非如此


所以,我想第一个问题是…模型属性在哪里“存活”,存活多长时间?是否有更好的模式可以仅使用Spring MVC实现类似向导的界面(我受限制,无法使用Web Flow…这不是我工作的一个认可工具)?

如果Web Flow不是一个选项,您可以尝试这样做:

将模型属性存储为会话属性,这是通过向控制器添加
@SessionAttribute
注释来实现的:

@Controller
@SessionAttribute("myconversationModel")
public class MyFlowController{

    @RequestMapping
    public String myMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel){
        ....
    }
}
@Controller
@SessionAttributes("formAttribute")
public HelloController
然后,在您认为流程已经完成的地方,只需接受一个附加参数
SessionStatus
并调用
SessionStatus.complete
,这将从会话中删除该属性

@RequestMapping
public String myFinalMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel, SessionStatus sessionStatus){
sessionStatus.complete();
    ....
}

将模型属性用作bean不是一个好的做法。这有利于在表单数据持久化到数据库之前对其进行模拟

@modeldattribute(“formAttribute”)
是在方法中将其指定为参数时创建的:

public void getForm(@ModelAttribute("formAttribute") Form form) {
}
它是在每次方法调用之前通过调用其构造函数创建的:

@ModelAttribute("formAttribute")
public Form getForm() {
   return new Form();
}
如果未在方法参数中指定,则它不存在

通过在控制器上定义
@SessionAttributes
,可以将
@modeldattribute
添加到会话中:

@Controller
@SessionAttribute("myconversationModel")
public class MyFlowController{

    @RequestMapping
    public String myMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel){
        ....
    }
}
@Controller
@SessionAttributes("formAttribute")
public HelloController
然后,当您第一次使用它时,它被初始化一次,当您通过调用以下命令销毁它时,它被销毁:

public void finalStep(SessionStatus status) {
   status.setComplete();
}

我认为结合
@SessionAttributes
可以以相对简单的方式创建类似向导的流。

感谢您的输入。问题似乎是我没有定义一个方法来创建用@modeldattribute标记的FormBean。因为我以前从来没有担心过FormBean会在会话中,而且我很高兴它只是在模型中,所以我不知道您必须执行所有3个步骤才能使它正常工作。无论如何,你让我走上了正确的道路,为此我感谢你。