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