MVCフレームワーク2

前回作成したWebアプリケーションに変更を加えた。

変更点

  • 画面を1画面新規作成(一覧画面から契約IDを押下すると詳細ページに飛ぶように追加)
  • HandlerMappingのクラス変更。暗黙的に使用されるBeanNameUrlHandlerMappingクラスから、明示的に指定しSimpleUrlHandlerMappingクラスに変更。
  • 新規作成したControllerクラスをControllerインターフェースの実装から、AbstractControllerクラスの継承に変更、これによりキャッシュの有効時間など指定できる。(なんのキャッシュ???)
  • InternalResourceViewResolverクラスを明示的に指定し、ビューへのパスのprefix、suffixを指定。viewClassにJstlViewを指定(jstlタグからSpringのメッセージリソースにアクセスできるらしい)

変更ソース

MVCsetting.xml

HandlerMapping,ViewResolverを明示的に指定。HandlerMappingのクラスを変更。これにより、リクエストの割り振りをmappingsプロパティで一元的に管理することが可能に。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
	
	<!-- HandlerMapping -->
	<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/index.html">indexController</prop>
                <prop key="/detail.html">detailController</prop>
            </props>
        </property>
    </bean>
	
	<!-- Controller -->
	<bean id="indexController" class="jp.co.jjjjpppp.springtest.controller.IndexController">
		<property name="houseMaker"><ref bean="oobayashi" /></property>
	</bean>
	<bean id="detailController" class="jp.co.jjjjpppp.springtest.controller.DetailController">
		<property name="houseMaker"><ref bean="oobayashi" /></property>
		<property name="cacheSeconds"><value>30</value></property>
	</bean>
	
	<!-- ViewResolver -->
	<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass">
			<value>org.springframework.web.servlet.view.JstlView</value>
		</property>
		<property name="prefix">
			<value>/jsp/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean> 
</beans>
DetailController(新規作成)

一覧画面で押下された、契約IDを受け取りそのモデルを検索しviewに渡す。
スプリングのクラスにwebリクエストのユーティリティクラスがあるみたいだ(org.springframework.web.bind.RequestUtils)

package jp.co.jjjjpppp.springtest.controller;

import java.util.HashMap;
import java.util.Iterator;
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 jp.co.jjjjpppp.springtest.model.Contract;


import org.springframework.web.bind.RequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import org.springframework.web.servlet.mvc.Controller;

public class DetailController extends AbstractController{

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

	public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		//リクエストパラメータ
		Integer contractId = RequestUtils.getIntParameter(request, "contractId");
		
		// 商品一覧情報を取得
		List itemList = this.houseMaker.createHouse();
		
		// モデルの作成
		Map model = new HashMap();
		
		Iterator it = itemList.iterator();
		while(it.hasNext()){
			Contract contract = (Contract) it.next();
			if(contract.getContractId().equals(contractId)){
				model.put("contract", contract);
			}
		}
		
		
		// 戻り値となるModelAndViewインスタンスを作成
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("detail");
		modelAndView.addAllObjects(model);
		
		return modelAndView;
	}
}
index.jsp

予約IDをdetail.htmlへのリンクに変更。そのさいURLにリクエストパラメータ予約IDを含める。

変更点のみ抜粋

<c:forEach items="${itemList}" var="contract">
		<tr class="record">
			<td align="center">
				<a href="detail.html?contractId=<c:out value="${contract.contractId}" />">
					<c:out value="${contract.contractId}" />
				</a>
			</td>
            <td align="center">
				<c:out value="${contract.work.name}" />
			</td>
			<td align="center">
				<c:out value="${contract.company.name}" />
			</td>
		</tr>		
	</c:forEach>
detail.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>
			<th align="center" width="300">発注者</th>
		</tr>
		<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>
			<td align="center">
				<c:out value="${contract.user.name}" />
			</td>
		</tr>		
	</table>
	<a href="index.html">一覧にもどる</a>
	</div>
</body>
</html>

実行結果

実際に動かしてみます。
http://localhost:8080/springWebApp2/index.htmlにリクエスト。

一覧画面が出ます。そこで契約ID7をクリック。

詳細画面にとばされてOK