MVCフレームワーク

今まで使用してきた、建築アプリをWebアプリに変更し、SpringMVCフレームワークを使用する。
強引にWebアプリに変換したので、クラス名と役割が滅茶苦茶ですが、とりあえず目をつぶる。
使用サーバ

  • Tomcat5.0.30

概念図

実装するのは「IndexControler」と「JSP」のみ。

beans設定ファイル概念図 ※赤色は新規作成


変更or新規作成ファイル

ファイル構成

Webアプリ化に伴いファイルの構成を以下のように変更

SpringWebApp
│  
│  
│  jp.co.springtest.model-prefs.properties
│  middlegen-build.xml
│
├─jsp
│      index.jsp
│
├─META-INF
│      MANIFEST.MF
│
│
└─WEB-INF
    │  construct-servlet.xml
    │  DaoBeans.xml
    │  DatabaseBeans.xml
    │  MVCsetting.xml
    │  ServiceBeans.xml
    │  ServiceBeans2.xml
    │  web.xml
    │
    ├─classes
    │  └─jp
    │      └─co
    │          └─jjjjpppp
    │              └─springtest
    │                  │  HouseMaker.class
    │                  │  messages_ja_JP.properties
    │                  │  messages_ja_JP.properties.jp
    │                  │
    │                  ├─controller
    │                  │      IndexController.class
    │                  │
    │                  ├─dao
    │                  │  │  ContractDao.class
    │                  │  │
    │                  │  └─impl
    │                  │          ContractDaoImpl.class
    │                  │
    │                  ├─model
    │                  │      Company.class
    │                  │      Company.hbm.xml
    │                  │      Contract.class
    │                  │      Contract.hbm.xml
    │                  │      User.class
    │                  │      User.hbm.xml
    │                  │      Work.class
    │                  │      Work.hbm.xml
    │                  │
    │                  └─service
    │                      └─impl
    │                              ConstructionCompany.class
    │                              IventCatcher.class
    │                              LoggingAdvice.class
    │                              Main.class
    │                              Man.class
    │                              Oobayashigumi.class
    │
    └─lib
            asm.jar
            cglib-2.1.jar
            commons-collections-2.1.1.jar
            commons-dbcp-1.2.1.jar
            commons-lang-2.0.jar
            commons-logging-1.0.4.jar
            commons-pool-1.2.jar
            dom4j-1.6.jar
            ehcache-1.1.jar
            geronimo-spec-jta-1.0.1B-rc2.jar
            hibernate3.jar
            j2ee.jar
            jstl.jar
            log4j-1.2.9.jar
            spring-1.2.6.jar
            spring-1.3-dev-20050915.jar
            spring-mock-1.2.6.jar
            standard.jar
web.xml

拡張子htmlへのリクエストはリクエストの割り振り機能Dispatcherに任せるように設定。
ここでDispatcherのservlet-nameをconstructとすると、Springはデプロイ時にconstruct-servlet.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>
	springWebApp</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	
	<servlet>
		<servlet-name>construct</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>construct</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
</web-app>
construct-servlet
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <import resource="DaoBeans.xml" />
    <import resource="DatabaseBeans.xml" />
    <import resource="MVCsetting.xml" />
    <import resource="ServiceBeans.xml" />
    <import resource="ServiceBeans2.xml" />
</beans>
MVCsetting.xml

MVCを実現する為に必要な、beanの指定。指定、実装が必要なのは「Controller」のみ、その他はデフォルトのクラスが適応される。
nameにindex.htmlを指定すると、index.htmlのリクエストをDispatcherがIndexControllerクラスに委譲する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	
	<!-- HandlerMapping -->
	<!-- 定義なし -->
	
	<!-- Controller -->
	<bean id="indexController" name="/index.html" class="jp.co.jjjjpppp.springtest.controller.IndexController">
		<property name="houseMaker"><ref bean="oobayashi" /></property>
	</bean>
	
	<!-- ViewResolver  -->
	<!-- 定義なし -->
	
</beans>
IndexController

リクエストを受けると、Contractテーブルの全レコードをDispatcherに返却。Viewには/jsp/index.jspを指定する。

package jp.co.jjjjpppp.springtest.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import jp.co.jjjjpppp.springtest.HouseMaker;


import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class IndexController implements Controller{

	private HouseMaker houseMaker;
	
	/**
	 * @param houseMaker the houseMaker to set
	 */
	public void setHouseMaker(HouseMaker houseMaker) {
		this.houseMaker = houseMaker;
	}

	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// 商品一覧情報を取得
		List itemList = this.houseMaker.createHouse();
		
		// モデルの作成
		Map model = new HashMap();
		model.put("itemList", itemList);
		
		// 戻り値となるModelAndViewインスタンスを作成
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("/jsp/index.jsp");
		modelAndView.addAllObjects(model);
		
		return modelAndView;
	}
}
index.jsp
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%@ page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<link rel="stylesheet" type="text/css" href="css/shopping3-1.css">
<html>
<head>
	<title>契約一覧画面</title>
</head>
<body>
	<div align="center" class="body">
	<h2>契約一覧画面</h2>
	<table border="1">
		<tr class="header">
			<th align="center" width="80">契約ID</th>
			<th align="center" width="300">工事名</th>
			<th align="center" width="300">工事会社</th>
		</tr>
	<c:forEach items="${itemList}" var="contract">
		<tr class="record">
			<td align="center">
				<c:out value="${contract.contractId}" />
			</td>
            <td align="center">
				<c:out value="${contract.work.name}" />
			</td>
			<td align="center">
				<c:out value="${contract.company.name}" />
			</td>
		</tr>		
	</c:forEach>
	</table>
	</div>
</body>
</html>
実行結果

無事動きました。

注意点

実行時に「属性itemsはどんな式も受け付けません。」と言うエラーが起きてはまった。
Servretのバージョンと、jstlのバージョンによるエラーらしい。
下記ページをみて解決した。多謝
http://blog.goo.ne.jp/nokonoko2006/e/3f28e2fea15f9d958e1860abb9f22663