Springを使ったWebアプリケーション1

環境

spring framework 1.2
Tomcat 5.0
Eclipse3.0.1

フォルダ構成

springapp
 +-webapps
   +-WEB-INF
     +-jsp…JSPはここに置く
     +-lib…ライブラリファイル関連
     +-src…ソースコード
     +-classes…ビルドフォルダ
     +-springapp-servlet.xml…bean定義ファイル
     +-applicationContext.xml…bean定義ファイル

とりあえず、[サーブレット名]-servlet.xmlとapplicationContext.xmlの区別が良くわからん。今回はコントローラー関連はspringapp-servlet.xml。springに依存しなそうなモデルや、ビジネスオブジェクト関連はapplicationContext.xmlにしておく。

Hello Spring

定番のアレ。
なにはともあれ、まずはサーブレットをweb.xmlに定義しないと。ついでにapplicationContext.xmlをロードするContextLoaderListenerも。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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>*.html</url-pattern>
  </servlet-mapping>
</web-app>

とりあえず、Controllerインタフェースをそのまま実装する方向で。

spring.sample.HelloController.java

package spring.sample;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class HelloController implements Controller {
    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        return new ModelAndView("/WEB-INF/jsp/helloSpring.jsp");
    }
}

/WEB-INF/jsp/helloSpring.jsp

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<html>
  <head>
    <title>Spring Application</title>
  </head>
  <body>
    <h1>Hello Spring!</h1>
  </body>
</html>

/WEB-INF/jsp/include.jsp

<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>

作ったコントローラを登録する。

springapp-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
    <bean id="helloSpringController" class="spring.sample.HelloController"/>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.html">helloSpringController</prop>
            </props>
        </property>
    </bean>
</beans>

http://localhost:8080/springapp/hello.html
にアクセスすると。。


でました。

ふむふむ。超ショボイですね。まあ、今のところControllerを生で実装してるのでこんな感じでしょうか。。
とりあえず、

return new ModelAndView("/WEB-INF/jsp/helloSpring.jsp");

では、さすがに酷すぎるのでちょっと手を入れてみます。そこで使ってみるのは、ViewResolverです。
ModelAndViewの第一引数がView名なんだけど、論理的なView名から物理的なリソースパスへ変換するわけですね。
springapp-servlet.xmlに登録しまする。

springapp-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!--  - Application context definition for "springapp" DispatcherServlet.  -->
<beans>
    <bean id="helloSpringController" class="spring.sample.HelloController"/>
    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/hello.html">helloSpringController</prop>
            </props>
        </property>
    </bean>
    <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>

使用しているViewクラスがJstlViewで、プリフィックスサフィックスが指定できる。というわけで、上記の設定。結局コントローラから物理的なファイル名から拡張子を除いたものを返さなければならないけど、上の要領で拡張したクラスを登録すればどうとでもできると言うわけですね。
これに合わせてコントローラを変更。

spring.sample.HelloController.java

package spring.sample;

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

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

public class HelloController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        return new ModelAndView("helloSpring");
    }

}