【问题标题】:Undo changes to model attribute java spring撤消对模型属性java spring的更改
【发布时间】:2021-12-29 14:06:04
【问题描述】:

我在控制器中有一个方法,它从 jsp 获取 Flavor 对象。然后,此控制器返回一个页面 (edit-flavor.jsp),用户可以在其中更改有关此 Flavor 对象的一些内容,并可以选择保存或取消编辑。

我怎样才能使当用户单击取消时,我添加到模型中的风味对象不会受到更改的影响?

@Controller
@SessionAttributes("iceCreamList")
@RequestMapping("/icecream*")
public class IceCreamController {

    @GetMapping("/new-flavour")
    public String showNewFlavourForm(Model model) {
        
        if (model.getAttribute("iceCreamList") == null) {
            model.addAttribute("iceCreamList", new IceCreamList());
        }

        return "/icecream/new-flavour";
    }

从new-flavour.jsp,当用户点击Add flavor btn,我们去:

    @PostMapping("/addFlavour")
    public String addFlavour(Model model, 
                                        @ModelAttribute("iceCreamList") IceCreamList flavours,
                                        @Valid @ModelAttribute("flavour") Flavour flavour,
                                        BindingResult result) {
        if(result.hasErrors()) {
            return "/icecream/new-flavour";
        }
        //I save the new flavour so that the whole list of 
        //flavours can be displayed in show-flavours.jsp
        flavours.addFlavour(flavour);

        model.addAttribute("flavours", flavours);
        
        return "/icecream/show-flavours";
    }
                      

show-flavors.jsp 包含一个表格,其中每一行显示一种风味和 有一个按钮来修改味道。

当点击修改 btn时,我们会去:


    @PostMapping("/modifyFlavour")
    public String modifyFlavour(Model model,
                                @ModelAttribute("iceCreamList") IceCreamList flavours,
                                @ModelAttribute Flavour flavour){

        flavours.remove(flavour);
        
        model.addAttribute(flavour);
        
        return "/icecream/edit-flavour";
    }

edit-flavour.jsp 本质上是 与 new-flavour.jsp 相同,但字段 已经充满了我的味道 想要编辑。

修改风味后,用户可以 选择保存更改或 取消它们。这是控制器方法 处理那部分:

    @PostMapping("/editFlavour")
    public String editReservationCustomer(Model model,
                                        @ModelAttribute("iceCreamList") IceCreamList flavours,
                                        @Valid @ModelAttribute("flavour") Flavour modFlavour,
                                        BindingResult result,
                                        @RequestParam("action") String action) {
            
        if(action.equals("save")) {
            if (result.hasErrors()) {
                return "/icecream/edit-flavour";
            }
            //I add the new modified flavour to the list
            flavours.addFlavour(modFlavour);
            
            return "/icecream/show-flavours";
            
        }else if (action.equals("cancel")) {
            \\What to do here??
        }

    }

    
}

如您所见,我通过将 IceCreamList 中的对象从列表中删除来编辑它,从而使用户可以更改它 然后将其重新添加到列表中。

但是,如果用户更改了某些内容并且 然后点击取消,更改 已经影响了 Flavor modFlavour 所以我只有修改后的风味对象,并且丢失了对原始对象的所有引用。

【问题讨论】:

  • @JDK 共享/icecream/edit-flavour 的控制器,必须进行更改

标签: java spring-mvc jsp


【解决方案1】:

从描述中,我明白了:

一旦用户单击风味,您将呈现一些新页面,说明所选风味及其详细信息。用户或许可以再次自定义风味对象。

答案:

将选定的风味对象从/modifyFlavour 发送到前端而不保存,显示风味对象的详细信息,启用像表单一样的自定义。单击保存后,将对象发送回另一个POST 方法/saveFlavour 以保存所有必需的详细信息。如果取消,您可以关闭该部分,无需向后端发送请求。

【讨论】:

  • 我实际上必须保存新的 Flavor 对象,以便它可以显示在 show-flavors.jsp 中。我添加了控制器的代码如果你想看看。
  • 为什么要从列表中删除选定的风味。如果用户修改了风味,那么只需借助一些标识符在 /editFlavor 的风味列表中更新相应的对象。如果没有修改,则无需做任何事情,因为我们没有删除风味,因此它仍然可用。
猜你喜欢
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2016-11-25
  • 2017-12-08
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多