这里使用spring4提供的@RestController来构建Restful风格的接口,可以返回xml或json格式的数据,通过url后缀.xml或.json区分。
项目搭建使用maven,具体pom文件如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 第三方jar版本 -->
<springframework.version>4.3.2.RELEASE</springframework.version>
<jackson.version>2.8.1</jackson.version>
<junit.version>4.12</junit.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>
@RestController的源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
String value() default "";
}
可以看到,@RestController中包含@Controller和@ResponseBody两个注解,这两个注解的作用不再详述。
编写返回数据的实体类:
public class User {
private String name;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public User(String name, String desc) {
this.name = name;
this.desc = desc;
}
public User() {
}
}
创建controller并添加@RestController
注解:
@RestController
@RequestMapping("user")
public class UserController {
@RequestMapping("/{name}")
public User get(@PathVariable String name) {
User user = new User(name, "Hi,I'm " + name);
return user;
}
}
配置spring扫描包路径和项目的web.xml:
spring-mvc.xml:
<context:component-scan base-package="com.demo">
</context:component-scan>
<mvc:annotation-driven/>
web.xml:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
运行项目:
浏览器访问:http://localhost:8080/user/Anglia.json
返回结果如下图:
也可以直接访问:http://localhost:8080/user/Anglia
因为默认就是json。
此时访问xml格式的数据的url:http://localhost:8080/user/Anglia.xml ,却会报406错误,如下图:
这是因为在转换xml出错了,只需要给实体类加上@XmlRootElement
注解即可:
@XmlRootElement
public class User {
private String name;
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public User(String name, String desc) {
this.name = name;
this.desc = desc;
}
public User() {
}
}
再访问http://localhost:8080/user/Anglia.xml
返回xml格式数据成功。
注意:此时如果要返回json数据,必须加.json后缀,因为加过@XmlRootElement注解后,返回的默认格式是xml格式