一.两种方式可以返回JSON对象
1.使用@ResponseBody进行直接返回,这种方式适合于如果页面是各种UI框架的数据表格,提示只要返回对应的JSON格式的数据,框架就可以帮你拼装的类型
比如:
@RequestMapping(value="getAllUser")
public @ResponseBody String getAllUser(HttpServletResponse resp,@RequestParam(value="pager.pageNo") String pageNo){
List<UserDemo> list = userDemoService.findList();
int count = userDemoService.findCount();
Map<String, Object> map = Maps.newHashMap();
map.put("rows", list);
map.put("pager.totalRows", count);
map.put("pager.pageNo", pageNo);
String s = JsonMapper.toJsonString(map);
return s;
}
返回页面需要的JSON格式即可,可以通过UI框架的官网DEMO,看到请求和响应的参数(响应的JSON格式,分页的数据的KEY等等)
2.直接放在request域中,然后通过request封装组件返回(Map,ModelMap.Model等),然后返回到javascript再进行封装,前提是UI框架提供了树、数据表格等页面元素的初始化参数
比如:
后台
@RequestMapping(value="index")
public String index(Model model){
List<TreeDemo> treeDemos = treeDemoService.getAllTreeNote();
model.addAttribute("treeDemos", treeDemos);
logger.warn("...................................index");
return "modules/treeDemo/treeIndex";
}
前台UI提供了参数的放置地点
var zNodes1 =[
<c:forEach items="${treeDemos}" var="td" varStatus="tdSta">
<c:if test="${tdSta.count != 1}">
,
</c:if>
{id:'${td.id}',parentId:'${td.parentId }',open:true,name:'${td.name}',url:urlbath + '${td.url}',target:'${td.target}',title:'${td.title}'}
</c:forEach>
//{id:'1111', parentId:'11111',open:true, name:"商业部",url:'AAA',target:'AAA',title:'AAA'}
];
function initComplete(){
var layout=$("#layout1").layout({ leftWidth: 500});
var ztree = $.fn.zTree.init($("#myTree"), setting1, zNodes1);}
注意 initComplete是qui的一种初始化方法,这里我们需要网zNode1这个参数中传递需要的json字符串
可以在js中初始化这个List<Map>形式的JSON,将后台返回的treeDemo直接传递c:forEach中遍历即可
二:ModelAndView和Model的区别
如果使用ModelAndView就要返回ModelAndView,而不能去返回String的URL地址,那么会造成AddObject中的参数丢失
比如:
@RequestMapping(value="index")
public String index(Model model){
List<TreeDemo> treeDemos = treeDemoService.getAllTreeNote();
//model.addAttribute("treeDemos", treeDemos);
ModelAndView andView = new ModelAndView();
andView.addObject("treeDemos",treeDemos);
logger.warn("...................................index");
return "modules/treeDemo/treeIndex";
}
这样就会造成参数丢失
应使用
@RequestMapping(value="index")
public String index(Model model){
List<TreeDemo> treeDemos = treeDemoService.getAllTreeNote();
model.addAttribute("treeDemos", treeDemos);
logger.warn("...................................index");
return "modules/treeDemo/treeIndex";
}
三:c:forEach注意事项
<C:ForEach>的实现逻辑是将参数取出然后再次放入Request域中以var varStatus表示,仅仅在循环体中这个参数才能有效果
因此,在使用varStatus需要注意也要加上${}去取,容易忘记
var zNodes1 =[
<c:forEach items="${treeDemos}" var="td" varStatus="tdSta">
<c:if test="${tdSta.count != 1}">
,
</c:if>
{id:'${td.id}',parentId:'${td.parentId }',open:true,name:'${td.name}',url:urlbath + '${td.url}',target:'${td.target}',title:'${td.title}'}
</c:forEach>
//{id:'1111', parentId:'11111',open:true, name:"商业部",url:'AAA',target:'AAA',title:'AAA'}
];