package org.hepx.jgt.common.web.resolver; import org.apache.commons.lang.StringUtils; import org.hepx.jgt.common.datatable.Column; import org.hepx.jgt.common.datatable.Order; import org.hepx.jgt.common.datatable.RequestParams; import org.hepx.jgt.common.datatable.Search; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import org.springframework.web.util.WebUtils; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 专门用来解析,jquery datatable与后台交互传参接收转换 * 前台传参格式 * draw:1 * columns[0][data]:webName * columns[0][name]: * columns[0][searchable]:true * columns[0][orderable]:true * columns[0][search][value]: * columns[0][search][regex]:false * columns[1][data]:webUrl * columns[1][name]: * columns[1][searchable]:true * columns[1][orderable]:true * columns[1][search][value]: * columns[1][search][regex]:false * columns[2][data]:webType * columns[2][name]: * columns[2][searchable]:true * columns[2][orderable]:true * columns[2][search][value]: * columns[2][search][regex]:false * columns[3][data]:filing * columns[3][name]: * columns[3][searchable]:true * columns[3][orderable]:true * columns[3][search][value]: * columns[3][search][regex]:false * order[0][column]:0 * order[0][dir]:asc * start:0 * length:20 * search[value]: * search[regex]:false * * @author: Koala * @Date: 14-8-28 下午5:07 * @Version: 1.0 */ public class DataTableHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return RequestParams.class.equals(parameter.getParameterType()); } @Override public RequestParams resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { RequestParams requestParams =new RequestParams(); HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); Integer draw=Integer.parseInt(request.getParameter("draw")); requestParams.setDraw(draw); Integer start=Integer.parseInt(request.getParameter("start")); requestParams.setStart(start); Integer length=Integer.parseInt(request.getParameter("length")); requestParams.setLength(length); requestParams.setSearch(parseSearch(request)); requestParams.setOrders(parseOrders(request)); requestParams.setColumns(parseColumns(request)); requestParams.setPage(start/length); return requestParams; } /** * 解析 查询参数 * @param request * @return */ private Search parseSearch(HttpServletRequest request){ Map<String,Object> search_map= WebUtils.getParametersStartingWith(request,"search"); if(search_map!=null){ Search s=new Search(); s.setRegex(Boolean.parseBoolean((String) search_map.get("[regex]"))); s.setValue((String) search_map.get("[value]")); return s; }else{ return null; } } /** * 解析列参数 * @param request * @return */ private List<Column> parseColumns(HttpServletRequest request){ List<Column> columns =null; String param= "columns"; Map<String,Object> column_map=WebUtils.getParametersStartingWith(request,param); if(column_map!=null && column_map.size()>0){ columns=new ArrayList<Column>(); Set<String> keys=column_map.keySet(); int index=getMaxIndex(keys); for(int i=0;i<=index;i++){ Map<String,Object> index_map=WebUtils.getParametersStartingWith(request,param+"["+i+"]"); if(index_map!=null){ Column c=new Column(); c.setName((String)index_map.get("[name]")); c.setData((String) index_map.get("[data]")); c.setOrderable(Boolean.parseBoolean((String) index_map.get("[orderable]"))); c.setSearchable(Boolean.parseBoolean((String) index_map.get("[searchable]"))); columns.add(c); } } } return columns; } /** * 解析排序参数 * @param request * @return */ private List<Order> parseOrders(HttpServletRequest request){ List<Order> orders=null; String param="order"; Map<String,Object> order_map=WebUtils.getParametersStartingWith(request,param); if(order_map!=null && order_map.size()>0){ orders=new ArrayList<Order>(); Set<String> keys=order_map.keySet(); int index=getMaxIndex(keys); for(int i=0;i<=index;i++){ Map<String,Object> index_map=WebUtils.getParametersStartingWith(request,param+"["+i+"]"); if(index_map!=null){ Order o=new Order(); o.setColumn(Integer.parseInt((String) index_map.get("[column]"))); o.setDir((String) index_map.get("[dir]")); orders.add(o); } } } return orders; } /** * 获得参数列表中的最大值 * @param keys * @return */ private int getMaxIndex(Set<String>keys){ Pattern pattern = Pattern.compile("\\[(\\d+?)\\]"); List<Integer>arrs=new ArrayList<Integer>(); for(String s:keys){ Matcher matcher = pattern.matcher(s); matcher.find(); String v=matcher.group(1); if(StringUtils.isNotEmpty(v)){ arrs.add(Integer.parseInt(v)); } } return Collections.max(arrs); } }