Spring Web MVC frameworkとはSpringが提供するWebアプリのためのフレームワークで、
名前のとおりMVCモデルを採用している。
基本的な処理の流れは、以下のようになっている。
これからいくつかサンプルを作って動かしてみることにする。
サンプルの開発はEclipseで行うことにする。
開発環境は以下のとおり。
Eclipseでサンプル作成用のTomcatプロジェクトを作成する。
プロジェクト名 | springapp |
---|---|
アプリケーションURI | /springapp |
プロジェクトフォルダに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-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の画面が表示されることを確認する。
1つ目のサンプルとしてメニュー画面を作ってみる。
メニューに表示される項目はモデルとしてコントローラから返すように設計してみる。
先にurlやコントローラ名などを以下のように決めておく。
url | /menu.htm | urlは*.htmというパターンでサーブレットにマッピングするつもりなので、このようにした。 |
---|---|---|
コントローラ名 | menuController | Springから参照されるコントローラ名 |
コントローラクラス | com.ziqoo.web.controller.MenuController | コントローラ名が示す実際のクラス |
JSPファイル | WEB-INF/jsp/menu.jsp | メニュー画面を表示するJSPファイル |
プロジェクトのWEB-INF/libフォルダに以下のjarファイルをコピーし、
ビルドパスを通す。
コピー元はSpring frameworkをダウンロード、展開したフォルダからの相対パスだ。
jarファイル名 | コピー元フォルダ |
---|---|
spring.jar | dist |
commons-logging.jar | lib\jakarta-commons |
log4j-1.2.14.jar | lib\log4j |
jstl.jar | lib\j2ee |
standard.jar | lib\jakarta-taglibs |
ログ用のプロパティファイル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ファイルにフレームワークのサーブレット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>
設定ファイルをWEB-INFフォルダに作成する。
設定ファイルの名称はサーブレット名をspringappとしたので、
springapp-servlet.xmlとなる。
内容はまだ記述しない。
メニュー項目に相当する、MenuItemクラスを作成する。
このクラスはメニューに表示する文字列とリンク先を保持する。
ソースファイルは以下のとおり。
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のリストを持たせておき、
戻り値として返すようにする。
ソースの内容は以下のとおり。
/** * */ 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);のように返している。
作成したコントローラを先に決めたmenuControllerという名前でSpringへ登録する。
同時に、このコントローラが持っているmenuItemListの中身もSpringでセットしてしまう。
そのために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という名前で作成する。
内容は以下のとおり。
<%@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へリダイレクトさせる。
<%@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/へアクセスし、メニュー画面が表示されることを確認する。
コントローラの戻り値で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>
springapp-servlet.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にリスナーを定義する。
<?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>