研究了代码,想通过 自定义 RequestMappingHandlerAdapter子类处理,但是这样就不能用 <mvc:annotation-driven> 标签了。后来发现<mvc:annotation-driven> 里面可以自定义类型解析:<mvc:argument-resolvers>
这样就简单了:
数据类:
public class DtReq { private Integer draw; private Integer start = 0; private Integer length = 30; private List<DtReqCol> columns; private String searchValue; private String searchIndex; private Map<String, String> search; public DtReq() { columns = new ArrayList<>(); search = new HashMap<>(); } public Integer getDraw() { return draw; } public void setDraw(Integer draw) { this.draw = draw; } public Integer getStart() { return start; } public void setStart(Integer start) { this.start = start; } public Integer getLength() { return length; } public void setLength(Integer length) { this.length = length; } public List<DtReqCol> getColumns() { return columns; } public void setColumns(List<DtReqCol> columns) { this.columns = columns; } public Map<String, String> getSearch() { return search; } public void setSearch(Map<String, String> search) { this.search = search; } public String getSearchValue() { return searchValue; } public void setSearchValue(String searchValue) { this.searchValue = searchValue; } public String getSearchIndex() { return searchIndex; } public void setSearchIndex(String searchIndex) { this.searchIndex = searchIndex; } } public class DtReqCol { private String data; private String name; private Boolean searchable; private Boolean orderable; private String searchValue; private Boolean searchRegex; public DtReqCol() { } public String getData() { return data; } public void setData(String data) { this.data = data; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Boolean getSearchable() { return searchable; } public void setSearchable(Boolean searchable) { this.searchable = searchable; } public Boolean getOrderable() { return orderable; } public void setOrderable(Boolean orderable) { this.orderable = orderable; } public String getSearchValue() { return searchValue; } public void setSearchValue(String searchValue) { this.searchValue = searchValue; } public Boolean getSearchRegex() { return searchRegex; } public void setSearchRegex(Boolean searchRegex) { this.searchRegex = searchRegex; } } public class DtReqResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return DtReq.class.equals(parameter.getParameterType()); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { DtReq req = new DtReq(); req.setDraw(getInteger("draw", webRequest)); req.setStart(getInteger("start",0, webRequest)); req.setLength(getInteger("length",30, webRequest)); Iterator<String> itName = webRequest.getParameterNames(); String lastName = "startColumn"; while (itName.hasNext()) { String name = itName.next(); if (name.startsWith(lastName)) { continue; } if (name.startsWith("columns[")) { int p = name.indexOf(']'); String colName = name.substring(0, p+1); DtReqCol col = new DtReqCol(); col.setData(webRequest.getParameter(colName+"[data]")); col.setName(webRequest.getParameter(colName+"[name]")); col.setSearchable(Boolean.parseBoolean(webRequest.getParameter(colName+"[searchable]"))); col.setOrderable(Boolean.parseBoolean(webRequest.getParameter(colName+"[orderable]"))); col.setSearchValue(webRequest.getParameter(colName+"[search][value]")); col.setSearchRegex(Boolean.parseBoolean(webRequest.getParameter(colName+"[search][regex]"))); req.getColumns().add(col); lastName = colName; } else if ("search[value]".equals(name)) { req.setSearchValue(webRequest.getParameter(name)); } else if ("search[regex]".equals(name)) { req.setSearchIndex(webRequest.getParameter(name)); } } return req; } private Integer getInteger(String draw, NativeWebRequest webRequest) { String p = webRequest.getParameter(draw); return p!=null ? Integer.parseInt(p):null; } private Integer getInteger(String draw, Integer defaultV, NativeWebRequest webRequest) { String p = webRequest.getParameter(draw); return p!=null ? Integer.parseInt(p):defaultV; } }
最后在xml中注册 argument-resolver:
<mvc:annotation-driven> <mvc:argument-resolvers> <bean class="DtReqResolver" /> </mvc:argument-resolvers> </mvc:annotation-driven>
使用时,直接将 DataTableInput作为controller的参数即可,不需要加任何 annotation.
最后附Jquery data tables 参数例子:
draw:1 columns[0][data]:id columns[0][name]: columns[0][searchable]:true columns[0][orderable]:false columns[0][search][value]: columns[0][search][regex]:false columns[1][data]:username columns[1][name]: columns[1][searchable]:true columns[1][orderable]:false columns[1][search][value]: columns[1][search][regex]:false columns[2][data]:nickname columns[2][name]: columns[2][searchable]:true columns[2][orderable]:false columns[2][search][value]: columns[2][search][regex]:false columns[3][data]:id columns[3][name]: columns[3][searchable]:true columns[3][orderable]:false columns[3][search][value]: columns[3][search][regex]:false start:0 length:10 search[value]: search[regex]:false