SpringMVC的使用(3)
@ResponseBody注解
1、SpringMVC的返回JSON数据
到目前为止编写的所有Controller的方法的返回值都是String类型,但是大家应该都知道,有时候数据传递特别是在ajax中,返回的数据经常需要使用json,那么如何来保证返回的数据的是json格式呢?使用@ResponseBody注解
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>springmv_ajax</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.10.3</version>
</dependency>
</dependencies>
</project>
springmvc.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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--指定Spring要扫描的组件等对象所在的包-->
<context:component-scan base-package="com.example"></context:component-scan>
<!--定义内部资源视图解析器熟悉,处理内部返回页面的url拼接和跳转-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--声明默认的请求-servelet映射处理器-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--声明SpingMVC注解驱动,建立解析客户端请求和对应处理方法的映射-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
JsonController.java
package com.example.controller;
import com.example.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Controller
public class JsonController {
@ResponseBody
@RequestMapping("/json")
public List<User> json(){
List<User> list = new ArrayList<User>();
list.add(new User(1,"zhangsan",12,"男",new Date(),"[email protected]"));
list.add(new User(2,"zhangsan2",12,"男",new Date(),"[email protected]"));
list.add(new User(3,"zhangsan3",12,"男",new Date(),"[email protected]"));
return list;
}
}
User.java
package com.example.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.Date;
public class User {
private Integer id;
private String name;
private Integer age;
private String gender;
@JsonFormat( pattern = "yyyy-MM-dd")
private Date birth;
@JsonIgnore
private String email;
public User() {
}
public User(Integer id, String name, Integer age, String gender, Date birth, String email) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.birth = birth;
this.email = email;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
", birth=" + birth +
", email='" + email + '\'' +
'}';
}
}
另外@ResponseBody也可以直接将返回的字符串数据作为响应内容,具体需要返回声明看需求使用即可
package com.example.controller;
import com.example.bean.User;
import org.springframework.http.HttpEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OtherController {
@ResponseBody
@RequestMapping("/testResponseBody")
public String testResponseBody(){
return "<h1>success</h1>";
}
}
2、发送ajax请求获取json数据
ajax.jsp
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<!--记得在js页面导入JQuery包-->
<script type="text/javascript" src="script/jquery-1.9.1.min.js"></script>
</head>
<%
pageContext.setAttribute("ctp",request.getContextPath());
%>
<body>
<%=new Date()%>
<a href="${ctp}/json">获取用户信息</a>
<div>
</div>
<script type="text/javascript">
$("a:first").click(function () {
$.ajax({
url:"${ctp}/json",
type:"GET",
success:function (data) {
console.log(data)
$.each(data,function() {
var user = this.id+"--"+this.name+"--"+this.age+"--"+this.gender+"--"+this.birth+"--"+this.email;
$("div").append(user+'<br/>');
})
}
});
return false;
});
</script>
</body>
</html>
3、使用@RequestBody获取请求体信息
testOther.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<%
pageContext.setAttribute("ctp",request.getContextPath());
%>
<head>
<title>Title</title>
</head>
<body>
<form action="${ctp}/testRequestBody" method="post" enctype="multipart/form-data">
<input name="username" value="zhangsan"><br>
<input name="password" value="123456"><br>
<input type="file" name="file" ><br>
<input type="submit"><br>
</form>
</body>
</html>
OtherController.java
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping