REST API 作为异构系统集成的终极解决方案,导致各个框架都实现了对REST API 的支持。SpringMVC在业内名声不小,自然少不了对REST API的支持。今天研究了一下SpringMVC的REST API,虽然简单但也能够作为一个入门级别的教程了。
1.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd" default-autowire="byName">
<context:component-scan base-package="com.wicresoft.controller" />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- rest str -->
<!-- 自动搜索@Controller标注的类,包括其下面的子包 -->
<context:component-scan base-package="com.wicresoft.controller" />
<!-- 根据客户端的不同的请求决定不同的view进行响应, 如 /blog/1.json /blog/1.xml -->
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<!-- 设置为true以忽略对Accept Header的支持 -->
<property name="ignoreAcceptHeader" value="true" />
<!-- 在没有扩展名时即: "/blog/1" 时的默认展现形式 -->
<property name="defaultContentType" value="text/html" />
<!-- 扩展名至mimeType的映射,即 /blog.json => application/json -->
<property name="mediaTypes">
<map>
<entry key="html" value="text/html" />
<entry key="pdf" value="application/pdf" />
<entry key="xsl" value="application/vnd.ms-excel" />
<entry key="xml" value="application/xml" />
<entry key="json" value="application/json" />
</map>
</property>
<!-- 用于开启 /blog/123?format=json 的支持 -->
<property name="favorParameter" value="false" />
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/pages" />
<property name="suffix" value=".jsp"></property>
</bean>
</list>
</property>
<property name="defaultViews">
<list>
<!-- for application/json -->
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
<!-- for application/xml -->
</list>
</property>
</bean>
<!-- rest end-->
</beans>
3.控制器
//FINAL
package com.wicresoft.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.wicresoft.model.TournamentContent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Controller
public class JsonController {
@RequestMapping("/json")
public void getJSON(Model model) {
List<TournamentContent> tournamentList = new ArrayList<TournamentContent>();
tournamentList.add(TournamentContent.generateContent("FIFA", new Date(), "World Cup", "www.fifa.com/worldcup/"));
tournamentList.add(TournamentContent.generateContent("FIFA", new Date(), "U-20 World Cup", "www.fifa.com/u20worldcup/"));
tournamentList.add(TournamentContent.generateContent("FIFA", new Date(), "U-17 World Cup", "www.fifa.com/u17worldcup/"));
tournamentList.add(TournamentContent.generateContent("FIFA", new Date(), "Confederations Cup", "www.fifa.com/confederationscup/"));
model.addAttribute("items", tournamentList);
model.addAttribute("status", 0);
//return "jsontournamenttemplate";
}
}
4.实体类
package com.wicresoft.model;
import java.util.Date;
public class TournamentContent {
private static int idCounter = 0;
private String author;
private Date publicationDate;
private String name;
private String link;
private int id;
public static TournamentContent generateContent(String author, Date date, String name, String link) {
TournamentContent content = new TournamentContent();
content.author = author;
content.publicationDate = date;
content.name = name;
content.link = link;
content.id = idCounter++;
return content;
}
public String getAuthor() {
return author;
}
public Date getPublicationDate() {
return publicationDate;
}
public String getName() {
return name;
}
public String getLink() {
return link;
}
public int getId() {
return id;
}
}
运行效果:
http://localhost:8080/MyCLM/json.json
{"status":0,"items":[{"name":"World Cup","id":0,"link":"www.fifa.com/worldcup/","author":"FIFA","publicationDate":1432882544472},{"name":"U-20 World Cup","id":1,"link":"www.fifa.com/u20worldcup/","author":"FIFA","publicationDate":1432882544479},{"name":"U-17 World Cup","id":2,"link":"www.fifa.com/u17worldcup/","author":"FIFA","publicationDate":1432882544479},{"name":"Confederations Cup","id":3,"link":"www.fifa.com/confederationscup/","author":"FIFA","publicationDate":1432882544479}]}
总结:
1.本项目依赖SpringMVC的jar包
2.核心在于配置里面,弄清楚配置就能够理解原理。