JSON数据交互
前端可以有很多语言来写,但是基本上后台都是java开发的,除了c++(开发周期长),PHP和#Net(追求速度,快速开发)这3种也可以写后台。
浏览器和java程序打交道,用jsp、js。
安卓、IOS客户端和Java程序打交道,发送的是JSON字符串。Java程序接收到,解析JSON字符串,形成POJO对象,然后进行业务处理。处理完变成POJO或者包装类对象或者List集合,转成JSON字符串发回给安卓、IOS客户端。
所以掌握了JSON数据交互,就不用关心前端是什么语言开发的了。
项目结构
jar包
实体类Student.java
@Component
@Scope("prototype")
public class Student {
private int id;
private String name;
private int age;
private float score;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public float getScore() { return score; }
public void setScore(float score) { this.score = score; }
}
前端页面index.jsp使用ajax发起请求
如果要请求纯文本(字符串),将dateType的值改为text。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSON</title>
</head>
<body>
<form>
学号:<input type="text" id="id"><br/>
<button type="button" id="btn">查询学生信息</button>
</form>
<p id="show"></p>
<%-- <script src="${pageContext.request.contextPath}/js/jquery.min.js"></script> --%>
<script src="js/jquery-3.4.1.min.js" type="text/javascript"></script>
<script>
$("#btn").click(function () {
$.ajax({
//开头不能加/,但可以加 ${pageContext.request.contextPath}/
url: "studentController/queryStudent",
type: "post",
// 传给后台的数据类型、使用的字符集。可以缺省,因为data:{},看到{}就会自动作为json处理
// contentType:"application/json;charset=utf-8",
//传给后台的数据,json形式,key是String类型,value可以是多种类型,键值对之间逗号分隔
data: {"id": $("#id").val()},
//期待的返回值类型(回调函数的参数类型)
dataType: "json",
error: function () {
console.log("ajax请求数据失败!");
},
success: function (data) {
//浏览器把接受到的json数据作为js对象,可通过.调用属性
var info = "姓名:" + data.name + ",年龄:" + data.age + ",成绩:" + data.score;
$("#show").text(info);
}
})
});
</script>
</body>
</html>
后台使用controller处理ajax请求
可以用简单数据类型接收前端传来的数据,也可以使用Bean来接收(会赋给同名的属性)。
很多教程说要在业务方法的参数前面加@RequestBody,才能将ajax传来的数据转换为需要的类型;
事实上,随着版本更替,高版本SpringMVC内建的转换器已经可以将ajax传来的数据转换需要的类型,加@RequestBody反而会出错。
需要在业务方法上添加注解@ResponseBody,此处解会自动将返回值添加到响应体中,来响应ajax请求。
不管请求的是text、还是json,都需要使用@ResponseBody。
如果请求的是text,将返回值类型写成String;
如果请求的是json,返回值可以写成bean(返回json对象,比如请求一个学生的信息),也可以写成List(返回json数组,比如请求多个学生的信息)。
@Controller
@RequestMapping("studentController")
public class StudentController {
private Student student;
@Autowired
public void setStudent(Student student) {
this.student = student;
}
@RequestMapping("/queryStudent")
@ResponseBody
public Student queryStudent(int id) {
System.out.println(id);
//此处省略连接数据库查询
student.setName("chy");
student.setAge(20);
student.setScore(100);
return student;
}
}
springmvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
<!--
可以扫描controller、service、...
这里让扫描controller,指定controller的包
-->
<context:component-scan base-package="org.haiwen"></context:component-scan>
<!-- 开启spring对mvc的注解支持(全注解一定要配置) -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 解决Controller返回json中文乱码问题 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 静态资源放行 -->
<mvc:default-servlet-handler />
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize">
<value>10000000000</value> <!-- 以字节byte为单位 -->
</property>
<property name="defaultEncoding">
<value>UTF-8</value>
</property>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 配置SpringMVC的核心控制器DispatcherServlet(负责所有请求的公共功能,然后在分发给具体的控制器(我们编写的控制器),完成业务逻辑,响应视图。) -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
服务器在启动的时候,去加载springmvc的配置文件
如果不配置就默认去WEB-INF文件夹下找:<servlet-name>-servlet.xml的配置(这种方式需要拷贝配置文件到WEB-INF)
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- Servlet容器启动的时候就进行初始化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 请求的入口,所有请求都会经过DispatcherServlet处理 /:支持RESTful风格 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置编码过滤器 ==>目的:解决SpringMVC post提交数据时的乱码问题 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
测试