服务器端返回的是json字符串,因此可以通过jsonEval函数来转换成json对象。然后从中取出datatables需要的关键数据:
var returnData = {};
returnData.draw = json.result.vo.mo.draw;
returnData.recordsTotal = json.result.count;//返回数据全部记录
returnData.recordsFiltered = json.result.count;//后台不实现过滤功能,每次查询均视作全部结果
returnData.data = json.result.list;//返回的数据列表
return JSON.stringify(returnData);//这几个参数都是datatable需要的,必须要
1
2
3
4
5
6
QINGE.jsonEval(response)函数的具体内容如下:
jsonEval : function(data) {
try {
if ($.type(data) == 'string')
return eval('(' + data + ')');
else
return data;
} catch (e) {
return {};
}
},
1
2
3
4
5
6
7
8
9
10
这样的话,针对客户端传递到服务器端的参数和接收服务器端返回的数据就处理完成了,接下来我们来看Java端(也就是SpringMVC)来如何接收分页请求和响应分页数据。
首先来看controller:
@SuppressWarnings({ "rawtypes", "unchecked" }) @RequestMapping(value = "list") public void list(HttpServletResponse response) { Map result = new HashMap(); // 获取列表参数 BaseConditionVO vo = getBaseConditionVOForTable(); vo.addParams("uid", InfoEL.getMemberUid()); String p = getPara("p", "trade"); if ("self".equals(p)) { result.put("vo", vo); result.put("count", selfOrderService.countTotal(vo)); result.put("list", selfOrderService.getList(vo, vo.createRowBounds())); renderJsonDone(response, result); } }
其中BaseConditionVO 为分页的请求参数,里面包含如下属性:
public static int PAGE_SHOW_COUNT = 50;// 默认一页为50行 private int pageNum = 1;//第几页 private int numPerPage = 0;// 一页显示多少行数据 private long totalCount = 0;// 总页数 private String orderField = "";// 排序字段 private String orderDirection = "";// 排序方式 /** * @Fields ps : 对参数类型进行封装,同时方便存储其他参数 */ private Map<String, Object> mo = new HashMap<String, Object>();
其中renderJsonDone为返回json字符串的方法:
private void renderJson(HttpServletResponse response, String jsonText) { PrintWriter writer = null; try { response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType(contentType); writer = response.getWriter(); writer.write(jsonText); writer.flush(); } catch (IOException e) { throw new OrderException(e.getMessage()); } finally { if (writer != null) writer.close(); } } protected void renderJsonDone(HttpServletResponse response, final Object value) { Map<String, Object> map = new HashMap<String, Object>(); map.put("statusCode", 200); map.put("result", value); String jsonText = JSON.toJSONString(map); renderJson(response, jsonText); }
那么,SpringMVC是怎么分页的呢?关键方法就在:
result.put("count", selfOrderService.countTotal(vo));// 计算总页数
result.put("list", selfOrderService.getList(vo, vo.createRowBounds()));// 获取分页
对于SpringMVC来说,其强大的集成功能就在于此,我们只需要按照这种方式将RowBounds:vo.createRowBounds()对象传递给Mybatis,Mybatis就会自己帮我们处理好分页,我们并不需要关注分页的具体细节。
先来来看Mybatis的处理:
<!--列 --> <sql id="Base_Column_List"> so.* </sql> <sql id="queryJoins"> </sql> <sql id="Base4List"> from otm_self_order so <include refid="queryJoins"/> where so.del_flag = 0 <if test="mo.status != null"> and so.status = #{mo.status} </if> <if test="mo.uid != null"> and so.uid = #{mo.uid} </if> <if test="mo.cancel != null"> and so.cancel = #{mo.cancel} </if> </sql> <select id="getList" resultMap="BaseResultMap" parameterType="map"> select <include refid="Base_Column_List" /> <include refid="Base4List" /> <choose> <when test="orderField !=null and orderField !=''"> ORDER BY ${orderField} <if test="orderDirection != null and orderDirection != ''">${orderDirection}</if> </when> <otherwise> order by so.update_date DESC </otherwise> </choose> </select> <select id="countTotal" resultType="java.lang.Integer" parameterType="map"> select count(0) <include refid="Base4List" /> </select>
好了,说完了客户端和服务器端的处理细节,我们来看一下具体的服务器端返回数据形式,通过Chrome浏览器的network面板就可以观察到,如下图:
