在這篇文章中主要會介紹如何透過加入 @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