Logo_Spring_258x151
在這篇文章中主要會介紹如何透過加入 @RestController 註記的方式來讓Spring MVC的Web專案可以提供
REST的輸出,另外並會介紹如何透過jackson跟JAXB Annotation的方式來轉換輸出的格式:

範例的專案結構最後會呈現如下:
image
1. 首先,我們透過NetBeans來建立一個Maven的Web專案,並在pom.xml中加進下列的dependency

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${springframework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${springframework.version}</version>
        </dependency>
 
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.3</version>
        </dependency>

特別注意到這邊${springframework.version}的部份請替換成自己要使用的version
這邊我們用的是4.0.6.RELEASE版本

2. 接下來我們先建立一個用來承接output的POJO物件 (Message.java)

package allen0818.practice.springmvcrestprac.model;

/**
 *
 * @author allen0818
 */
public class Message {
 
    String name;
    String text;
 
    public Message(String name, String text) {
        this.name = name;
        this.text = text;
    }
 
    public String getName() {
        return name;
    }
     
    public String getText() {
        return text;
    }
}


3. 建立Controller (HelloWorldRestController.java)

package allen0818.practice.springmvcrestprac.controller;

import allen0818.practice.springmvcrestprac.model.Message;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 *
 * @author allen0818
 */
@RestController
public class HelloWorldRestController {
  
  @RequestMapping("/hello/{player}")
  public Message message(@PathVariable String player) {
    Message msg = new Message(player, "Hello, " + player);
    return msg;
  }
}

這邊可以看到我們用的是 @RestController這個Annotation而不是 @Controller,兩者的差別在於
使用@Controller標註的類別最後會回傳一個String,然後透過viewResolver組裝出完整的view page路徑後
將這個view呈現在前端畫面中。而使用 @RestController標註表示此類別最後會回傳一個POJO物件而非一個頁面
因此也不需要透過viewResolver來幫忙組裝回傳值。

4. 建立Configuration Class (HelloWorldConfiguration.java)

package allen0818.practice.springmvcrestprac.configuration;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

/**
 *
 * @author allen0818
 */

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "allen0818.practice.springmvcrestprac")
public class HelloWorldConfiguration {
     
}

可以看到這邊我們只宣告了 @EnableWebMvc 跟 @ComponentScan,
而把原先viewResolver的配置部份整個拿掉了

5. 建立Initialization Class (HelloWorldInitializer.java)

package allen0818.practice.springmvcrestprac.configuration;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
 
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

/**
 *
 * @author allen0818
 */

public class HelloWorldInitializer implements WebApplicationInitializer {
 
    public void onStartup(ServletContext container) throws ServletException {
 
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(HelloWorldConfiguration.class);
        ctx.setServletContext(container);
 
        ServletRegistration.Dynamic servlet = container.addServlet(
                "dispatcher", new DispatcherServlet(ctx));
 
        servlet.setLoadOnStartup(1);
        servlet.addMapping("/");
    }
}


呈現畫面如下:
image
可以看到透過jackson套件,我們可以將RestController回傳的POJO物件
以JSON字串格式的方式呈現在畫面上 !

另外,我們也可以透過在Model中加入JAXB Annotation的方式來將POJO物件轉換成
XML的方式呈現,修改過的Message.java如下:

package allen0818.practice.springmvcrestprac.model;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author allen0818
 */
@XmlRootElement(name = "user")
public class Message {
 
    String name;
    String text;
 
    public Message() {
      
    }
    public Message(String name, String text) {
        this.name = name;
        this.text = text;
    }
 
    @XmlElement
    public String getName() {
        return name;
    }
     
    @XmlElement
    public String getText() {
        return text;
    }
}

可以看到我們在Model中加入了 @XmlRootElement 跟 @XmlElement
這兩個JAXB的Annotation

呈現結果如下(請留意網址列的變化):
(1) XML格式

加入JAXB標註後,預設就是XML格式,也可以透過指定副檔名的方式來呈現XML,
如下所示:

(2) JSON格式

--
參考資料:
1. http://websystique.com/springmvc/spring-4-mvc-rest-service-example-using-restcontroller/
2. http://www.java2blog.com/2015/09/spring-restful-web-services-json-example.html

 

 

arrow
arrow

    allen0818 發表在 痞客邦 留言(0) 人氣()