一开始用@ModelAttribute标签来自动映射类,不符合 spring bean的映射规则。
研究了代码,想通过 自定义 RequestMappingHandlerAdapter子类处理,但是这样就不能用 <mvc:annotation-driven> 标签了。后来发现<mvc:annotation-driven> 里面可以自定义类型解析:<mvc:argument-resolvers>
这样就简单了:
数据类:
最后在xml中注册 argument-resolver:
使用时,直接将 DataTableInput作为controller的参数即可,不需要加任何 annotation.
最后附Jquery data tables 参数例子:
研究了代码,想通过 自定义 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