在這篇文章中主要會介紹如何透過加入 @RestController 註記的方式來讓Spring MVC的Web專案可以提供
REST的輸出,另外並會介紹如何透過jackson跟JAXB Annotation的方式來轉換輸出的格式:
範例的專案結構最後會呈現如下:
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("/");
}
}
呈現畫面如下:
可以看到透過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
