0

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

  1. 据我所知ModelAndView,不再使用了。我也看到这两个:
    • org.springframework.ui.Model
    • org.springframework.ui.ModelMap

ModelMap和有什么区别Model?其中一个是老式的ModelAndView吗?

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

看法

<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>

编辑操作

这是我最初从 Edit 操作传递给上述 View 的内容:

@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很好的对象.. 但如果不是,那么 a ModelorModelMap也可以。我怎样才能做到这一点?

4

2 回答 2

4

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

只需更改您更新方法的签名,如下所示:

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

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

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

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

然后 spring 将使用 name 注入输入字段的值username

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

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

paramsspring 然后将在映射中注入所有请求参数。您可以像这样访问用户名: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界面看起来仅用于将对象添加到模型中(而不是从模型中读取)...就像您的edit方法中的情况一样。但是有一种asMap方法可以让您访问模型的内容。

我自己从未使用过该Model界面。始终注入ModelMap.

于 2012-12-17T06:43:36.323 回答
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);
    }
于 2012-12-17T06:35:44.033 回答