【问题标题】:Maintain Model Data between Pages (Spring 3 MVC)在页面之间维护模型数据(Spring 3 MVC)
【发布时间】:2013-09-13 08:14:51
【问题描述】:

我在 Spring 中有一个添加联系人流程,它将跨越多个页面,第一页将接受文本输入,第二个页面将接受图像输入,第三个页面将显示草稿。

首页

@RequestMapping("/addContact")
public String registerContact(@ModelAttribute Contact contact) {
 return "addContact";
}
@RequestMapping("/addContact")

第二页

@RequestMapping("/addImages")
public String registerImages(@Valid Contact contact, BindingResult result) {
 return "addImages";
}

如何维护页面之间的联系模型数据,以便我可以为用户提供在页面之间来回移动的选项?

【问题讨论】:

  • 这取决于...你有一个控制器还是多个控制器。
  • 您可以使用@SessionAttribute 来维护会话,也可以将您的对象放入model.setAttribute("key","value") 来设置SessionAttributes。
  • M. Deinum ,我对所有页面都有一个控制器
  • @Tushar Spring 有一个叫做 Web Flow 的概念。
  • @Niks 我知道这一点,但我正在尝试在不设置网络流程的情况下这样做,因为这些只是三个页面,没有太多复杂性

标签: spring spring-mvc


【解决方案1】:

如果您有一个控制器处理所有页面,您可以使用@SessionAttributes 在会话中的请求之间存储Contact。在最后一页之后使用SessionStatus 来标记@SessionAttribtues 的使用完成(用于清理)。

@Controller
@SessionAttributes("contact")
public AddContactController {

    @ModelAttribute
    public Contact contact() {
        return new Contact();
    }

    @RequestMapping("/addContact")
    public String registerContact(@ModelAttribute Contact contact) {
        return "addContact";
    }

    @RequestMapping("/addImages")
    public String registerImages(@Valid @ModelAttribute Contact contact, BindingResult result) {
        return "addImages";
    }

    @RequestMapping("/save")    
    public String firstPage(@ModelAttribute Contact contact, SessionStatus status) {
      status.complete();
    }
}

【讨论】:

  • 如果你有一个控制器处理所有页面,你可以使用@SessionAttributes....你不能在多个控制器中使用相同的会话属性吗?
  • 我认为您的最后一个请求应该是 POST 并且也使用 PRG 设计模式?不是吗?
  • @SessionAttributes 不打算在控制器之间的会话中存储数据,它应该只用于单个控制器! (在某一时刻,用于在会话中存储属性的“@SessionAttributes”的命名被绑定到控制器名称)。所以只能将它用于单个控制器。关于请求,我认为它们应该是帖子,然后应该发出重定向到下一个屏幕。但那是恕我直言。
【解决方案2】:

这可以通过使用@SessionAttributes 来完成,它有一个限制check this。 不过,这完全取决于您的设计。

或者您可以使用下面提到的 pesudocode。检查 Session API here

Use HttpServletRequest in your RequestMapping to get request.


HttpSession session = request.getSession();//make an 

session.setAttribute("user", userDTO);


try
{
HttpSession session=request.getSession(false);
if(session!=null)
{

UserDTO userDTO = (UserDTO) session.getAttribute("user");

}

userDTO 是你的对象

如何在表单中来回切换

现在为了在您的流程中来回切换。您必须创建前向和后向链接并使用会话来填充已保存的值。

如果您需要更具体的代码,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    相关资源
    最近更新 更多