1 解析后台传递过来的数据为JOSN
一般而言,Spring MVC 的 CONTROLLER 可以通过两种方式返回 JSON 数据给前端JSP页面
1.1
Maven:
<!-- JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.46</version>
</dependency>
SpringMVC的配置文件添加解析器:
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json</value>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
<property name="features">
<list>
<!-- 默认的意思就是不配置这个属性,配置了就不是默认了 -->
<!-- 是否输出值为null的字段 ,默认是false -->
<value>WriteMapNullValue</value>
<value>WriteNullNumberAsZero</value>
<value>WriteNullListAsEmpty</value>
<value>WriteNullStringAsEmpty</value>
<value>WriteNullBooleanAsFalse</value>
<value>WriteDateUseDateFormat</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
后台:
@RequestMapping("/json")
@ResponseBody
public List<User> json(){
List<User> list=new ArrayList<User>();
list.add(new User(1,"zhangsan","男"));
list.add(new User(2,"nico","女"));
list.add(new User(3,"zhangsa","男"));
return list;
}
前台:
$.post("ajax.do",function(data){
for(var i=0;i,data.length;i++){
html+="<tr><td>"+data[i].id+"</td><td>"+data[i].name+"</td><td>"+data[i].sex+"</td></tr>"
}
$("#content").html(html);
});
1.2 将数据转为JSON数组的形式,前台解析
后台控制器,定义一个JSON数组,向数组中添加对象。
@RequestMapping("josntext")
public String text(HttpServletRequest request, HttpServletResponse response) {
JSONArray array = new JSONArray();
JSONObject object = null;
for (int i = 0; i < 5; i++) {
object = new JSONObject();
object.accumulate("a", 1);
object.accumulate("b", 2);
object.accumulate("c", 3);
object.accumulate("d", 4);
array.add(object);
}
request.setAttribute("arr", array);
return "josn";
}
返回的页面:
<script>
$(document).ready(function(){
var arr='<%=request.getAttribute("arr")%>';
alert(arr);
arr=JSON.parse(arr);//解析成了一个类似二维数组的形式
alert(arr[0].a);
});
</script>
需要注意的是后台传递过来的数据为字符串的形式,需要转化为JSON数组。
出现的问题及解决方案:
报错:Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError:
commons/lang/exception/NestableRuntimeException] with root cause
抛了两个错误,从后一个中可知,是缺少JOSN相关的架包。
添加commons-lang.jar即可,必须保证有如下几个包:
commons-beanutils.jar commons-collections-3.1.jar commons-lang.jar commons-logging.jar
ezmorph-1.0.6.jar json-lib-2.2.2-jdk15.jar
2 对于某 Controller 而言,只有个别方法返回JSON数据的注解:在方法前增加注解 @ResponceBody即可
3 针对整个 Controller 而言,均返回 JSON 数据的注解:@RestController 代替 @Controller 。无需在方法中注明。
4 使用ObjectMapper将数据转为Json
List<Country> list=new ArrayList<Country>();
list=createCountryList();//获取数据
return(mapper.writeValueAsString(list));//转换