【问题标题】:Update a @ModelAttribute with existing values使用现有值更新 @ModelAttribute
【发布时间】:2016-05-20 05:56:57
【问题描述】:


我想知道是否有办法更新现有的@ModelAttribute。如果可能,不保留会话中的值
假设我有一个 bean:

class TravelDetails{
    private String origin;
    private String destination;
    private String travelerName;
    private String travelerAge;
        // Getters & Seters
}

这是我的控制器:

@Controller
class TravelerController{

@RequestMapping(value="/searchDetails", method=RequestMethod.GET)
public ModelAndView getSearchDetails(@RequestParam("origin") String origin,
        @RequestParam("destination") String destination,ModelMap modelMap){
    TravelDetails travelDetails = new TravelDetails();
    travelDetails.setOrigin(origin);
    travelDetails.setDestination(destination);
    modelMap.addAttribute("travelDetails",travelDetails);
    return new ModelAndView("get_traveler_details");
    }

@RequestMapping(value="/addTravelerDetails", method=RequestMethod.POST)
public ModelAndView addTravelerDetails(
    @ModelAttribute("travelDetails") TravelDetails travelDetails,
           ModelMap modelMap){
    System.out.println(travelDetails.getOrigin);
    System.out.println(travelDetails.getDestination);
    System.out.println(travelDetails.getTravelerName);
    System.out.println(travelDetails.getTravelerAge);
    return new ModelAndView("get_traveler_details");
    }
   }

第二个控制器方法得到的post表单只包含旅行者的姓名和年龄,而出发地和目的地需要从第一个控制器中设置的模型属性中检索。
我不想在 Post 表单中显式设置隐藏字段。
假设我的 HTML 是:

<form:form modelAttribute="travelDetails" action="/addTravelerDetails" method="POST">
    <form:input type="text" path="travelerName"/>
    <form:input type="text" path="travelerAge"/>
</form:form>

注意:我是在 StackOverflow 的文本区域而不是在某些 IDE 上编写代码,所以如果代码中有一些蹩脚的拼写或语法错误,请忽略。

【问题讨论】:

  • 您可能希望将信息保留在会话中
  • 不,我不想。如果存在,会更喜欢另一种方式。
  • 您为什么不想将原始目的地发回?安全原因?
  • @sidgate 其实这只是一个例子。我的实际 bean 有 50 多个属性。我不喜欢通过网络再次发送相同的值 + 这会增加 JSP。
  • @sidgate 有什么解决办法吗?请标记您认识的可以回答的人。谢谢

标签: java spring model-view-controller modelattribute


【解决方案1】:

你可以在类级别使用@SessionAttributes注解

@Controller
@SessionAttributes("travelDetailsPersist")
class TravelerController{

    @RequestMapping(value="/searchDetails", method=RequestMethod.GET)
    public ModelAndView getSearchDetails(@RequestParam("origin") String origin, @RequestParam("destination") String destination,ModelMap modelMap){
        TravelDetails travelDetails = new TravelDetails();
        travelDetails.setOrigin(origin);
        travelDetails.setDestination(destination);
        modelMap.addAttribute("travelDetails",travelDetails);
        modelMap.addAttribute("travelDetailsPersist",travelDetails);
        return new ModelAndView("get_traveler_details");
    }

    @RequestMapping(value="/addTravelerDetails", method=RequestMethod.POST)
    public ModelAndView addTravelerDetails(@ModelAttribute("travelDetailsPersist") TravelDetails travelDetailsPersist, @ModelAttribute("travelDetails") TravelDetails travelDetails, ModelMap modelMap){
        System.out.println(travelDetailsPersist.getOrigin);
        System.out.println(travelDetailsPersist.getDestination);
        System.out.println(travelDetails.getTravelerName);
        System.out.println(travelDetails.getTravelerAge);
        return new ModelAndView("get_traveler_details");
    }  
}

【讨论】:

  • 感谢您的解决方案,但正如我在问题中已经提到的,我不希望在会话中保留值。
  • 此外,当您通过第一个控制器将模型属性“travelDetailsPersist”发送到 html 页面时,您的“travelDetailsPersist”将充当表单的模型属性,并且在提交表单时,相同的属性“travelDetailsPersist”将被更新并且“travelDetails”属性将为空。如果我错了,请纠正我。
  • 如果不想保持会话,可以使用自己的持久化逻辑来存储和检索
  • 有什么提示吗?
  • 一种可能的解决方案可能是,您可以将表单中的起点和终点作为隐藏字段传递,然后在您的 addTravelerDetails 方法中,您可以根据起点和终点获取其​​余属性(您提到超过 50 个) .
猜你喜欢
  • 2018-06-30
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-23
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多