Spring カスタムタグ

先週、LoginCtrl.java の説明で、「UserBean userBean = (UserBean)aCommand;」という文を
説明しました。これは、HTMLのformから UserBeanに値を自動でセットする 自動バインディング機能
を使っていました。
HTML form → UserBean

ところで、ログインエラーになったときに、login.jsp の account欄と password欄が空欄に戻って
しまうのは、入力フォームとしてはイマイチな仕様で、入力エラーになった文字列をそのまま残して
おくのが親切というものです。
そこで今回は、UserBeanからHTML form に値をセットするSpring標準のタグの使いかたを紹介します。
HTML form ← UserBean

UserBeanの値を書き戻す

ログインエラーの時に、直前に入力した account と password の値を login.jspに渡す方法です。
springカスタムタグに必要なライブラリはspring-2.0-M4.jarに含まれているので、既に準備済みです。
ただし、springカスタムタグを効果的に使用するためには、JSTL の c タグを併用する必要があるので、
準備として、下記の依存関係を SpringWeb2 の pom.xml に追加してください。

LoginCtrl.javaで変数をセットする

login.jspにデータを表示させるには、ネタを仕込んでおく必要があります。
具体的には、下記のように、LoginCtrl.javaのonSubmit()で、ログイン失敗時に、getFormView()つまり
login.jsp に戻る直前に、aRequest.setAttribute( commandName, userBean ); で、userBeanを
HttpServletRequest.setAttribute() します。

ちなみに、super.getCommandName() で取り出す文字列は、"login" という文字列になります。
どこで定義したかというと、SpringWeb2-servlet.xml で、LoginCtrlの property=commandName に
定義しています。

なお、SpringMVCのチュートリアルなどでは、上記のログイン失敗時の3行を
nextPage = new ModelAndView( getFormView(), super.getCommandName(), userBean );
と記述していることがあります。
意味は、3行で書いても、1行で書いても同じなので、好みに合うほうを使ってください。

login.jspに カスタムタグを追加

次に、login.jspに以下のように修正を加えます。

2行目と3行目で springタグと cタグを使用する宣言を行っています。

さて、accountの入力欄を記述している箇所を見てみましょう。
「<spring:bind path="login.account">」と「</spring:bind>」で囲まれています。
これは、この範囲では、loginというオブジェクトの account というメンバ変数に関する処理を
行いますという意味になります。( login.getAcccount() の呼び出しだと思っていください)

ところで、loginというオブジェクトはどこでセットしたのでしょうか?
もうお分かりですね。LoginCtrl.java の onSubmit() に先ほど追記した箇所です。

status.value

最後に、<c:out value="${status.value}"/>"/>について説明します。
cタグについては、後ほど説明しますが、<c:out value="${○○}"/>"/>とは、
HttpServletRequest中の ○○という変数の値を表示するという意味です。

またまた疑問です。HttpServletRequestに stauts なんて変数を登録した覚えはないですね。
実は、「<spring:bind path="login.account">」を宣言すると、status.value という変数に
login.accountの値をセットします。

つまり「<spring:bind path="login.account">」と「</spring:bind>」の間では、
login.account == status.value の関係が成り立ちます。

準備完了

これで、ログインに失敗して login.jsp に戻ってきたときに、前回入力した値( UserBean )を
HTMLのform に埋め込む準備は完了です。

動作確認

SpringWeb2を mvn package して、tomcatを再起動してください。
わざと、login に失敗して、login.jsp に戻ってください。
今度は、入力値が残ったままですね。