springmvc与jsp传json格式的数据

这里总结已实验的两种后台与前端传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<String, List<CarTrack>> map = new HashMap<String, List<CarTrack>>();
        List<CarTrack> 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<CarTrack> doQuery()  {
        List<CarTrack> carTracks = carTrackDao.queryByClid("云ANV885");
        return carTracks ;
    }
}

怎样,简单吧。前端同上面第一种方法是一样的方法,这里不再贴代码了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,286评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,787评论 25 709
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,317评论 6 13
  • 轰! 魔帝尸骸的身躯,在此时猛的爆炸开来,顿时间滔天般的魔气滚滚肆虐,犹如万里黑云,笼罩在了祭坛的上空。 这一幕,...
    混沌天书阅读 778评论 0 0
  • 今天出去买菜,没有告诉d。但在路上碰到她。我放缓车速问她是否一起出去?但是她可能没听见,没应我。而她看了我一眼后回...
    西瓦阅读 291评论 0 0