原文地址:http://websystique.com/springmvc/spring-4-mvc-rest-service-example-using-restcontroller/
【本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看。源码下载地址在文章末尾。】
【翻译 by 明明如月 QQ 605283073】
上一篇:Spring
4 MVC 视图解析器(XML JSON PDF等) 纯注解
下一篇:Spring MVC 4 RESTFul Web Services CRUD例子(带源码)【这才是restful,超经典】
本文,我们将介绍使用Spring 4 @RestController
注解实现基于RESTful JSON的 Spring 4 MVC 例子。
我们将对其进行拓展不仅支持JSON还将支持XML,只需要在POJO上简单加上JAXB注解即可。
在URL末尾加上 .json 或者 .xml获得想要的格式。
---------------------------------
使用的技术或者软件
- Spring 4.0.6.RELEASE
- jackson-mapper-asl 1.9.13
- Maven 3
- JDK 1.6
- Tomcat 7.0.54
- Eclipse JUNO Service Release 2
第1步: 创建项目结构
采用maven创建项目,不会的参考前面的文章
本文将采用纯注解的方式
第2步:修改 pom.xml 添加需要的依赖
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <groupId>com.websystique.springmvc</groupId> <artifactId>Spring4MVCHelloWorldRestServiceDemo</artifactId> <packaging>war</packaging> <version>1.0.0</version> <name>Spring4MVCHelloWorldRestServiceDemo Maven Webapp</name> <properties> <springframework.version>4.0.6.RELEASE</springframework.version> </properties> <dependencies> <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>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.4</version> <configuration> <warSourceDirectory>src/main/webapp</warSourceDirectory> <warName>Spring4MVCHelloWorldRestServiceDemo</warName> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </pluginManagement> <finalName>Spring4MVCHelloWorldRestServiceDemo</finalName> </build> </project>
配置和以前一样只是加了Jackson library
(jackson-mapper-asl)
用来转换响应的数据成json 字符串。
Spring
4.1.x或者更高版本, 推荐使用jackson-databind 2.3 或者更高版本,来避免转换出现各种问题.详情参见:这里
为了安全起见,你可以添加jackson-databind库的最新版本
目前是2.5.3
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency>
第3步: 添加一个Pojo/domain对象
package com.websystique.springmvc.domain; 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; } }
此对象将从控制器返回并被jackson转换为JSON格式
第4步: 添加控制器
在src/main/java下添加控制器
package com.websystique.springmvc.controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.websystique.springmvc.domain.Message; @RestController public class HelloWorldRestController { @RequestMapping("/hello/{player}") public Message message(@PathVariable String player) { Message msg = new Message(player, "Hello " + player); return msg; } }
@PathVariable添加这个参数将绑定
URI
模板. 需要注意的是使用了=@RestController
注解,
表明本类作为一个控制器,返回的是一个domain/pojo对象而不是视图. 这就意味着,不再使用视图解析器,响应中不再发送html数据,而是发送domain对象的特定形式。在本例中是JSON
.
格式
第5步: 添加配置类
package com.websystique.springmvc.configuration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @Configuration @EnableWebMvc @ComponentScan(basePackages = "com.websystique.springmvc") public class HelloWorldConfiguration { }
这里没添加视图解析器
第6步:添加初始化类
package com.websystique.springmvc.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; 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("/"); } }
可以用下面的例子代替:
package com.websystique.springmvc.configuration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class HelloWorldInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { HelloWorldConfiguration.class }; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
第7步: 创建和发布应用
json输出
适配XML格式输出:
只需要添加JAXB注解在模型类上即可实现。
package com.websystique.springmvc.domain; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "pizza") 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; } }
编译重新发布
这样访问就需要带上拓展名
如果不带任何拓展名 默认是XML格式
项目下载地址:http://websystique.com/?smd_process_download=1&download_id=765