Jsp Spring mvc控制器-参数绑定
我正在阅读SpringInAction,现在我正在阅读关于构建web应用程序的章节,但我不能完全掌握一件事 例如,如果我们有这样的方法:Jsp Spring mvc控制器-参数绑定,jsp,spring-mvc,Jsp,Spring Mvc,我正在阅读SpringInAction,现在我正在阅读关于构建web应用程序的章节,但我不能完全掌握一件事 例如,如果我们有这样的方法: @RequestMapping(method=RequestMethod.GET, params="new") public String createSpitterProfile(Model model) { model.addAttribute(new Spitter()); return "spitters/edit"; } 在这里,我们将Sp
@RequestMapping(method=RequestMethod.GET, params="new")
public String createSpitterProfile(Model model) {
model.addAttribute(new Spitter());
return "spitters/edit";
}
在这里,我们将Spitter
类的实例添加到模型中,因此它被传递到这个表单中
<div>
<h2>Create a free Spitter account</h2>
<sf:form method="POST" modelAttribute="spitter"
enctype="multipart/form-data">
<fieldset>
<table cellspacing="0">
<tr>
<th><sf:label path="fullName">Full name:</sf:label></th>
<td><sf:input path="fullName" size="15" /><br/>
<sf:errors path="fullName" cssClass="error" />
</td>
</tr>
<tr>
<th><sf:label path="username">Username:</sf:label></th>
<td><sf:input path="username" size="15" maxlength="15" />
<small id="username_msg">No spaces, please.</small><br/>
<sf:errors path="username" cssClass="error" />
</td>
</tr>
<tr>
<th><sf:label path="password">Password:</sf:label></th>
<td><sf:password path="password" size="30"
showPassword="true"/>
<small>6 characters or more (be tricky!)</small><br/>
<sf:errors path="password" cssClass="error" />
</td>
</tr>
<tr>
<th><sf:label path="email">Email Address:</sf:label></th>
<td><sf:input path="email" size="30"/>
<small>In case you forget something</small><br/>
<sf:errors path="email" cssClass="error" />
</td>
</tr>
<!--<start id="image_field"/>-->
<tr>
<th><label for="image">Profile image:</label></th>
<td><input name="image" type="file"/>
</tr>
<!--<end id="image_field"/>-->
<tr>
<th></th>
<td>
<sf:checkbox path="updateByEmail"/>
<sf:label path="updateByEmail"
>Send me email updates!</sf:label>
</td>
</tr>
<tr>
<th></th>
<td><input name="commit" type="submit"
value="I accept. Create my account." /></td>
</tr>
</table>
</fieldset>
</sf:form>
</div>
我将一些对象传递给将被填充的模型,但我感兴趣的是这在幕后是如何工作的,因为当页面被提供给用户时,关于对象的信息丢失了(或者我错了)
1.在createSpitterProfile
中添加的对象是否与addSpitterFromForm
中的Spitter
对象相同(意思相同),或者是请求的with数据到达时由Spring动态创建的第二个对象
2.当用户输入进入对
addSpitterFromForm
的请求时,Spring如何知道表单中的信息应该处理到Spitter
对象,我知道方法签名中有Spitter
对象,但是Spring如何知道数据应该填充这个对象属性呢。您必须记住,客户端web浏览器从服务器获取“普通的旧HTML”(其中没有神奇的/隐藏的Java)。因此Spring将模型对象“编码”为HTML,格式为输入、无线电、选择等
用户获得一个普通的HTML网页,填写表单并按submit将该网页发布或返回到web服务器。这就是Spring的神奇之处,它将请求参数“反编码”回被绑定的对象(即Spitter
)。所以回答Q1,不,它不是同一个物体,它是一个拷贝(甚至可能是一个有损拷贝)
至于Q2,当您要求Spring将请求绑定到对象时,它所做的只是尝试将请求参数名称与对象上的setter匹配。它“知道”,因为您要求它在方法签名中显示。Spring在决定如何处理方法签名时做了一些花哨的事情,值得一读,因为您放置参数的顺序确实很重要
@RequestMapping(method=RequestMethod.POST)
public String addSpitterFromForm(@Valid Spitter spitter,
BindingResult bindingResult,
@RequestParam(value="image", required=false) MultipartFile image) {
if(bindingResult.hasErrors()) {
return "spitters/edit";
}
spitterService.saveSpitter(spitter);
try {
if(!image.isEmpty()) {
validateImage(image);
saveImage(spitter.getId() + ".jpg", image);
}
} catch (ImageUploadException e) {
bindingResult.reject(e.getMessage());
return "spitters/edit";
}
return "redirect:/spitters/" + spitter.getUsername();
}