石橋 稔章(いしばし としあき)

株式会社DTS ネットワーク事業本部所属。金融機関向けのフレームワークの開発・保守,プロジェクト支援に携わる。

 これまで,4回にわたって,SpringMVCの解説をしてきました。SpringMVCを利用したことがない方々は,少しでもSpringMVCを利用するイメージを感じていただけたでしょうか? 一方,SpringMVCを利用したことがある方には,少しでも役立つ情報があったと感じていただければうれしく思います。

 さて,SpringMVCの締めくくりとして,本稿から2回にわたり,これまで紹介できていない,SpringMVCを利用するうえで知っておくと役立つと思われる事柄を,Hints&Tips形式で紹介します。動作確認は,Spring 2.5で行いました。

 紹介する内容は,以下の通りです。このうち,前編では1~4について紹介します。

  1. 日付の扱い方
  2. 例外の扱い方
  3. PDFを作成して表示したい
  4. リクエスト・パラメータのエンコードを指定する
  5. セッション情報の取り扱い
  6. アノテーションで設定ファイルを簡略化する

1. 日付の扱い方

 SpringMVCで,日付の情報を扱うには二つの方法があります。画面からの情報を文字列(String型)としてコマンドクラスで保持する方法と,日付型(Date型)としてコマンドクラスで保持する方法の二つです。

 日付処理(月末の曜日を求める,日付を比較するなど)が多い場合は,日付型で値を保持していたほうが何かと便利です。

 文字列で持たせた場合は,図1のような流れになります。(1)画面から日付の情報を文字列としてコマンドクラスで保持します。(2)これを,ビジネス・ロジックなどで利用するときは,コマンドクラスから文字列を取得します。(3)日付型で情報が必要になったら手動で変換を行います。通常は,業務ロジックなどで変換しなければなりません。

図1●日付を文字列として保持させた場合
図1●日付を文字列として保持させた場合

 一方,日付型で持たせた場合は,図2のような流れになります。(1)画面から日付の情報を日付型としてコマンドクラスで保持します。(2)ビジネス・ロジックなどで利用するときは,日付型で取り出します。日付処理が必要な場合は,日付型のまま処理を行うことができます。

図2●日付を日付型として保持させた場合
図2●日付を日付型として保持させた場合

 コマンドクラスに文字列として,情報を保持させるには,String型を利用するだけで実現できます。しかし,コマンドクラスに日付型として情報を保持させるには,Date型を利用するだけではダメです。Date型を使用すると,デフォルトではエラーが発生します。Date型を使用するには,別途設定が必要になります。

 Date型は,CustomDateEditorクラスを使用して設定します。使い方は,SimpleFormControllerクラスなどを実装したコントローラ・クラスで,initBinderメソッドをオーバーライドします。ソースとしては,リスト1のようになります。initBinderメソッドは,BaseCommandControllerクラスのメソッドです。

@Override
protected void initBinder(HttpServletRequest request,
        ServletRequestDataBinder binder) throws Exception {
    DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
    CustomDateEditor editor = new CustomDateEditor(df, true);
    binder.registerCustomEditor(Date.class, editor);
}
リスト1●initBinderメソッドの拡張例

 設定は,ServletRequestDataBinderクラスのカスタム・エディタを登録するメソッドregisterCustomEditorに,変換する型とCustomDateEditorクラスのインスタンスを設定するだけです。

 CustomDateEditorクラスをnewするときの二つ目の引数には,入力データがない場合を許容するかどうかを指定します。trueの場合は許容します。

 上記設定を行うことで,SpringMVCのコマンドクラスにDate型を利用できるようになります。ただし,入力画面からのデータが正しくない場合は,エラー・メッセージを表示するなどの対処が必要になります。

 入力画面のJSPで,エラー・メッセージを表示させるようにはリスト2のようにします。

<%@ page language="java" contentType="text/html; charset=Windows-31J"
    pageEncoding="Windows-31J"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>Property Editor Sample</title>
</head>
<body>
   <form:form commandName="peCommand" >
       日付 : <form:input path="date" />
       <font color="red"><form:errors path="date" /></font>
       <input type="submit" />
   </form:form>
</body>
</html>
リスト2●入力画面のJSP

 エラー・メッセージを表示させるには,SpringMVCが提供するform:errorsタグを利用します。入力した情報にエラーがある場合は,エラーを表示してくれます。

 日付は,文字列でも日付型でも扱えます。二つの違いは,どこで日付型に変換するかの違いです。文字列の場合は,特別な設定は不要ですが,ビジネス・ロジックなどで日付型に変換する必要があります。逆に,日付型の場合は,ビジネス・ロジックなどでの変換は不要ですが,コマンドクラスに保持する際に特別な設定をしなければなりません。二つの違いを意識して,どちらにするか決めてください。