在项目中需要写一个接口,返回json字符串,供别系统调用,返回格式如下:
具体怎么实现呢,下面以代码与注释进行讲解如何实现的,我这里用两种方式,一是用处理response,第二种方法用spring自带的功能。
第一种实现方式:
首先要有个controller,当然我这里写的是一个很简单的实现,只是体现了实现原理,
@RequestMapping(value = "json/blog/{test}")
public String blog(@PathVariable(value = "test") String test,
HttpServletResponse response) {
List<User> userList = new ArrayList<User>();
User userOne = new User("jack","1001","60","25");
User userTwo = new User("jackson","1002","80","20");
userList.add(userOne);
userList.add(userTwo);
return ajaxJson(response, getJson(userList));
}
在上面这段代码中用到了getJson和ajaxJson方法,这是两个被封装了的方法。getJson(Object)就是很简单的将对象转换为json串,第二个是对reponse做一定的处理,getJson代码如下:
private static Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
.setDateFormat("yyyy-MM-dd HH:mm:ss").create();
/**
* 功能描述:根据Object输出JSON字符串
*/
public String getJson(Object jsonObject) {
return gson.toJson(jsonObject);
}
ajaxJson方法的代码如下:
public String ajaxJson(HttpServletResponse response,String jsonString) {
return ajax(response,jsonString, "text/html");
}
public String ajax(HttpServletResponse response, String content, String type) {
try {
response.setContentType(type + ";charset=UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.getWriter().write(content);
response.getWriter().flush();
} catch (IOException e) {
log.error("IOException:", e);
}
return null;
}
// 此方法为添加缓存,varnich缓存
public void setCache(HttpServletResponse response, String cacheTime) {
long now = System.currentTimeMillis();
long cacheTimeLong = Long.parseLong(cacheTime);
response.setDateHeader("Expires", now + cacheTimeLong);
response.setDateHeader("Last-Modified", now - (now % cacheTimeLong));
response.setHeader("Cache-Control", "max-age=" + cacheTime+",s-maxage="+ cacheTime);
response.setHeader("Pragma", "Pragma");
}
第二种实现方式就很简单了,controller修改如下:
@RequestMapping(value = "json/blog/{test}")
@ResponseBody
public List<User> blog(@PathVariable(value = "test") String test,
HttpServletResponse response) {
List<User> userList = new ArrayList<User>();
User userOne = new User("jack","1001","60","25");
User userTwo = new User("jackson","1002","80","20");
userList.add(userOne);
userList.add(userTwo);
return userList;
}
一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。看来spring够强大啊,记录下,不过如果用第二种方式的话,如何添加页面缓存和处理callback还有待研究,请大神指点一二!!!