2012-08-23 43 views
1

我读春天在行动,现在我在有关构建Web应用程序的章节,但我不能完全掌握一件事Spring MVC控制器 - 参数绑定

举例来说,如果我们有方法是这样的:

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

用户输入自己的数据后,这些输入数据将被绑定到一些Spitter对象,将被

@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(); 
} 

我通过一些物体将被填充的模式进行处理,但我感兴趣的是如何工作的一个因为当页面提供给用户时,关于对象的信息就会丢失(或者我错了)?

1.Does了在createSpitterProfile加入是相同的(相同的含义参考),如addSpitterFromFormSpitter对象或是在运行中创建弹簧第二个当所请求的数据而来的对象?

2,当用户输入的请求来到addSpitterFromForm,如何春季知道从表单中的信息应该被处理到Spitter对象,我知道有Spitter对象的方法签名,但Spring如何知道数据应该填充这个对象属性。

回答

2

您必须记住,客户端Web浏览器从服务器获取“普通的旧HTML”(这里没有魔术/隐藏的Java)。因此,Spring将模型对象编码为HTML,形式为<form>输入,广播,选择等。

用户获取正常的HTML网页,填写表单并按提交到POST或GET页面回到网络服务器。这就是Spring将其魔术“解码”请求参数回到被绑定的对象(即Spitter)的地方。所以要回答Q1,没有它的不一样的对象,它的副本(甚至可能是有损拷贝)。对于Q2,当你要求Spring将一个请求绑定到一个对象时,它所做的只是试图将请求参数名称与对象上的设置器相匹配。它“知道”是因为你在方法签名中要求它。 Spring在决定如何处理方法签名时会做一些奇特的事情,它的价值在于读取它,因为您提出参数的顺序很重要。

+0

谢谢,这和我的实验清除了我所有的疑惑。 – Andna