JavaのWebアプリケーション開発フレームワークによる、Webサイト開発の顛末記です。

EclipseのMavenを使った、Spring-MVC、Thymeleaf、MyBatis 等のプログラミングテクニックを、
備忘録的に記録しています。実際に動くソースコードを多用して説明していますので、
これからEclipseや、Spring-MVCを始めたいと思っている人にとって、少しでも参考になれば幸いです。
■SpringMVC の小径 第6歩 Spring-MVC 大きな一歩
6-2)パラメータリクエスト
パラメータのレスポンスに続いて、今度はviewからサーブレットへのパラメータリクエスト
のサンプルを作ってみます。
名前を入力してsubmitするとサーブレットに名前のパラメータをリクエストし、
その結果を表示する。というシンプルな画面です。
Hello.javaを引き続き少し改造してみます。
新しい問い合わせ画面 whoareyou.htmlを作成します。
結果表示画面 hello.htmlはそのまま使用します。
src/main/java/jp/dip/arimodoki/cntl/Hello.java(修正)

先ほどのHello.javaに少し付け加えました。
⑥@RequestParamリクエストパラメータの追加
  HTMLから入力されたリクエストパラメータをこの変数で受け取ります。
  ()の中の文字列は、呼び出し元画面(whoareyou.html)の要素名(input name="myname")です。

System.out.println デバッグ文の追加
  受け取ったパラメータの中身をデバッグしてみます。

model.addAttribute リクエストパラメータ値のセット
  固定文字で返していたのを、リクエストパラメータで受け取った文字を返すように修正。
WebContent/whoareyou.html(追加)

WebContent/hello.html と同じ場所に新規追加します。
これは、普通のHTMLで特筆すべきコメントはありませんが、
強いて挙げるとすれば、submit先のサーブレットが、hell.xhtml ということです。

 

では、これを実行してみましょう。
Eclise「サーバービュー」でローカルサーバーを起動し、
ブラウザのURLに「http://localhost:8080/j_Labo/whoareyou.html」を入力します。
Who are You ?
お名前に何か入力して「回答」ボタンをクリックします。
おいらは、あいんしゅたいん だじょ
どうですか?
ブラウザから入力した文字列が、リクエストパラメータとしてサーブレットで処理され
結果画面に表示されました。
デバッグ文を入れておいたので、Eclipse「コンソールビュー」でログを確認してみましょう。
パラメータ内容出力
いかがでしたか?
HTMLからサーブレットへのパラメータリクエスト、そしてそれをviewへパラメータレスポンス。
これで、Spring-MVC/Thymeleafによる一連の基本的処理は完成しました。

でも、ちょっと待ってください。
一つ、質問があります。
コントローラメソッドの引数ですが、なんか好き勝手に引数が追加されているみたいなんですが、
指定できる引数の型とか、個数とか、順番とかルールってあるんでしょうか?
良い質問です。
コントローラメソッドの引数に関しては、一定のルールを守れば
型とか個数とか順番とかは自分で自由に決められます。
例えば、このサンプルで名前のほかに年齢もリクエストしたいような場合は、

@RequestMapping(value = "/hello")
  public String hello_view(
    @RequestParam("myname") String myname,  //名前
    @RequestParam("age") int age,  //年齢
    Model model  //Spring-MVC標準データモデルです
  ) {
のように、age引数を追加すれば、viewからリクエストされた年齢を、ageで受け取ることができます。

引数に指定できる型の種類には、様々な型を指定することが可能です。
具体的には、すでに出現している、Model、@RequestParam以外にも
@Valid:リクエストパラメータを受け取る際に、入力チェックを行うアノテーション
@ModelAttribute:自分で作ったデータモデルBeanを受け取るためのアノテーション
BindingResult:入力チェックでの入力エラー情報を格納する型

@PathVariable:リクエストパスの後ろに付加してリクエストする際のパラメータ。
         http://localhost:8080/jLabo/xxxxx.xhtml/100
         「100」を受け取りたいような場合に使用する。
HttpSession:伝統的なJavaServletの HttpSession
HttpServletRequest:伝統的なJavaServletの HttpServletRequest
HttpServletResponse:伝統的なJavaServletの HttpServletResponse
など、調べればもっと他にもあるはずですが、だいたいこれぐらい挙げておけば十分だと思います。
この内、上の青字の引数に付いては、ある場面でこの順番で指定する必要がありますが、
(この後の散策で具体例が出てくると思います)
この一部の例外を除いては引数の順番についても自由です。
viewからのリクエストの種類を、必要に応じてこれらの引数で適切に受け取ることが可能です。
便利な反面、初めての人にとっては道に迷いやすい所ではあります。

どうしてこんなことができるかと言えば、このクラスを良く見ると
@Controllerとか、@RequestMappingとかで、艶めかしくお化粧しているので惑わされてしまいますが、
これらのアノテーションを洗い落として素顔を見てみるとどうでしょう?
打って変わって純真無垢なPOJO(Plain Old Java Object)の、素朴なクラスになってしまいますね?
POJOなクラスメソッドですから、メソッドの引数は自分で自由に決められて当たり前。
言い換えると、Spring-MVCに気に入られるために、アノテーションで着飾っていますが、
主導権はコントローラメソッドの方が握っています。
コントローラメソッドが指定した引数に合わせて、Spring-MVCが頑張ってリクエストパラメータを
運んできてくれるわけです。

人間関係に例えていうと、
夫の「Spring-MVCさん」と、妻の「コントローラさん」という夫婦がおり
夫は亭主関白を気取って、「いつもきれいでいろよ。」とか偉そうにしてますが、 奥さんに、
お願い。ゴミ出しといてねぇ(viewレスポンス依頼)とか。
メモ渡しとくから、帰りに買い物してきてぇ~(^ε^)-☆Chu!!。(リクエストパラメータ格納依頼)とか
あまぁ~い声でお願いされると、ほぃほぃ言うことを聞いてしまう。
どう見ても、奥さんの掌の上でコロコロと転がし回わされている、
甘い中にもどこか哀愁漂う若夫婦。という人生模様によく似ています。