在Spring MVC中保留两个页面上的状态

时间:2012-11-26 16:25:43

标签: java spring jsp spring-mvc

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

到目前为止我尝试过的事情:

我查看了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 个答案:

答案 0 :(得分:2)

你可以告诉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流程而不是重新发明。