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; } }运行效果:
{"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.核心在于配置里面,弄清楚配置就能够理解原理。