4

我正在处理一组类似向导的页面,用户必须在几个视图中输入数据位才能进行最终提交,从而允许他们在最终提交完成之前来回切换。我试图对所有视图使用相同的 Bean,定义为 ModelAttribute,基本上只是将这个 Bean 像一个令牌一样传递,每个视图在其中添加它的一点点数据。

问题是 Spring MVC 似乎在调用时创建了一个新的 Bean。我公认的对模型的模糊理解是,它基本上就像将某些东西放入会话中,并且该对象会一直存在直到会话完成。情况似乎并非如此。

所以,我想第一个问题是……模型属性在哪里“存在”,持续多久?是否有更好的模式来实现仅使用 Spring MVC 的类似向导的界面(我受到限制并且不能使用 Web Flow ......它不是我工作的批准工具)?

4

2 回答 2

3

将模型属性用作 bean 不是一个好习惯。在将表单数据持久化到数据库之前对其进行操作很有用。

@ModelAttribute("formAttribute")当您在方法中将其指定为参数时创建:

public void getForm(@ModelAttribute("formAttribute") Form form) {
}

它是在每个方法调用之前通过调用其构造创建的:

@ModelAttribute("formAttribute")
public Form getForm() {
   return new Form();
}

当方法参数中未指定时,它不存在。

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

@Controller
@SessionAttributes("formAttribute")
public HelloController

然后它在你第一次使用它时被初始化一次,并在你通过调用销毁它时被销毁:

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

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

于 2012-12-12T20:47:51.373 回答
1

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

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

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

    @RequestMapping
    public String myMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel){
        ....
    }
}

然后你认为你已经完成了流程,只需接受一个额外的参数SessionStatus并调用sessionStatus.complete,这将从会话中擦除属性

@RequestMapping
public String myFinalMethod(@ModelAttribute("myconversationModel") ConversationModel myConversationModel, SessionStatus sessionStatus){
sessionStatus.complete();
    ....
}
于 2012-12-12T20:46:12.900 回答