2012-11-26 52 views
2

我有一个Spring MVC 3应用程序,我们有两个页面。一页用户选择一些数据,这些数据发布到控制器并构建页面2.然后,在页面2获取其值之后,我想使用数据库操作的第一页的值。在Spring MVC的两页保留状态

事情我试过到目前为止:

我看着ModelAttribute

首先是第一控制器的帖子:

@RequestMapping(value = "/firstPage") 
public ModelAndView firstPageSubmit(String valuePage1, String valuePage2) { 
    return new ModelAndView("secondPage", "readonlySettings", new ReadonlySettings(valuePage1, valuePage2); 
} 

而且我希望,春天不会保存此对象,并再次给我:

@RequestMapping(value = "/secondPage") 
public ModelAndView secondPage(@ModelAttribute("readonlySettings") ReadonlySettings settings, String valuePage2) { 
    //Store stuff in the database 
    doa.save(settings.getValuePage1(), settings.getValuePage2(), valuePage2); 
} 

但是没有骰子..所有的值都是空的。

顺便说一句:我没有做任何事情与jsp本身的ReadonlySettings对象。所以没有隐藏的领域或什么,因为我不喜欢这个解决方案。人们可以改变隐藏的领域,这是我真正想避免的。

有谁知道如何处理?

+1

如果你正在制作的实际上是某种向导或流程,可以考虑使用Spring Webflow,或者如果你想(这是现代的方式)使用你选择的JavaScript框架将状态移动到客户端。 –

+0

它类似于一个向导,是的,但我不想带入一个全新的框架,当我只使用这一个1的情况..虽然感谢您的建议! – Arcturus

回答

2

你可以通过使用@SessionAttributes来告诉Spring通过@SessionAttributes来保持与服务器端用户的Web会话相关联的对象。

@Controller 
@SessionAttributes("readonlySettings") 
public class MyController { 

@RequestMapping(value = "/firstPage") 
public ModelAndView firstPageSubmit(String valuePage1, String valuePage2, ModelMap map) { 
    map.addAttribute("readonlySettings", new ReadonlySettings(valuePage1, valuePage2); 
    return new ModelAndView("secondPage"); 
} 

@RequestMapping(value = "/secondPage") 
public ModelAndView secondPage(ModelMap map, SessionStatus status, String valuePage2,) { 
    ReadonlySettings settings = map.getAttribute("readonlySettings"); 
    doa.save(settings.getValuePage1(), settings.getValuePage2(), valuePage2); 
    status.setComplete(); 
} 

现在显然这是相当原始的。根据操作的上下文,当有人通过链接直接加载第二个页面并且在其会话中没有对象时,可能需要添加处理。此外,如果有人从未完成第二步,该对象将留在那里直到会话清理完毕。 (在只有两个字符串的情况下可以容忍)。如果您的实际用例比这更复杂,那么您可能希望查看Web流程等内容,而不是重新创建。

+0

它神奇地工作!我最终使用了类型变体:'@SessionAttributes(types = {ReadonlyPublishSettings.class})''。谢谢! – Arcturus

+0

太糟糕了虽然Spring并没有提供某种ViewState,但是在ASP.NET中有一个ViewState对象,只是为了这个目的......哦,); – Arcturus

+0

以程序员把东西放入会话中而不知道它为代价 –