jQuery DataTable使用时不能把请求参数绑定到javabean对象中
2014-07-30 02:56
447 查看
故事前提:最近项目中有使用到bootstrap框架,为了风格统一,于是后台表格分页显示插件选用了DataTable。DataTable是一款基于jquery开发的table控件,且风格统一于bootstrap,所以感觉选择这个控件是不错的选择。国内介绍 DataTable 插件的文档还是不多,且很多都是基于version 1.9之前的老版本使用。我选择的是最新的1.10版,和之前的历史版本有较大区别,这里也是我项目中使用遇到的比较麻烦的问题,耗时1天半才搞定,所以在此撰写此文,希望有童谣问题的童鞋能有所收获。注:DataTable官方文档问题描述:DataTable常用参数配置:
table = $('#dataTables-news').dataTable( { lengthMenu : [10, 25, 50], processing: true, serverSide: true, ajax: { url: "./news/queryPageNews.htm", data : function(data) { for (var i = 0; i < data.columns.length; i++) { column = data.columns[i]; column.searchRegex = column.search.regex; column.searchValue = column.search.value; delete(column.search); } } }, columnDefs: [ { "targets": [ 0 ], "visible": false } ], columns: [ { "data": "newsId","name":"news_id","searchable" : false}, { "data": "newsTitle" ,"name":"news_title"}, { "data": "newsType.newsTypeName" ,"name":"news_type" }, { "data": "newsAuthor" ,"name":"news_author","orderable" : false}, { "data": "newsReleaseTime" ,"name":"news_release_time","searchable" : false,"orderable" : false}, { "data": "newsKeywords" ,"name":"news_keywords","searchable" : false,"orderable" : false}, { "data": null, "orderable" : false, "className": "center", } ] } );columns:是用来定义表格列相关详细配置,关系数据回调后的解析、是否可查询、查询时字段名称等问题,是一般开发者最为关注的配置项之一。DataTable支持浏览器端和服务器端的分页。客户端分页较为简单,当使用服务器端分页时,问题就复杂了点,要设计字段排序。插件通过Ajax发送一个请求给服务器端,传递相关参数,具体如下:draw(integer):Drawcounter。用来保证从服务器端异步返回的结果按照序列绘制,可以有效防止跨域攻击。start(integer):开始页码length(integer):单页显示数量search.value(string): Globalsearch valuesearch.regex(boolean):全局过滤器(不怎么在服务器端分页使用)order[i].column(integer):需要排序的列号,从0开始计数order[i].dir(string):排序的方向(desc或 asc)columns[i].data(string): definedby
columns.data 解析回调数据时使用column[i].name(string):definedby
columns.name 排序的字段名称使用这个
columns[i].searchable(boolean): 指定该列是否支持搜索
columns[i].orderable(Boolean):指定该列是否支持排序
columns[i].search.value(string):针对指定列的搜索值
columns[i].search.regex(false):标识该列是否被当做常规表达式(个人暂时未用到这个)
打开开发者工具 时,看到传递的参数格式为:
draw=1
start=1
length=20
order[0][column]=1
order[0][dir]=asc
search[value]=xxx
search[regex]=false
column[0][data]=newsName
column[0][name]=news_name
columns[0][searchable]=false
columns[0][orderable]=true
columns[0][data]=nomecolumns[0][search][regex]=false使用时,发现不配置支持字段排序时是没问题的,但是如果 配置多个column排序时,参数获取就遇到困难了,想到java bean封装类定义成如下格式:
private Integer draw ;private Integer start;private Integer length;private Map<Search, String> search = new HashMap<Search, String>();private List<Map<Order, String>> order = new ArrayList<Map<Order, String>>();private List<Map<Column, String>> columns = new ArrayList<Map<Column, String>>();public DTRequestParams() {}public enum Search {value,regex}public enum Order {column,dir}public enum Column {private String data; private String name; private boolean searchable; private boolean orderable; private Map<SearchCriterias, String> search;}//省略了getter and setter方法spring mvc 控制层的配置如下:
@RequestMapping(value="/back/news/queryPageNews",method=RequestMethod.GET)@ResponseBodypublic DTListVO queryPageNewsForAdmin(@ModelAttribute DTRequestParams dtParams,HttpServletRequest request){.......}这样数据绑定,会报错,错误信息如下:
org.springframework.beans.NullValueInNestedPathException: Invalid property 'columns' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Could not instantiate property type [com.bergermobile.rest.domain.DataTableCriterias$Column] to auto-grow nested property path: java.lang.InstantiationException: com.bergermobile.rest.domain.DataTableCriterias$Columnat org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:651)百思不得其解,最终发现错误提示是说,数据绑定出错,因为请求参数columns是一个高维数组表示形式。花了一天的时间来解决spring mvc数据绑定问题上,但最终还是没得到解决办法。最后,选择了在DataTable配置上来解决问题,最终的解决方案是处理请求参数,使之columns高维数组降维成了一位数组,问题就得到解决了。更改配置项ajax:
ajax: {url: "./news/queryPageNews.htm",data : function(data) {for (var i = 0; i < data.columns.length; i++) {column = data.columns[i];column.searchRegex = column.search.regex;column.searchValue = column.search.value;delete(column.search);}}}也就是从新构造了请求的参数。最后java bean封装类定义改成了:
private Integer draw ;private Integer start;private Integer length;private Map<Search, String> search = new HashMap<Search, String>();private List<Map<Order, String>> order = new ArrayList<Map<Order, String>>();private List<Map<Column, String>> columns = new ArrayList<Map<Column, String>>();public DTRequestParams() {}public enum Search {value,regex}public enum Order {column,dir}public enum Column {data,name,searchable,orderable,searchValue,searchRegex}注意,只是修改了Column 类。同理,省略了相应的getter setter方法。就这样,问题解决了,希望对大家有帮助,如果更完美的解决方案,欢迎交流,共同学习!!!
相关文章推荐
- 使用 POJO 对象绑定请求参数
- 使用POJO对象绑定请求参数
- Spring绑定请求参数或PathVariable参数到对象,并做使用@Valid做JSR303校验
- 契约操作不能使用引用对象作为参数,只允许使用基本类型或数据契约
- 10007---SpringMVC 使用 POJO 对象绑定请求参数值,解决中文乱码
- springmvc mybatis 配置一对多的关系使用 <association> 及实体类写法2Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配自动为该对象填充属性值。支持
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- Spring MVC对象绑定时参数不能为空
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- SpringMVC:使用 POJO 对象绑定请求参数值
- Spring MVC 使用POJO对象绑定请求参数值
- 使用@RequestMapping 定义处理器函数-通过@RequestParam元注解来将请求参数绑定到方法形参
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
- springMVC中使用List和Map绑定对象作为参数的使用方法
- SpringMVC学习(6):使用 POJO对象绑定请求参数值(
- 临时对象不能被绑定到非const引用参数上====》扩展到临时对象问题
- 使用@RequestParam绑定请求参数到方法参数
- springMVC中使用List和Map绑定对象作为参数的使用方法
- springMVC(6)------springMVC使用POJO对象绑定请求参数值
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数