2

我有以下顺序。

View1(POST 表单)-> PostController(创建模型和重定向)-> GetController -> View2

我正在使用 RedirectAttributes 在 PostController 和 GetController 之间传递模型,我有

类 PostController {
    public String mypost(..., final RedirectAttributes redirectAttrs){
        //创建模型
        redirectAttrs.addFlashAttribute("model", model);
        返回“重定向:myget”;
    }
}

@SessionAttributes("模型")
类获取控制器 {

    public ModelAndView myget(@ModelAttribute("model") final Model model){
        ModelAndView mav = new ModelAndView("view2");
        mav.addObject("模型", 模型);
        返回mav;    
    }
}

当用户在浏览器上打开多个选项卡,然后刷新之前的选项卡时,它将被后面打开的选项卡覆盖。

我希望每个标签都是独立的,希望有人指出我正确的方向。

谢谢。

编辑

问题出在@SessionAttributes("model")。我使用它是因为“Flash 属性在重定向之前临时保存(通常在会话中),以便在重定向之后可用于请求并立即删除。”。因此,选项卡会相互覆盖,因为会话中的模型已更新。

4

1 回答 1

0

通常,当我使用 PRG 时,我会尝试将所有相关属性放在重定向 url 中。像这样的东西...

public String myPost(ThingBean thingBean){
    Thing t = myService.updateThing(thingBean);
    return "redirect:thingView?id="+t.getId();    
}

这样,当您拦截重定向的 get 请求时,您不必依赖任何先前存储的会话数据。

@RequestMapping(value="thingView",method=RequestMethod.Get)
public String thingView(Map<String,Object> model, @RequestParam(value="id") Integer id){
    model.put("thing",myService.getThing(id));
    return "thing/viewTemplate";    
}

将模型保留为会话属性有点像将页面存储在全局变量中。这不是一个好主意。当您在页面上点击刷新时,get 请求只会发送 url 中的内容(如果您正在使用它,可能还会发送一些 cookie 数据)。

于 2012-08-02T17:20:11.760 回答