这里总结已实验的两种后台与前端传json格式数据的方法,后续有别的方法再做补充。
情景:我想在数据库查询相关数据,这些数据在前端需要用到json格式,所以想通过servlet返回json格式的数据,让jsp页面可以直接拿到。
1、利用MappingJacksonJsonView
什么是MappingJacksonJsonView ,看官方的API解释:
Spring MVC View
that renders JSON content by serializing the model for the current request using Jackson 1.x's ObjectMapper
.
By default, the entire contents of the model map (with the exception of framework-specific classes) will be encoded as JSON. If the model contains only one key, you can have it extracted encoded as JSON alone via setExtractValueFromSingleKeyModel(boolean)
.
大意是:对当前请求,利用Jackson的ObjectMapper将java对象转换成json对象并用序列化模型的方法表示JSON内容。那么我们就利用它来将需要的数据转换成json交给前端。
先看看后台的代码,spring mvc的controller中代码如下:
@Controller
@RequestMapping("/track")
public class CarTrackController {
@Resource(name = "carTrackDaoImp")//spring注入方式
private CarTrackDao carTrackDao;
@RequestMapping(method = { RequestMethod.POST })
@ResponseBody
protected ModelAndView doQuery(HttpServletRequest request,
HttpServletResponse response) throws IOException {
Map> map = new HashMap>();
List carTracks = carTrackDao.queryByClid("云ANV885");
map.put("1", carTracks);
ModelAndView mav = new ModelAndView("forward:/fortest.jsp");
MappingJacksonJsonView mjv = new MappingJacksonJsonView();
mjv.setAttributesMap(map);
mav.setView(mjv);
return mav;
}
}
@ResponesBody要注明,返回不是html之外的数据必须要有这个注解。这里,我在数据库查询了车牌号为“云ANV885”的车辆的GPS信息,返回是一个列表(carTracks),列表项是CarTrack对象,这个CarTrack包含很多属性(id,clid,cpys等等)。用map的方式来将json序列化。
那么jsp怎么拿到?这里可以有很多种方式,我用到jquery封装的方法:
$.post("track.do",function(data){
$.each(data,function(i,item){//each遍历map,i是下标,item是值,实际上它是carTracks列表
alert(item[0].clid); //clid是CarTrack对象中的一个属性
});
},"json");
看此外你还可以用$.get()或者$.getJSON(),这两种是get方式,上面一种是post。至于get和post的区别,我以后有空也会总结一下。这里考虑到一些数据量的问题,我用post方式。
$.post()的参数是这样的
$(selector).post(URL,data,function(data,status,xhr),dataType)
URL是请求到后台的访问方式,我这里就是track.do了,data参数是传到后台的数据,这个参数不是必须的,我上面的例子就没有这个参数,function()参数是请求成功时你要响应什么功能,我上面的例子是返回成功就alert出这个数据来,这个参数也不是必须的。最后一个参数dataType是返回的数据类型,我这里写了json,当然也可以不写,一般jquery会自己判断。除了用上面那些方法在前端得到数据,你还可以用ajax的方式,这里不再说明。
我的实验结果是,前端页面alert出了我想要的属性值,代表这种方式是成功的!
2、这一种方法会来的简单粗暴一些。上面的controll里doQuery函数返回对象是ModelAndView,其实可以将返回对象改成你查询出来的数据对象。注意,要加上@ResponseBody注解。如果处理器方法被注解@ResponseBody 标记的话,那么处理器方法的任何返回类型都会通过HttpMessageConverters 转换之后写到HttpServletResponse 中,而不会像上面的那些情况一样当做视图或者模型来处理。
@Controller
@RequestMapping("/track")
public class CarTrackController {
@Resource(name = "carTrackDaoImp")
private CarTrackDao carTrackDao;
@RequestMapping(method = { RequestMethod.POST })
@ResponseBody
protected List doQuery() {
List carTracks = carTrackDao.queryByClid("云ANV885");
return carTracks ;
}
}
怎样,简单吧。前端同上面第一种方法是一样的方法,这里不再贴代码了。