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

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

 前回に引き続き,SpringMVCの締めくくりとして,SpringMVCを利用するうえで知っておくと役立つと思われる内容についてHints&Tips形式で紹介していきます。動作確認は,Spring 2.5を利用して行っています。

 後編で紹介するのは,以下の黒字部分のトピックです。

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

5. セッション情報の取り扱い

 SpringMVCでセッション情報を取り扱う方法について,Spring 2.0から追加されたセッション・スコープの使い方を紹介します。

 Spring 1.X系のときは,beanのスコープには,singletonとprototypeの2通りしか設定できませんでした。Spring 2.0からは,Webアプリケーション用のrequest,sessionおよびglobalSessionが追加されています。

 ここでは,ログイン処理の際にIDから取得したユーザー情報をスコープで定義されたJavaBeanに格納して,後で取り出して画面に表示するという実装例を示します。ざっくりとした処理の流れと画面イメージは,図1のようになります。青枠で書かれている部分をsessionスコープで保持します。なお,コマンドクラスや業務ロジック(UserServiceImpl,UserService)のソースは,今回重要でないため省略します。

図1●処理の流れと画面イメージ
図1●処理の流れと画面イメージ
[画像のクリックで拡大表示]

 まず,Web用のスコープを利用するには,Web.xmlに設定を追加する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>sessionSample</display-name>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/sample-servlet.xml</param-value>
</context-param>
<listener>
  <listener-class>
org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>
<listener>
  <listener-class>
    org.springframework.web.context.request.RequestContextListener
  </listener-class>
</listener>
<servlet>
  <servlet-name>sample</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>sample</servlet-name>
  <url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>
リスト1●Web.xml

 赤字部分は,Web用のコンテキスト(WebApplicationContext)を利用できるようにする設定です。<param-value>タグ指定した/WEB-INF/sample-servlet.xmlで,Web用のコンテキストが利用できるようになります。青字部分は,Web用のスコープを利用できるようにする設定です。

 次は,本題のbean定義ファイルの設定です。ソースは,リスト2のようになります。

<bean id="loginController"
  class="com.sample.LoginController" scope="session" autowire="byName">
  <property name="formView" value="login" />
  <property name="successView" value="menu" />
  <property name="commandName" value="loginCommand" />
  <property name="commandClass" value="com.sample.LoginCommand" />
</bean>
<bean id="userService" class="com.sample.UserServiceImpl" />

<bean id="userListController"
  class="com.sample.UserListController" scope="session" autowire="byName">
  <property name="formView" value="userList"/>
  <property name="commandClass" value="com.sample.UserListCommand" />
</bean>
<bean id="userBean" class="com.sample.UserBean" scope="session" />
リスト2●sample-servlet.xml

 bean定義ファイルでは,コントローラ(loginController,userListController)とuserBeanのスコープをsessionにしています。コントローラでは,userBeanを<property>タグで設定していませんが,autowire属性でbyNameを設定しているため,LoginControllerクラスやUserListControllerクラスにuserBeanのセッター(setUserBeanメソッド)があれば,自動的に設定してくれます。

 この機能をSpringのAutowire機能といいます。bean間の関連がわからなくなるという問題はありますが,設定ファイルの記述量を減らすのに役立ちます。