Java:Spring MVC - 如何在控制器操作中访问更新的模型?

时间:2012-12-17 06:09:57

标签: java spring-mvc

我正在学习Spring MVC 3,而且我不是一般的Java专家。我有几个问题

  1. 从我所知道的ModelAndView不再使用了。我也看到了这两个:
    • org.springframework.ui.Model
    • org.springframework.ui.ModelMap
  2. ModelMapModel之间有什么区别?其中一种是旧式的ModelAndView

    1. 如何将表单数据传回控制器?这是我到目前为止所拥有的:
    2. 查看

      <form action="/KSC/users/update" method="POST" class="form-horizontal" id="fEdit">
      
                                  <input type="hidden" id="id" name="id" value="${record.id}" />
      
                                  <div class="control-group">
                                      <label for="userName" class="control-label"></label>
                                      <div class="controls">
                                          <input type="text" id="userName" name="userName" value="${record.userName}" data-validation-engine="validate[required]" />
                                      </div>
                                  </div>
      
                                  <div class="control-group">
                                      <label for="email" class="control-label"></label>
                                      <div class="controls">
                                          <input type="text" id="email" name="email" value="${record.email}" data-validation-engine="validate[required,custom[email]]" />
                                      </div>
                                  </div>
      
                                  <div class="control-group">
                                      <div class="controls">
                                          <input type="submit" value="Save" class="btn btn-primary" />
                                          <a href="/KSC/users" class="btn">Cancel</a>
                                      </div>
                                  </div>
                              </form>
      

      编辑操作

      以下是我最初从“编辑”操作传递给上述视图的内容:

      @RequestMapping(value = "/users/edit/{id}")
          public String edit(ModelMap model, @PathVariable("id") int userId) {
              KCSUser user = service.find(userId);
              model.addAttribute("record", user);
              return "user/edit";
          }
      

      控制器更新操作

      @RequestMapping(value = "/users/update")
          public String update(ModelMap model) {
              //TODO
          }
      

      我需要访问更新的模型数据,以便将其保存到我的数据库中。理想情况下,如果它可以直接映射到一个很好的KSCUser对象..但如果没有,那么ModelModelMap也可以。我怎么能这样做?

2 个答案:

答案 0 :(得分:4)

  

如何将表单数据传回控制器?

只需更改您的更新方法的签名:

@RequestMapping(value = "/users/update")
public String update(KSCUser user, ModelMap model) {
    // ...
}

spring将创建KSCUser的实例,并根据输入字段的name属性填充属性。因此,如果你有一个像<input type="text" name="username" />这样的输入字段,那么spring会尝试在KSCUser的实例上调用setUsername

你也可以像这样改变你方法的签名:

@RequestMapping(value = "/users/update")
public String update(@RequestParam("username") final String username) {
    // ...
}
然后

spring将注入名为username的输入字段的值。

或者您可以像这样更改方法的签名:

@RequestMapping(value = "/users/update")
public String update(Map<String, String> params) {
    // ...
}
然后,

spring会在params地图中注入所有请求参数。您可以访问如下用户名:params.get("username")

为了完整起见......你可以改变你方法的签名:

@RequestMapping(value = "/users/update")
public String update(HttpServletRequest request) {
    // ...
}

spring然后只会注入一个HttpServletRequest的实例,你可以像访问vanila servlet api一样访问你的请求参数。

  

理想情况下,如果它可以直接映射到一个很好的KSCUser对象..但如果没有,那么Model或ModelMap也会很好

仅注入ModelMap时(与您在update方法中一样),它将不包含请求参数(除了您使用@SeessionAttributes),否则您将无法以这种方式访问​​它们。

  

ModelMap和Model

之间的区别是什么
好的问题。 ModelMap的javadoc说:

  

查看基于Java-5的接口变体的Model接口   这是出于同样的目的

imho Model界面看起来只是为了将对象添加到模型中(而不是从模型中读取)...就像你{{1}中的情况一样1}}方法。但是有一个edit方法,可以授予您访问模型内​​容的权限。

我自己从未使用asMap界面。始终注入Model

答案 1 :(得分:1)

这似乎有效:

@RequestMapping(value = "/users/update")
    public String update(ModelMap model, @ModelAttribute("record") KCSUser record) {

        if (record.getId() == 0) {
            service.insert(record);
        }
        else {
            KCSUser existing = service.find(record.getId());
            existing.setUserName(record.getUserName());
            existing.setEmail(record.getEmail());
            //etc...
            service.update(existing);
        }

        return index(model);
    }