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にリクエスト。