0

我正在为 Spring 在 POST 期间处理表单支持对象的方式而苦苦挣扎。正如预期的那样,在 html 表单中具有相应输入标记的 ScreenObject 属性在帖子中仍然存在。但是如果一个属性没有输入标签,就会出现两种情况:

  1. 如果属性作为请求参数传入,它会在帖子中继续存在。
  2. 如果属性未作为请求参数传入,则它不会在帖子中存活。

这是我的代码。

屏幕对象

private Integer hostSiteSectionId; // no input tag but survives if passed as a request param
private String name;  // input tag so survives
private String orderFactor; // input tag so survives

private Integer hostSiteId; // no input tag but survives if passed as a request param
private String hostSiteName; // no input tag and not passed as request param so does not survive

得到

@RequestMapping(method=RequestMethod.GET)
public ModelAndView edit(@RequestParam(value="hostSiteId", required=false) Integer hostSiteId, @RequestParam(value="hostSiteSectionId", required=false) Integer hostSiteSectionId, Locale locale) {
    HostSiteSectionHeaderEditScreenObject screenObject=new HostSiteSectionHeaderEditScreenObject();

    initializeScreenObject(hostSiteId, hostSiteSectionId, screenObject, locale, true);

    ModelAndView modelAndView=new ModelAndView();
    modelAndView.addObject("screenObject", screenObject);
    modelAndView.setViewName(WebView.HOST_SITE_SECTION_HEADER_EDIT_PAGE.getViewName());
    return modelAndView;    
}

POST 取消

@RequestMapping(method=RequestMethod.POST, params="cancel")
public String cancel(@ModelAttribute("screenObject") HostSiteSectionHeaderEditScreenObject screenObject) {
    // logic that returns redirect
}

我的 initializeScreenObject() 方法只设置 screenObject 的属性。它不适用于模型。我看不出它会如何干扰,所以我没有发布它的基本代码。

在这篇文章中,它在其他文章中的工作方式相同,screenObject 具有以下内容:

  1. 用户通过输入标签在表单中提供的所有输入都存在。没有任何问题。
  2. 仅当 getter url 将其作为参数包含在 screenObject 中时 hostSiteId(无输入标记)才存在(例如,edit?hostSiteId=2)
  3. 仅当 getter url 将其作为参数包含在 screenObject 中时 hostSiteSectionId(无输入标记)才存在(例如,edit?hostSiteSectionId=2)
  4. 所有其他没有相应输入标签且未作为请求参数传入的属性为空。

为了进一步说明#4。我有一个在 initializeScreenObject() 方法中设置的 screenObject.hostSiteName 属性。使用 正确呈现视图<td>${screenObject.getHostSiteName()}</td>。现在我单击取消提交控件。当控制器接管提交时,该属性为空。

请解释这是否是预期的。如果预期,请解释如何去做。我想,我可以为那些需要在帖子中生存的属性添加隐藏的表单字段,但这有点小技巧。我希望有更好的答案。以及原始请求参数如何在后期操作中成为焦点..?

4

1 回答 1

1

这听起来像是预期的行为。作为参数传递给 POST 处理程序方法的 HostSiteSectionHeaderEditScreenObject 实例与您在 GET 处理程序方法中放入模型中的实例不同。默认情况下,它是 Spring 创建的一个新实例。Spring 将根据 POST 请求中存在的参数将值绑定到对象的字段。因此,如果 POST 中不存在参数(例如,因为您没有在 HTML 表单中输入)该字段将不会由 Spring 设置,它将只是该字段的默认初始值.

听起来您可能想要将 initializeScreenObject() 应用于您的屏幕对象,然后再应用请求参数值?有几种方法可以解决这个问题。一种是使用@ModelAttribute 注释的控制器方法:

@ModelAttribute("screenObject")
public HostSiteSectionHeaderEditScreenObject initScreenObject(@RequestParam(value="hostSiteId", required=false) Integer hostSiteId, @RequestParam(value="hostSiteSectionId", required=false) Integer hostSiteSectionId, Locale locale) {
    HostSiteSectionHeaderEditScreenObject screenObject=new HostSiteSectionHeaderEditScreenObject();

    initializeScreenObject(hostSiteId, hostSiteSectionId, screenObject, locale, true);
}

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib-methods

如果你这样做,你的 GET 处理程序方法可以被简化为只返回一个视图名称。

于 2012-04-06T19:44:11.403 回答