1

私はSpringの動作を読んでいて、今はWebアプリケーションの構築に関する章にいますが、1つのことを完全に理解することはできません.

たとえば、次のようなメソッドがあるとします。

@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. 追加されたオブジェクトは のオブジェクトとcreateSpitterProfile同じ (同じ意味の参照)ですか、それとも要求されたデータが来たときにオンザフライで Spring によって作成された 2 番目のSpitterオブジェクトですか?addSpitterFromForm

2.ユーザー入力が へのリクエストに含まれているaddSpitterFromForm場合、Spring はフォームからの情報をSpitterオブジェクトに処理する必要があることをどのように認識しますか?私Spitterはメソッド署名にオブジェクトがあることを知っていますが、Spring はデータがこのオブジェクトのプロパティを入力する必要があります。

4

1 に答える 1

2

クライアントの Web ブラウザはサーバーから「プレーンな古い HTML」を取得することに注意する必要があります (そこには魔法の / 隠された Java はありません)。そのため、Spring はモデル オブジェクトを<form>入力、ラジオ、選択などの形式で HTML に「エンコード」します。

ユーザーは通常の HTML Web ページを取得し、フォームに入力して送信を押して POST するか、ページを Web サーバーに戻します。これは、Spring がそのマジックを実行して、リクエスト パラメータをバインドされているオブジェクト (つまりSpitter) に戻す「エンコード解除」する場所です。したがって、Q1に答えるには、同じオブジェクトではなく、コピーです(損失のあるコピーである可能性さえあります)。

Q2 に関しては、Spring にリクエストをオブジェクトにバインドするように依頼すると、Spring はリクエスト パラメータ名をオブジェクトのセッターに一致させようとするだけです。メソッド署名で要求したため、「知っています」。Spring は、引数を配置する順序が重要であるため、メソッド シグネチャの処理方法とそれを読む価値を決定する際に、いくつかの凝った処理を行います。

于 2012-08-24T01:27:24.163 に答える