nkimraの日記

技術的なメモのブログ。

Spring MVCのレスポンスの確認

環境
MacOS X Yosemite 10.10.3
Eclipse4.4 Luna
Java8
Spring MVC 4.1.6

Spring MVCJSPXMLJSON、テキストでコントローラのレスポンスの実装方法を確認する。
まずMavenのpom.xmlを次のように設定する。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>spring.test</groupId>
  <artifactId>spring-response</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>spring-response Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <properties>
    <spring.version>4.1.6.RELEASE</spring.version>
    <jackson.version>2.5.2</jackson.version>
    <servlet.version>3.1.0</servlet.version>
    <jaxb.version>2.1</jaxb.version>
  </properties>
  <dependencies>
    <dependency> 
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- Spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <!-- Jackson -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>${servlet.version}</version>
    </dependency>
    <!-- jaxb -->
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>${jaxb.version}</version>
    </dependency>
    <dependency>
        <groupId>javax.xml</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>${jaxb.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>spring-response</finalName>
  </build>
</project>

/src/main/webapp/WEB-INF/dispacherServlet-servlet.xmlを作成

<?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:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
    <context:component-scan base-package="controller" />
    <mvc:annotation-driven />
    <mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
</beans>

テスト用のbeanクラス(/src/main/bean/SampleBean.java)を次のように作成した。

package bean;

public class SampleBean {
    /** id */
    private int id;

    /** name */
    private String name;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

まずRestControllerの動作を確認するためControllerクラスを2つ作成した。
/src/main/java/controller/ResponseController.java
textメソッドは文字列、xmlメソッドXMLjsonメソッドJSONで返す。

package controller;

import java.io.StringWriter;
import javax.xml.bind.JAXB;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import bean.SampleBean;

@RestController
public class ResponseController {
    @RequestMapping("/text")
    public String text() {
        return "hello world";
    }

    @RequestMapping(value = "/xml", produces = MediaType.APPLICATION_XML_VALUE)
    public String xml() {
        SampleBean bean = new SampleBean();
        bean.setId(0);
        bean.setName("hoge");
        StringWriter sw = new StringWriter();
        JAXB.marshal(bean, sw);
        StringBuffer sb = sw.getBuffer(); 
        String finalstring = sb.toString();
        System.out.println(finalstring );
        return finalstring ;
    }

    @RequestMapping(value = "/json")
    public SampleBean json() {
    	SampleBean bean = new SampleBean();
    	bean.setId(0);
    	bean.setName("hoge");
        return bean;
    }
}

これでTomcatを起動し次のようにURLを指定すれば指定のフォーマットで表示される。

localhost:8080/spring-response/json

なお、XMLの場合はJAXB、JSONの場合はJacksonが必要。

次に画面の出力の動きを確認するためHelloController(/src/main/java/controller/controller/HelloController.java)を作成。

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
    @RequestMapping(value = "/hello")
    public String hello() {
        // return view name
        return "hello";
    }
}

画面サンプル用のjsp(/src/main/webapp/WEB-INF/hello.jsp)を作成する

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
Hello world!!

ブラウザで以下のURLを開き画面上に「Hello world!!」と表示されば成功。
http://localhost:8080/spring-response/hello

今回テストしたGithubソースgithub.com