`
dwangel
  • 浏览: 261935 次
社区版块
存档分类
最新评论

实现Spring的HandlerMethodArgumentResolver接口处理Datatables参数

阅读更多
一开始用@ModelAttribute标签来自动映射类,不符合 spring bean的映射规则。
研究了代码,想通过 自定义 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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics