使用Spring MVC 4构建RESTful服务相对于其它框架来说,有很多优势。首先,Spring MVC 4作为Spring的框架之一,可以很好地与Spring进行集成。其次,Spring MVC 4的拦截器是在方法层级上的拦截,相对于其它MVC框架(如Struts2)的拦截器具有更高的效率。再者,Spring MVC 4采用基于注解的配置,入手容易,开发灵活。

    Spring MVC 4采用的是jacson解析JSON。jacson一款非常高效强大的JSON工具类,可以轻松地在JAVA对象与json对象和XML文档之间进行序列化和反序列化。本文中的例子采用的是Spring 4.1.1.RELEASE和jacson 2.4.0版本,经测试无任何异常。接下来,上干货:

    开发环境准备:

        Eclipse Luna

        Apache Tomcat 8.0

        JDK 1.7

        Spring 4.1.1.RELEASE

        jackson 2.4.0

    工程目录如下:

    1. 新建Maven Project,选择在“Archetype类型”中,选择“maven-archetype-webapp”。

    2. 在Pom.xml中添加 Maven 依赖,从而可以使用 Spring和jackson中的特性。如果读者使用的是Dynamic Web Project,可以从Maven仓库下载对的Spring Jar和 jacson jar。

    Spring的Maven仓库地址:

    jackson的Maven仓库地址:

  
4.0.0
  
com.favccxx.favsoft
  
favspringmvcrestful
  
war
  
0.0.1-SNAPSHOT
  
favspringmvcrestful Maven Webapp
  
http://maven.apache.org
    
  
4.1.1.RELEASE
  
2.4.0
  
    
    
      
junit
      
junit
      
3.8.1
      
test
    
        
org.springframework
spring-core
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-context
${spring.version}
  
com.fasterxml.jackson.core
  
jackson-core
  
${jackson.version}
  
com.fasterxml.jackson.core
  
jackson-annotations
  
${jackson.version}
  
com.fasterxml.jackson.core
  
jackson-databind
  
${jackson.version}
jstl
jstl
1.2
taglibs
standard
1.1.2
      
  
    
favspringmvcrestful
  

    3.在 web.xml中,配置Spring MVC 4 的DispatcherServlet转发和编码。

favblog
contextConfigLocation
encodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
encodingFilter
/*
org.springframework.web.context.ContextLoaderListener
springMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath*:spring-context.xml
1
springMVC
/
    
        
        
        
    

    4.新建 FavUser.java 类,测试JSON与Object之间的映射。需要注意的是,如果想对日期进行格式化,在其Getter方法上,使用 @JsonFormat 即可,这样就能输出符合pattern类型的日期,但是这同时也要求输入的日期参数也必须是pattern类型的。

package com.favccxx.favsoft.favjson.pojo;import java.util.Date;import com.fasterxml.jackson.annotation.JsonFormat;public class FavUser {		private String userId;	private String userName;	private int userAge;	private Date createDate;		public String getUserId() {		return userId;	}	public void setUserId(String userId) {		this.userId = userId;	}	public String getUserName() {		return userName;	}	public void setUserName(String userName) {		this.userName = userName;	}	public int getUserAge() {		return userAge;	}	public void setUserAge(int userAge) {		this.userAge = userAge;	}	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")	public Date getCreateDate() {		return createDate;	}	public void setCreateDate(Date createDate) {		this.createDate = createDate;	}		}

   

    5. 新建FavRestfulController,通过不同的方法测试Spring MVC 4 返回String、Object类型的JSON。

package com.favccxx.favsoft.favjson.controller;import java.io.IOException;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;import com.fasterxml.jackson.core.JsonParseException;import com.fasterxml.jackson.databind.JsonMappingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.favccxx.favsoft.favjson.pojo.FavUser;@RestControllerpublic class FavRestfulController {		@RequestMapping(value="/getUserName",method=RequestMethod.POST)	public String getUserName(@RequestParam(value="name") String name){		return name;	}		@RequestMapping("getFavUser")	public FavUser getFavUser(@RequestParam("userName") String userName,String userId,int userAge){		FavUser favUser = new FavUser();		favUser.setUserId(userId);		favUser.setUserName(userName);		favUser.setUserAge(userAge);		return favUser;	}		@RequestMapping("getFavUserBody")	public FavUser getFavUserBody(@RequestBody String body){		ObjectMapper mapper = new ObjectMapper();		FavUser favUser = null;		try {			favUser = mapper.readValue(body,  FavUser.class);		} catch (JsonParseException e) {			e.printStackTrace();		} catch (JsonMappingException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}		return favUser;	}}

 6.运行结果如下: