Spring MVCでModelAndViewを使ってビューをブラウザに表示してみる(アノテーションなしの場合)


スポンサーリンク

まずはプロジェクトを作りましょう。
STS(Spring Tool Suite)を使って、
Spring Project > Simple Projects > Simple Spring Web Maven

でプロジェクトを作ります。

プロジェクトを作ると、デフォルトでWEB-INFの下にweb.xmlがあります。
自動で生成されたものには、以下のような記述があります。

    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

ここは、Spring MVCの設定ファイルの置き場所とその名前を定義しています。

もしこの定義がなければ、WEB-INF直下で、servlet-nameと同じ名前のファイルを置きます。
springwebというservlet-nameにした場合はspringweb-servlet.xmlをWEB-INF直下に置きます。

web.xmlはこんな感じです。
読み込み先の設定ファイルを指定している部分はコメントアウトしています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         id="WebApp_ID" version="2.5">

    <display-name>spring-web</display-name>
    
   <!--
		- Location of the XML file that defines the root application context.
		- Applied by ContextLoaderListener.
	-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/application-config.xml</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    
    <!--
		- Servlet that dispatches request to registered handlers (Controller implementations).
	-->
    <servlet>
        <servlet-name>spring-web</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--  
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        -->
    </servlet>

    <servlet-mapping>
        <servlet-name>spring-web</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

web.xmlで指定していて、読み込まれるSpringの設定ファイルはこのとおりです。

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Uncomment and your base-package here:
         <context:component-scan
            base-package="org.springframework.samples.web"/>  -->


    <mvc:annotation-driven />

	<bean name="/friend_input.action"
		class="sample1.controller.InputFriendController" />
		
	<bean name="/friend_save.action"
		class="sample1.controller.SaveFriendController" />
		
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	        <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
	        <property name="prefix" value="/WEB-INF/view/" />
	        <property name="suffix" value=".jsp"/>
	</bean>
	

</beans>

フォルダ体系はこんな感じ。
f:id:sho322:20140830112736j:plain

では、実際にSpring MVCでこんな画面を表示してみます。
f:id:sho322:20140830112742j:plain
f:id:sho322:20140830112746j:plain

これ、今の時点では日本語を入れると文字化けします。
サーブレットの文字化けを防ぐにはfilterをかます必要があるのですが、それは別途説明します。
というか、もうこのブログのどっかに書いたかも。

まずはJavaのソースを見ていきます。

InputFriendController.java

package sample1.controller;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class InputFriendController implements Controller {
	private static final Log logger = LogFactory.getLog(InputFriendController.class);
	
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
		logger.info("InputFriendController called");
		return new ModelAndView("/jsp/FriendForm");
	}
}

以下のModelAndViewで、リクエストをFriendForm.jspのページに転送します。

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


SaveFriendController.java

package sample1.controller;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import sample1.domain.Friend;
import sample1.form.FriendForm;

public class SaveFriendController implements Controller {
	private static final Log logger = LogFactory.getLog(SaveFriendController.class);
	
	public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
		logger.info("SaveFriendController called");
		FriendForm friendForm = new FriendForm();
		friendForm.setName(req.getParameter("name"));
		friendForm.setAge(req.getParameter("age"));
		friendForm.setInterest(req.getParameter("interest"));
		
		Friend friend = new Friend();
		friend.setName(friendForm.getName());
		friend.setAge(friendForm.getAge());
		friend.setInterest(friendForm.getInterest());
		
		return new ModelAndView("/jsp/FriendDetails", "friend" , friend);
		
	}
}

Friend.java

package sample1.domain;

public class Friend {
	private String name;
	private String age;
	private String interest;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getInterest() {
		return interest;
	}
	public void setInterest(String interest) {
		this.interest = interest;
	}
	
	
}


FriendForm.java

package sample1.form;

public class FriendForm {
	private String name;
	private String age;
	private String interest;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getInterest() {
		return interest;
	}
	public void setInterest(String interest) {
		this.interest = interest;
	}
	
}

次に、JSPを見てみます。
FriendForm.jsp

<%@ page contentType="text/html" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>友人を追加</title>
<style type="text/css">@import url(css/main.css)</style>
</head>
<body>
<div id="global">

<form action="friend_save.action" method="post">
  <fieldset>
    <legend>友人を追加</legend>
    <label for="name">名前:</label>
    <input type="text" id="name" name="name" value="" tabindex="1">
    
    <label for="age">年齢:</label>
    <input type="text" id="age" name="age" tabindex="2">
    
    <label for="interest">趣味:</label>
    <input type="text" id="interest" name="interest" tabindex="3">
    <div id="buttons">
      <label for="dummy"> </label>
      <input id="reset" type="reset" tabindex="4">
      <input id="submit" type="submit" tabindex="5"  value="友人を追加する">
    </div>
  </fieldset>
</form>
</div>
</body>
</html>

FriendDetails.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>友達を保存</title>
<style type="text/css">@import url(css/main.css);</style> 
</head>
<body>
<div id="global">
  <h4>友達の情報は保存されました</h4>
  <p>
    <h5>詳細:</h5>
    名前:${friend.name}
    年齢:${friend.age}
    興味:${friend.interest}
  </p>
</div>
</body>
</html>


参考文献(Preference):

Spring MVC: A Tutorial

Spring MVC: A Tutorial

Spring Framework 4プログラミング入門

Spring Framework 4プログラミング入門