スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC リクエストパラメータ格納オブジェクトの検証

Spring MVCで、StrutsでいうところのActionFormのようなリクエストパラメータを格納するオブジェクトを、
どのようにControllerクラスで生成すればよいか検証してみた。

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.3.RELEASE
  • Java 1.7
  • Tomcat 7.0

検証用として3パターンのControllerを用意し、入力画面文字列を返すindexメソッドを対象とした。
リクエストパラメータを格納するBookFormにはすべて文字列型の「bookId」「bookName」「price」のフィールド名とgetter/setterメソッドを定義している。

■Controllerのパターン
1.引数に格納オブジェクトを定義する場合
2.@ModelAttributeアノテーションを使う場合(その1)
3.@ModelAttributeアノテーションを使う場合(その2)

なお、JSPのformタグは以下の通り。modelAttribute属性を「bookForm」としている。


<form:form
action="${pageContext.request.contextPath}/book/create"
method="post" modelAttribute="bookForm">
<form:label path="bookId">bookId</form:label>
<form:input path="bookId"/><br>
<form:label path="bookName">bookName</form:label>
<form:input path="bookName"/><br>
<form:label path="price">price</form:label>
<form:input path="price"/><br>
<input type="submit" value="Create"/>
</form:form>


1.引数に格納オブジェクトを定義する場合

@Controller
@RequestMapping("book")
public class BookController {

  @Autowired
  protected BookService bookService;

@RequestMapping(method = RequestMethod.GET)
public String index(BookForm book) {
return "newBook";
}

@RequestMapping(value = "create", method = RequestMethod.POST)
public String create(BookForm book, Model model) {
//TODO bookServiceより返却されたBookオブジェクトをmodelに追加する
return "result";
}
}

indexメソッドの引数にBookFormオブジェクトを定義しただけで、どこにもBookFormを生成したコードが存在しない。
しかし、これでうまくいくのだ。逆に、index()のように引数に定義しない場合、「HTTPステータス 500 - java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'bookForm' available as request attribute」が発生する。引数に定義することで、BookFormオブジェクトが自動的に生成されていることが分かる。

2.@ModelAttributeアノテーションを使う場合(その1)
indexメソッドの引数に「@ModelAttribute("testForm")」を追記する。


@RequestMapping(method = RequestMethod.GET)
public String index(@ModelAttribute("testForm") BookForm form) {
return "newBook";
}

結果は「HTTPステータス 500 - java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'bookForm' available as request attribute」が発生する。そこで、JSP formタグのmodelAttribute属性を以下のように「bookForm」から「testForm」に書き換える。

<form:form
action="${pageContext.request.contextPath}/book/create"
method="post" modelAttribute="testForm">

これでうまくいく。「①引数に格納オブジェクトを定義する場合」では@ModelAttributeを記載していないが、型の先頭を小文字にした@ModelAttribute("bookForm")が省略されているとも言えそうだ。(細かいが変数名が対象ではない。)

3.@ModelAttributeアノテーションを使う場合(その2)


@ModelAttribute
public BookForm initForm() {
BookForm form = new BookForm();
return form;
}

@RequestMapping(method = RequestMethod.GET)
public String index() {
return "newBook";
}

最後は@ModelAttributeアノテーションをメソッドに付与する方法になるが、これもうまくいく。
先に紹介した「1」「2」は、indexメソッド内の処理で使われていないため、なぜ引数に定義しているのか分かりづらい。一方、この「3」は違和感がなく、誰が見ても理解してもらえそうだ。

■過去のSpring関連記事
Spring関連記事 Index



SpringMVCの理解が進むと、引数に定義するだけでよい「1」「2」が便利であることが分かってくる。以降のサンプルは「1」「2」の記述方法で進める。

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。