1 對(duì)應(yīng)數(shù)據(jù)格式創(chuàng)建pojo類(lèi)
public class ItemCat {
//轉(zhuǎn)換成json數(shù)據(jù)時(shí)使用u作為key
@JsonProperty("u")
private String url;
@JsonProperty("n")
private String name;
@JsonProperty("i")
private List<?> item;
}
2 返回值pojo
public class ItemCatResult {
private List<?> data;
public List<?> getData() {
return data;
}
public void setData(List<?> data) {
this.data = data;
}
}
3 service層(理解遞歸遍歷的思想)
@Service
public class ItemCatServiceImpl implements ItemCatService {
@Autowired
private TbItemCatMapper itemCatMapper;
@Override
public ItemCatResult queryAllCategory() throws Exception {
ItemCatResult result = new ItemCatResult();
result.setData(getItemCatList(0l));
return result;
}
/**
* 查詢分類(lèi)列表
* <p>Title: getItemCatList</p>
* <p>Description: </p>
* @param parentid
* @return
*/
private List<?> getItemCatList(long parentid) {
TbItemCatExample example = new TbItemCatExample();
Criteria criteria = example.createCriteria();
//查詢parentid為0的分類(lèi)信息
criteria.andParentIdEqualTo(parentid);
List<TbItemCat> list = itemCatMapper.selectByExample(example);
List dataList = new ArrayList();
for (TbItemCat tbItemCat : list) {
//判斷是否為父節(jié)點(diǎn)
if (tbItemCat.getIsParent()) {
ItemCat itemCat = new ItemCat();
itemCat.setUrl("/category/" + tbItemCat.getId() + ".html");
itemCat.setName(tbItemCat.getName());
//遞歸調(diào)用
itemCat.setItem(getItemCatList(tbItemCat.getId()));
//添加到列表
dataList.add(itemCat);
} else {
String catItem = "/item/" + tbItemCat.getId() + ".html|" + tbItemCat.getName();
dataList.add(catItem);
}
}
return dataList;
}
}
4 controller層
TbItemcat表:
在maven中毫玖,當(dāng)我們使用分布式結(jié)構(gòu)時(shí)昭抒,建立多個(gè)web項(xiàng)目,啟動(dòng)多個(gè)服務(wù)器時(shí)候施无,服務(wù)器與服務(wù)器之間的請(qǐng)求響應(yīng)就涉及到跨域的問(wèn)題条篷,跨域問(wèn)題:瀏覽器一個(gè)安全的限制,不允許js跨域請(qǐng)求資源饼记。
如圖:
要返回json數(shù)據(jù)凡橱,還需要使用回調(diào)方法把json數(shù)據(jù)包裝起來(lái)。所以需要controller添加回調(diào)支持按咒,不能直接返回一個(gè)ItemCatResult對(duì)象迟隅。
方法一 :
使用MappingJacksonValue對(duì)象包裝返回結(jié)果但骨,并設(shè)置jsonp的回調(diào)方法。
@RequestMapping("/all")
@ResponseBody
public MappingJacksonValue queryAll(String callback) throws Exception {
//查詢分類(lèi)列表
ItemCatResult result = itemCatService.queryAllCategory();
//包裝jsonp
MappingJacksonValue jacksonValue = new MappingJacksonValue(result);
//設(shè)置包裝的回調(diào)方法名
jacksonValue.setJsonpFunction(callback);
return jacksonValue;
}
方法二:
先把ItemCatResult對(duì)象轉(zhuǎn)換成json字符串智袭,然后使用字符串拼接的方法拼裝成jsonp格式的數(shù)據(jù)奔缠。需要設(shè)置相應(yīng)結(jié)果的MediaType。
@RequestMapping(value="/all", produces=MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8")
@ResponseBody
public String queryAll(String callback) throws Exception {
//查詢分類(lèi)列表
ItemCatResult result = itemCatService.queryAllCategory();
//把對(duì)象轉(zhuǎn)換成json數(shù)據(jù)
String jsonResult = JsonUtils.objectToJson(result);
//拼接字符串
String resultStr = callback + "(" + jsonResult + ");";
return resultStr;
}
5 頁(yè)面實(shí)現(xiàn)
顯示效果: