需要导入的包:jackson-databind、spring-webmvc、jstl、spring-core、spring-context
<!-- 导入jackson工具JAR包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
利用ajax向后台发送消息,主要是通过json格式的数据或者是消息的形式向后台发送消息。下面的是post请求,如果是get请求的话,那么数据data必须是"id=1&name='张三'&age=20"这种类型的键值对字符串,多个参数用&隔开,就没json什么事了
下面的代码只是演示,同时在Java后台接受数据的的方式可以交叉使用(可以用对象、Map、数组、list集合、类型参数接收数据),返回数据可以用对象、list集合、map
下面是各种情况的传输方式(例子):(ajax默认传输方式是表单数据传输方式)
json和js对象的关系请看:https://blog.csdn.net/IT_CREATE/article/details/85072384
1)利用json向后台传输对象数据(java端以对象形式接收数据,并且返回一个消息对象)
<button id="btn01">使用Jackson完成单个对象的新增</button>
js发送代码:(用到了jquery.json.js中的$.toJSON( )方法将js对象转为json格式的字符串)
$('#btn01').bind("click", function(){
var doc = {docName:'张三',age:18,gender:1};
//将JS对象转换为JSON格式字符串
var json = $.toJSON(doc);
var url = "doc/add";
$.ajax({
type: "POST",
url: url,
contentType:"application/json",//告知后台,我传输的数据是JSON对象
data: json,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
@RequestMapping()在类的级别上会将一个特定请求或者请求模式映射到一个控制器之上。之后你还可以另外添加方法级别的注解来进一步指定到处理方法的映射关系。 一个类中可以有多个方法,多个方法上面加上这个注解,指定不同路径就可以将多个请求方式写在一个类中了。避免了之前那种一个请求一个servlet的繁重。
@RequestMapping中produces属性可以设置返回数据的类型以及编码,可以是json或者xml,下面加了这句之后就表示在js端不用在进行json字符串转对象的操作
@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。
@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,一般在异步获取数据时使用【也就是AJAX】,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
@RequestMapping("/doc")
@Controller
public class DoctorController {
@RequestMapping(value="/add",produces= {"application/json; charset=UTF-8"})
public @ResponseBody ResMessage meth01(@RequestBody DoctorBean doc) {
System.out.println(doc);
//返回的消息,自定义的一个类,就两个属性,一个state状态,一个informationMessage具体描述
ResMessage mes = new ResMessage(true, "操作成功!");
return mes;
}
}
后台以对象的形式进行数据的接收,从js传下来的数据是以键值对的形式进行数据传输的,那么js数据的中键的名称要和JavaBean中的属性名对应一致。
比如上面js传下来的数据:
{docName:'张三',age:18,gender:1}
那么java中的接收对象中就必须包含这些属性,并且属性名称一致(只能比接收的数据多或相等,不能少):
private Long id;
private String docName;
private Integer age;
private Integer gender;
private String telphone;
2)利用js对象向后台传输对象数据(java端以对象形式接收数据,并且返回一个消息对象)
<button id="btn02">不使用Jackson完成单个对象的新增</button>
js发送代码:(以js对象向后台发送数据)
$('#btn02').bind("click", function(){
var data = {docName:'张三',age:18,gender:1};
var url = "doc/add02";
$.ajax({
type: "POST",
url: url,
data: data,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:(同上面的相比,因为不是json的形式发下来的,所以不需要@requestBody注解)
注解的含义、Java端接收对象与js端发送对象需遵守的规则 请看 1)
@RequestMapping(value="/add02",produces= {"application/json; charset=UTF-8"})
public @ResponseBody ResMessage meth02(DoctorBean doc) {
System.out.println(doc);
//返回的消息,自定义的一个类,就两个属性,一个state状态,一个informationMessage具体描述
ResMessage mes = new ResMessage(true, "操作成功!");
return mes;
}
3)利用JSON向后台传输对象数组数据(java端以对象集合形式接收数据,并且返回一个消息对象)
<button id="btn03">使用Jackson完成多个对象的新增</button>
js发送代码:
$('#btn03').bind("click", function(){
var doc01 = {docName:'张三',age:18,gender:1};
var doc02 = {docName:'李四',age:18,gender:1};
var doc03 = {docName:'王五',age:18,gender:1};
var doc04 = {docName:'赵六',age:18,gender:1};
var arrs = [];
arrs.push(doc01);
arrs.push(doc02);
arrs.push(doc03);
arrs.push(doc04);
//将JS对象数组,转换为JSON对象数组字符串,---JSONArray [{},{},{}]
var jsonArray = $.toJSON(arrs);
var url = "doc/add03";
$.ajax({
type: "POST",
url: url,
contentType:"application/json",//告知后台,我传输的数据是JSON格式数据
data: jsonArray,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义、Java端接收对象与js端发送对象需遵守的规则 请看 1)
@RequestMapping(value="/add03",produces= {"application/json; charset=UTF-8"})
public @ResponseBody ResMessage meth03(@RequestBody List<DoctorBean> docs) {
System.out.println(docs);
//返回的消息,自定义的一个类,就两个属性,一个state状态,一个informationMessage具体描述
ResMessage mes = new ResMessage(true, "操作成功!");
return mes;
}
4)利用JSON向后台传输对象数组数据(java端以对象数组形式接收数据,并且返回一个消息对象)
<button id="btn04">使用Jackson完成批量删除</button>
js发送代码:
$('#btn04').bind("click", function(){
var id01 = 1;
var id02 = 2;
var id03 = 3;
var id04 = 4;
var arrs = [];
arrs.push(id01);
arrs.push(id02);
arrs.push(id03);
arrs.push(id04);
//将JS对象对数组,转换为JSON对象数组,---JSONArray [{},{},{}]
var jsonArray = $.toJSON(arrs);
var url = "doc/delete";
$.ajax({
type: "POST",
url: url,
contentType:"application/json",//告知后台,我传输的数据是JSON格式数据
data: jsonArray,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义、Java端接收对象与js端发送对象需遵守的规则 请看 1)
@RequestMapping(value="/delete",produces= {"application/json; charset=UTF-8"})
public @ResponseBody ResMessage meth04(@RequestBody Long[] ids) {
System.out.println(Arrays.toString(ids));
//返回的消息,自定义的一个类,就两个属性,一个state状态,一个informationMessage具体描述
ResMessage mes = new ResMessage(true, "操作成功!");
return mes;
}
5)利用JS对象向后台传输对象数据(java端以对象形式接收数据,并且返回一个对象集合)
<button id="btn05">使用对象接收参数,查询医生数据</button>
js发送代码:
$('#btn05').bind("click", function(){
var data = {docName:"张",age:18};
var url = "doc/query01";
$.ajax({
type: "POST",
url: url,
data: data,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义、Java端接收对象与js端发送对象需遵守的规则 请看 1)
@RequestMapping(value="/query01",produces= {"application/json; charset=UTF-8"})
public @ResponseBody List<DoctorBean> meth04(DoctorBean doc) {
System.out.println(doc);
List<DoctorBean> docs = new ArrayList<DoctorBean>();
docs.add(new DoctorBean("张三"));
docs.add(new DoctorBean("张大麻子"));
docs.add(new DoctorBean("张三丰"));
return docs;
}
6)利用JSON向后台传输对象数据(java端以map形式接收数据,并且返回一个对象集合)
<button id="btn06">使用Map接收参数,查询医生数据</button>
js发送代码:
$('#btn06').bind("click", function(){
var data = {docName:"张",age:18};
var url = "doc/query02";
var json = $.toJSON(data);
$.ajax({
type: "POST",
url: url,
data: json,
contentType:"application/json",//告知后台,我传输的数据是JSON格式数据
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义 请看 1)
@RequestMapping(value="/query02",produces= {"application/json; charset=UTF-8"})
public @ResponseBody List<DoctorBean> meth05(@RequestBody Map params) {
System.out.println(params);
List<DoctorBean> docs = new ArrayList<DoctorBean>();
docs.add(new DoctorBean("张三"));
docs.add(new DoctorBean("张大麻子"));
docs.add(new DoctorBean("张三丰"));
return docs;
}
7)利用JSON向后台传输对象数据(java端以对象形式接收数据,并且返回一个Map)
<button id="btn07">使用Map作为返回类型,查询医生数据</button>
js发送代码:
$('#btn07').bind("click", function(){
var data = {docName:"张",age:18};
var url = "doc/query03";
var json = $.toJSON(data);
$.ajax({
type: "POST",
url: url,
data: json,
contentType:"application/json",//告知后台,我传输的数据是JSON格式数据
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义 Java端接收对象与js端发送对象需遵守的规则 请看 1)
@RequestMapping(value="/query03",produces= {"application/json; charset=UTF-8"})
public @ResponseBody Map meth05(@RequestBody DoctorBean doc) {
System.out.println(doc);
Map res = new HashMap();
res.put("docName", "张三");
res.put("age", 20);
return res;
}
8)利用JS对象向后台传输对象数据(java端以多个对象形式接收数据,并且返回一个对象)
<button id="btn08">使用对象接收参数,分页查询医生数据</button>
js发送代码:
$('#btn08').bind("click", function(){
var data = {docName:"张",age:18,page:1,rows:5};
var url = "doc/query04";
$.ajax({
type: "POST",
url: url,
data: data,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义 请看 1)
@RequestMapping(value="/query04",produces= {"application/json; charset=UTF-8"})
public @ResponseBody PageBean meth06(DoctorBean doc,PageBean page) {
System.out.println(doc);
System.out.println(page);
page.setTotalRows(30);
List<DoctorBean> docs = new ArrayList<DoctorBean>();
docs.add(new DoctorBean("张三"));
docs.add(new DoctorBean("张大麻子"));
docs.add(new DoctorBean("张三丰"));
docs.add(new DoctorBean("张yi丰"));
docs.add(new DoctorBean("张er丰"));
page.setData(docs);
return page;
}
js端发送到Java端的数据,不管java端接受数据的对象有多少个,只要在这些对象内部包含了那些数据的属性就可以了,比如这里:
js发送的数据:
{docName:"张",age:18,page:1,rows:5}
那么接受数据的对象只要有这些属性就可以了,属性名称一定要一致,比如这里:
DoctorBean:(包含了docName,age属性)
private Long id;
private String docName;
private Integer age;
private Integer gender;
private String telphone;
PageBean page:(包含了page,rows)
private int page;//当前页码
private int rows;//每页显示数据的行数
private int index;//数据获取的起始位置(数据库中)
private int totalRows;//数据总条数
private int totalPage;//总共有多少页
private String sort;//排序字段
private String order;//排序方式
private List<?> data;//具体的数据
9)利用JS对象向后台传输(包含数组)对象数据(java端以参数接收数据,并且返回一个对象)
<button id="btn09">使用参数接收数据,返回消息</button>
js发送代码:(如果不是用json的形式发送数据,而是以默认的方式进行数据传输,那么在传输的数据中包含数组或者就发送个数组,必须加上traditional:
true
,这样数组在传输时数组名称后面就不会自动加上“[]”,避免了后台拿不到数据
)
$('#btn09').bind("click", function(){
var telephone = new Array("1822374678","1822364678","1822368678");
var data = {userName:"张",age:18,telephone:telephone};
var url = "doc/query05";
$.ajax({
type: "POST",
url: url,
data: data,
traditional: true,//这里设置为true
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
注解的含义 请看 1)
@RequestMapping(value="/query04",produces= {"application/json; charset=UTF-8"})
public @ResponseBody ResMessage meth06(String userName,int age,String[] telephone) {
System.out.println(userName);
System.out.println(age);
//返回的消息,自定义的一个类,就两个属性,一个state状态,一个informationMessage具体描述
ResMessage mes = new ResMessage(true, "操作成功!");
return mes;
}
js端发送到Java端的数据,不管java端接受数据参数有多少个,只要这些参数与js端发送的数据一一对应就可以了,比如这里:
js发送的数据:
{userName:"张",age:18,telephone:telephone}
那么接受数据的参数只要跟这些属性一样就可以了,属性名称一定要一致,比如这里:
public @ResponseBody ResMessage meth06(String userName,int age,String[] telephone)
还有一种方式:(用@RequestParam注解,这种方式可以和js数据进行绑定,参数名就可以随便写了)
public @ResponseBody ResMessage meth06(@RequestParam(value="userName") String name,int age,String[] telephone)
10)利用JS对象向后台传输对象数据(java端以对象形式接收数据,并且利用PrintWriter流的方式将数据写回前端js,同时实现按需序列化)
<button id="btn10">使用对象接收参数,分页查询用户数据(按需实现对象的序列化)</button>
js发送代码:
$('#btn10').bind("click", function(){
var data = {userName:"张",age:18,page:1,rows:5};
var url = "doc/query06";
$.ajax({
type: "POST",
url: url,
data: data,
success: function(msg){
console.log(msg);
}
});
});
java后台表现层controller代码:
Spring MVC 更灵活的控制 json 返回:https://my.oschina.net/diamondfsd/blog/836727
注解的含义 请看 1)
//比下面方法,更加简单的一种方法:https://my.oschina.net/diamondfsd/blog/836727
@RequestMapping(value="/query06")
public void meth07(UserBean user,PageBean page,PrintWriter out,HttpServletResponse res) {
System.out.println(user);
System.out.println(page);
page.setTotalRows(30);
List<UserBean> users = new ArrayList<UserBean>();
users.add(new UserBean("座山雕", "123456"));
users.add(new UserBean("张大麻子", "123456"));
users.add(new UserBean("一撮毛", "123456"));
users.add(new UserBean("杨子荣", "123456"));
page.setData(users);
ObjectMapper om = new ObjectMapper();
om.setFilterProvider(new SimpleFilterProvider().addFilter("userFilter",
SimpleBeanPropertyFilter.serializeAllExcept("role","childs","adds")));
//serializeAllExcept 序列化对象属性时,除了括号内的属性不参与以外,其他都参与到序列化
//filterOutAllExcept 序列化对象属性时,只序列化括号内部的属性,其他的都不参与到序列化过程
try {
String json = om.writeValueAsString(page);
res.setContentType("application/json;charset=utf-8");
out.print(json);
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
js端发送到Java端的数据,不管java端接受数据的对象有多少个,只要在这些对象内部包含了那些数据的属性就可以了,比如这里:
js发送的数据:
{docName:"张",age:18,page:1,rows:5}
那么接受数据的对象只要有这些属性就可以了,属性名称一定要一致,比如这里:
DoctorBean:(包含了docName,age属性)
private Long id;
private String docName;
private Integer age;
private Integer gender;
private String telphone;
PageBean page:(包含了page,rows)
private int page;//当前页码
private int rows;//每页显示数据的行数
private int index;//数据获取的起始位置(数据库中)
private int totalRows;//数据总条数
private int totalPage;//总共有多少页
private String sort;//排序字段
private String order;//排序方式
private List<?> data;//具体的数据
涉及到的配置文件:https://blog.csdn.net/IT_CREATE/article/details/86572377
配置在该链接的最后面,其实配置都是一样的,springMVC中并没有什么针对本次的特殊的配置,基本配置也就ok了。
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gezhi</groupId>
<artifactId>springmvcanno</artifactId>
<packaging>war</packaging>
<version>1.0</version>
<name>springmvcanno Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<spring.version>4.3.14.RELEASE</spring.version>
<jstl.version>1.2</jstl.version>
<hibernate.validator.version>5.4.1.Final</hibernate.validator.version>
<slf4j.version>1.7.25</slf4j.version>
<jackson.version>2.9.5</jackson.version>
</properties>
<dependencies>
<!-- 导入jackson工具JAR包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- 引入文件上传需要的JAR包 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- 引入slf4j日志标准,作用:适配其他具体的日志框架,如:log4j,logback…… -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- 引入hibernate的验证框架 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.validator.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<!-- 引入springmvc框架的相关JAR包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 导入junit单元测试框架JAR包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 导入LOG4J日志框架JAR包 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
<build>
<finalName>springmvcanno</finalName>
<pluginManagement>
<!-- 配置maven 在构建项目时,采用相关插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
https://blog.csdn.net/IT_CREATE/article/details/86572377