![](/img/trans.png)
[英]From a spring mvc controller action, how do I get access to request/response?
[英]Java: Spring MVC - How do I access the updated model in controller action?
我正在学习Spring MVC 3,并且通常不是Java专家。 我有几个问题
ModelAndView
了。 我也看到这两个:
org.springframework.ui.Model
org.springframework.ui.ModelMap
ModelMap
和Model
什么区别? 是其中一种像ModelAndView
这样的旧样式吗?
视图
<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
对象,但是如果没有,那么使用Model
或ModelMap
也可以。 我怎样才能做到这一点?
如何将表格数据传递回控制器?
只需更改您的update方法的签名,如下所示:
@RequestMapping(value = "/users/update")
public String update(KSCUser user, ModelMap model) {
// ...
}
spring将创建KSCUser的实例,并根据输入字段的name属性填充属性。 因此,如果您有一个像<input type="text" name="username" />
这样的输入字段,spring将尝试在setUsername
实例上调用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) {
// ...
}
春天,然后只需注入HttpServletRequest
实例即可访问请求参数,就像使用vanila servlet api一样。
理想情况下,如果它可以直接映射到一个不错的KSCUser对象,但是如果没有,那么Model或ModelMap也可以
当仅注入ModelMap
(就像在update
方法中一样),它将不包含请求参数(除非您使用@SeessionAttributes ),并且您将无法以这种方式访问它们。
ModelMap和Model有什么区别
好问题。 ModelMap的Javadoc说:
检出Model接口,以了解基于Java-5的接口变体,该变体起着相同的作用
imho : Model
接口看起来仅用于向模型添加对象(而不是从模型读取)……就像您的edit
方法一样。 但是,这里有一个asMap
方法,该方法授予您访问模型内容的权限。
我从未亲自使用过Model
接口。 始终注入ModelMap
。
这似乎可行:
@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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.