CONTENTS





Spring Web MVC frameworkとは

Spring Web MVC frameworkとはSpringが提供するWebアプリのためのフレームワークで、
名前のとおりMVCモデルを採用している。
基本的な処理の流れは、以下のようになっている。

  1. ブラウザよりWebアプリのURLへリクエストを投げる。
  2. フレームワークがURLに対応するコントローラを実行する。
  3. コントローラは必要な処理を行い、画面に対応するjspと画面内に表示するデータを返す。
  4. フレームワークはコントローラからの戻り値をもとに画面を表示する。

開発者はコントローラとそこから呼ばれるビジネスロジック、jspなどを作成することになる。

[TOPへ戻る]

開発環境構築

これからいくつかサンプルを作って動かしてみることにする。
サンプルの開発はEclipseで行うことにする。
開発環境は以下のとおり。

サンプル用プロジェクト作成

Eclipseでサンプル作成用のTomcatプロジェクトを作成する。
プロジェクト名springapp
アプリケーションURI/springapp

index.jsp

プロジェクトフォルダにindex.jspファイルを作成する。
内容は以下のとおり

<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
<title>springapp</title>

</head>
<body>
こんにちは
</body>
</html>

web.xml

WEB-INFフォルダにweb.xmlファイルを作成する。
内容は以下のとおり

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>

	<welcome-file-list>
		<welcome-file>

			index.jsp
		</welcome-file>
	</welcome-file-list>
</web-app></pre>

動作確認

プロジェクトをビルドし、Tomcatを起動する。
ブラウザからhttp://localhost:8080/springapp/にアクセスして、index.jspの画面が表示されることを確認する。


[TOPへ戻る]

サンプルその1(メニュー画面)

1つ目のサンプルとしてメニュー画面を作ってみる。
メニューに表示される項目はモデルとしてコントローラから返すように設計してみる。
先にurlやコントローラ名などを以下のように決めておく。

url/menu.htmurlは*.htmというパターンでサーブレットにマッピングするつもりなので、このようにした。
コントローラ名menuControllerSpringから参照されるコントローラ名
コントローラクラスcom.ziqoo.web.controller.MenuControllerコントローラ名が示す実際のクラス
JSPファイルWEB-INF/jsp/menu.jspメニュー画面を表示するJSPファイル

準備

ライブラリのコピー

プロジェクトのWEB-INF/libフォルダに以下のjarファイルをコピーし、
ビルドパスを通す。
コピー元はSpring frameworkをダウンロード、展開したフォルダからの相対パスだ。

jarファイル名コピー元フォルダ
spring.jardist
commons-logging.jarlib\jakarta-commons
log4j-1.2.14.jarlib\log4j
jstl.jarlib\j2ee
standard.jarlib\jakarta-taglibs

log4j.properties

ログ用のプロパティファイルlog4j.propertiesをWEB-INF/srcフォルダに作成する。
内容は以下のとおり

log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n

web.xmlの修正

web.xmlファイルにフレームワークのサーブレットDispatcherServletを
プロジェクト名と同じspringappという名前で定義する。
また、このサーブレットに対し、*.htmというパターンのURLをマッピングする。
内容は以下のとおり

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>

	<servlet>
		<servlet-name>springapp</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springapp</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>
			index.jsp
		</welcome-file>
	</welcome-file-list>

</web-app></pre>

SpringMVC設定ファイルの作成

設定ファイルをWEB-INFフォルダに作成する。
設定ファイルの名称はサーブレット名をspringappとしたので、
springapp-servlet.xmlとなる。
内容はまだ記述しない。

プログラミング

モデルの作成

メニュー項目に相当する、MenuItemクラスを作成する。
このクラスはメニューに表示する文字列とリンク先を保持する。
ソースファイルは以下のとおり。

WEB-INF/src/com/ziqoo/biz/menu/MenuItem.java
package com.ziqoo.biz.menu;

import java.io.Serializable;

public class MenuItem implements Serializable {
	// 項目名
	private String itemName;
	// リンク先
	private String href;
	
	public String getHref() {
		return href;
	}
	public void setHref(String href) {
		this.href = href;
	}
	public String getItemName() {
		return itemName;
	}
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	
}

コントローラの作成

メニュー画面を表示するコントローラクラスを作成する。
クラス名は先に決めたように、MenuControllerとする。
基本的なコントローラクラスを作成するためにはControllerインターフェースを実装し、
handleRequestメソッドに必要な処理を記述すればよい。
また、このクラスにはメニュー画面に表示するMenuItemのリストを持たせておき、
戻り値として返すようにする。
ソースの内容は以下のとおり。

WEB-INF/src/com/ziqoo/biz/menu/MenuItem.java
/**
 * 
 */
package com.ziqoo.web.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

/**
 *
 */
public class MenuController implements Controller {
	protected final Log logger = LogFactory.getLog(getClass());
	
