======================================
首先讲一下SpringMVC只需要在Spring web容器总共为RequestMappingHandleAdapter装配处理JSON的HttpMessageConverter,并在交互过程中通过请求的Accept指定MINE类型,SpringMVC就可以使服务器的处理方法和客户端JSON格式的消息进行通信了。@RequestBody注解用于读取request请求的body部分数据,使用系统,默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到Controller中方法的参数上。。。总而言之,下面测试的例子就只需要把Jackson的jar包加进来,然后就可以使用@RequestBody注解了,如果使用的是Jackson,那么Spring的HttpMessageConverter会帮我们做默认配置,如果使用的是其他包解析json,那么需要在springmvc的配置文件中进行配置。。
废话有点多,直接看代码……
========================================
1.首先是测试环境的搭建,本例使用MAVEN+SpringMVC搭建基础环境
2.使用SpringMVC以及web项目所要的基本配置文件,以及maven的依赖管理pom.xml
pom.xml
4.0.0
com.lin
My_AJAX_Test
0.0.1-SNAPSHOT
war
org.springframework
spring-webmvc
4.3.7.RELEASE
org.springframework
spring-aspects
4.3.7.RELEASE
javax.servlet
jstl
1.2
javax.servlet
javax.servlet-api
4.0.1
provided
junit
junit-dep
4.10
test
com.fasterxml.jackson.core
jackson-databind
2.9.4
springmvc-config.xml
/WEB-INF/content/
.jsp
web.xml
My_AJAX_Test
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc-config.xml
1
springmvc
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
=======================================
3.因为这里使用的是jQuery的AJAX,所以基础环境搭好以后加入jQuery的js库,自己百度下载去
========================================
4.写一个实体类
package com.lin.domain;
import java.io.Serializable;
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String author;
public Book() {
super();
}
public Book(Integer id, String name, String author) {
super();
this.id = id;
this.name = name;
this.author = author;
}
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 String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
5.controller
package com.lin.controller;
import com.lin.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/json")
public class BookController {
@RequestMapping("/testRequestBody")
@ResponseBody//这个注解表示将以下方法的返回值自动转换成json格式的数据(记得要添加jackson的jar包(无需配置)或者其它的第三方json类库(需另外在springmvc配置文件中配置))
public Book setJson(Book book){
book.setAuthor("林");
System.out.println(book);
return book;
}
}
6.然后就是页面,我们将页面设置成当页面加载完成时自动发起AJAX请求,当然你可以通过事件来发送。。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
测试接收JSON格式的数据
编号:
书名:
作者:
=============================
测试结果:
==========================================
==========================================
下面测试解析集合的json数据
首先改下controller类
package com.lin.controller;
import com.lin.domain.Book;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/json")
public class BookController {
@RequestMapping("/testRequestBody")
@ResponseBody//这个注解表示将以下方法的返回值自动转换成json格式的数据(记得要添加jackson的jar包(无需配置)或者其它的第三方json类库(需另外在springmvc配置文件中配置))
public List setJson(Book book){
List list = new ArrayList();
Book b1 = new Book(1,"AJAX从入门到精通","林");
Book b2 = new Book(2,"Java编程思想","外国");
list.add(b1);
list.add(b2);
return list;
}
}
然后是改下页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
测试接收JSON格式的数据
编号:
书名:
作者:
测试结果在页面按F12,看控制台
数据取到了,该怎么在页面显示那就不是问题了,处理一下就好了。。。
================================
==================================
==================================
粗浅的记录下,使用jQuery来发起AJAX请求,以及解析和接受的json数据的转换。。。
对了,这里要强调一下系统中web路径的问题,引用静态文件最好用${request.getContextPath()}方式,如下
或:
一开始我这样 src="/static/js/jquery-1.12.4.min.js",发现在eclipse中可以找的到对应的文件,然后一发布,js效果没有出来,然后发现应该是路径这边出了问题,所以以上只是建议。。。
还有就是发请求也同样。。。
这里附上一个jQuery设置标签中值的方法(这里直接使用的是W3School中的jQuery相关的知识)
这是段落。
这是另一个段落。
Input field:
结果:
=================================================
=================================================
=================================================
下面再附上一个实例,与上述差不多:
pom.xml
4.0.0
com.lin
SpringMVCTest
0.0.1-SNAPSHOT
war
org.springframework
spring-core
4.2.0.RELEASE
org.springframework
spring-webmvc
4.2.0.RELEASE
com.fasterxml.jackson.core
jackson-databind
2.9.4
web.xml
SpringTagTest
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc-config.xml
1
springmvc
/
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
characterEncodingFilter
/*
springmvc-config.xml
/WEB-INF/content/
.jsp
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
首页
<%-- --%>
用户名:
性别:
密码:
AJAXControllerTest.java
package com.lin.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.lin.domain.User;
@Controller
public class AJAXControllerTest {
@RequestMapping("ajaxTest")
@ResponseBody
public User ajaxTest(User user,HttpServletRequest request,HttpServletResponse response){
System.out.println(user.getUsername());
System.out.println(user.getSex());
System.out.println(user.getPassword());
User u = new User();
u.setUsername("小杨");
u.setSex("女");
return u;
// System.out.println(username);
// System.out.println(sex);
}
}
User.java
package com.lin.domain;
public class User {
private String username;
private String sex;
private String password;
public User() {
super();
}
public User(String username, String sex, String password) {
super();
this.username = username;
this.sex = sex;
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", sex=" + sex + ", password="
+ password + "]";
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试结果:
1.填写表单:
2.1点击提交后控制台:
2.2点击提交后表单页面:
==========================
如果不使用jackson或者其他的一些处理json数据的jar包,那么就自己构造json格式的数据返回给前台也行,可以参考手动构造json格式的方式。。
以下不贴出全部代码,因为跟上面这个例子一模一样,只需改下controller即可(pom中的jackson依赖也可以去掉,不影响了):
package com.lin.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.lin.domain.User;
@Controller
public class AJAXControllerTest {
@RequestMapping("ajaxTest")
// @ResponseBody
public void ajaxTest(User user,HttpServletRequest request,HttpServletResponse response) throws IOException{
System.out.println(user.getUsername());
System.out.println(user.getSex());
System.out.println(user.getPassword());
User u = new User();
u.setUsername("小杨");
u.setSex("女");
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("{\"username\":\""+"小杨"+"\",\"sex\":\""+"女"+"\"},");
sBuilder.deleteCharAt(sBuilder.length()-1);
// return u;
System.out.println(sBuilder);
//设置响应编码(这里有个问题就是,我明明在web.xml中配置了编码过滤器,但是这里如果不再设置响应编码还是会乱码。。。。)
response.setCharacterEncoding("UTF-8");
response.getWriter().print(sBuilder.toString());
}
}
结果与上面的例子同。。。。。这里要注意一下就是回调函数编码的问题,具体在上述代码中指出。。我去百度找了下,暂时是没有找到能直接在页面ajax那边设置编码解决的方式