	private List menuItemList;

	/* (non-Javadoc)
	 * @see org.springframework.web.servlet.mvc.Controller#handleRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
	 */
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		return new ModelAndView("WEB-INF/jsp/menu.jsp", "itemList", menuItemList);
	}

	public List getMenuItemList() {
		return menuItemList;
	}

	public void setMenuItemList(List menuItemList) {
		this.menuItemList = menuItemList;
	}

}

handleRequestメソッドでビューに相当するjspファイル名とモデルであるmenuItemListを

return new ModelAndView("WEB-INF/jsp/menu.jsp", "itemList", menuItemList);
のように返している。
ここで"itemList"はjspからこのモデルへアクセスする際の名前である。

コントローラの登録

作成したコントローラを先に決めたmenuControllerという名前でSpringへ登録する。
同時に、このコントローラが持っているmenuItemListの中身もSpringでセットしてしまう。
そのためにspringapp-servlet.xmlファイルの中身を以下のように記述する。

WEB-INF/springapp-servlet.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
    <bean id="menuController" class="com.ziqoo.web.controller.MenuController">
        <property name="menuItemList">
            <list>
                <ref bean="menuItem1"/>
                <ref bean="menuItem2"/>
                <ref bean="menuItem3"/>
            </list>
        </property>
    </bean>

    <bean id="menuItem1" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目1</value></property>
        <property name="href"><value>/item1.htm</value></property>
    </bean>
        
    <bean id="menuItem2" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目2</value></property>
        <property name="href"><value>/item2.htm</value></property>
    </bean>

    <bean id="menuItem3" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目3</value></property>
        <property name="href"><value>/item3.htm</value></property>
    </bean>
        
</beans>

さらに、このコントローラに対して、先に決めたurl
/menu.htmをマッピングする。これでブラウザからこのurlにアクセスするとMenuControllerクラスのhandleRequestメソッドが実行される。
springapp-servlet.xmlファイルに以下の記述を追加する。

    --- 省略 ---

    <bean id="menuItem3" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目3</value></property>
        <property name="href"><value>/item3.htm</value></property>
    </bean>
    
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/menu.htm">menuController</prop>
            </props>
        </property>
    </bean>
    
</beans>

ビューの作成

メニュー画面のjspをWEB-INF/jspフォルダにmenu.jspという名前で作成する。
内容は以下のとおり。

WEB-INF/jsp/menu.jsp
<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %>
<%@ page session="false"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
<title>springapp</title>
</head>
<body>
<div align="center">

<h3>メニュー</h3>
<hr>

<ul>
<c:forEach items="${itemList}" var="item">
	<li><a href="<c:out value="${item.href}"/>"><c:out value="${item.itemName}"/></a>
</c:forEach>
</ul>

<hr>
</div>
</body>
</html>

ついで、index.jspの内容を以下のように書き換えて、/menu.htmへリダイレクトさせる。

index.jsp
<%@page pageEncoding="Shift_JIS" contentType="text/html; charset=Shift_JIS" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>

<c:redirect url="/menu.htm"/>

動作確認

ブラウザよりhttp://localhost:8080/springapp/へアクセスし、メニュー画面が表示されることを確認する。

設定の修正

viewResolverの定義

コントローラの戻り値でjspファイルを"WEB-INF/jsp/menu.jsp"のように指定しているが、
これを"menu"のように省略して指定できるようにする。
まずMenuControllerのhandleRequestメソッドを以下のように修正する。

        return new ModelAndView("menu", "itemList", menuItemList);
次にspringapp-servlet.xmlに以下の記述を追加する。

    --- 省略 ---

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
           <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix"><value>/WEB-INF/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>

</beans>

applicationContext.xmlの作成

springapp-servlet.xmlファイルからモデルの定義を分離する。
そのため、WEB-INFフォルダにapplicationContext.xmlファイルを作成し、
ここへモデルの定義を移動する。
ファイルの内容は以下のとおり。

WEB-INF/applicationContext.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

    <!-- メニュー項目 -->
    <bean id="menuItem1" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目1</value></property>
        <property name="href"><value>/item1.htm</value></property>
    </bean>
        
    <bean id="menuItem2" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目2</value></property>
        <property name="href"><value>/item2.htm</value></property>
    </bean>

    <bean id="menuItem3" class="com.ziqoo.biz.menu.MenuItem">
        <property name="itemName"><value>項目3</value></property>
        <property name="href"><value>/item3.htm</value></property>
    </bean>
</beans>

springapp-servlet.xmlからは対応するbean定義を削除しておく
また、このファイルをSpringに読み込ませるために、web.xmlにリスナーを定義する。

WEB-INF/web.xml
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>springapp</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springapp</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>
  
  	<welcome-file-list>
		<welcome-file>
			index.jsp
		</welcome-file>
	</welcome-file-list>

</web-app>

[TOPへ戻る]