datatables中columns提交的数据怎么转成对象呢?(已解决)

找了两个例子但是都是spring,没有jfinal求大神指点:  

https://github.com/rakurakupg/springmvc-jquerydatatables-example 

https://github.com/sleepiejohn/spring-data-datatables-integration

补充:

写了一个方法实现了datatbales转javabean,通过jfianl的getKv获取所有params然后遍历去处理!谢谢@jfinal帮助 !

	public static DataSrc getDatatablesJavaBean(Kv k) {
		Set<String> keySet = k.keySet();
		DataSrc dataSrc = new DataSrc();
		for (String key : keySet) {
			if (key.contains("columns")) {
				int i = Integer.parseInt(key.substring(key.indexOf("[")+1, key.indexOf("]")));
				Column column = null;
				if (dataSrc.getColumns().containsKey(i)) {
					column = dataSrc.getColumns().get(i);
				}else {
					column = new Column();
				}
				if (key.contains("[data]")) {
					column.setData(k.getStr(key));
				}else if(key.contains("[name]")) {
					column.setName(k.getStr(key));
				}else if(key.contains("[searchable]")) {
					column.setSearchable(Boolean.parseBoolean(k.getStr(key)));
				}else if(key.contains("[orderable]")) {
					column.setOrderable(Boolean.parseBoolean(k.getStr(key)));
				}else if(key.contains("[search][value]")) {
					column.getSearch().setValue(k.getStr(key));
				}else if(key.contains("[search][regex]") ) {
					/*System.out.println("key [search][regex] :" + key);
					System.out.println("key [search][regex] :" +  k.getStr(key));
					System.out.println("column.getSearch(): " + column.getSearch());*/
					column.getSearch().setRegex(Boolean.parseBoolean(k.getStr(key)));
				}
				dataSrc.getColumns().put(i, column);
			}else if (key.contains("order")) {
				int i = Integer.parseInt(key.substring(key.indexOf("[")+1, key.indexOf("]")));
				Order order = null;
				if (dataSrc.getOrder().containsKey(i)) {
					order = dataSrc.getOrder().get(i);
				}else {
					order = new Order();
				}
				if (key.contains("[column]")) {
					
					order.setColumn(Integer.valueOf(k.getStr(key)));
				}else if(key.contains("[dir]")) {
					order.setDir(k.getStr(key));
				}
				dataSrc.getOrder().put(i, order);
			}else if (key.equals("start")) {
				dataSrc.setStart(Integer.valueOf(k.getStr(key)));
			}else if (key.equals("length")) {
				dataSrc.setLength(Integer.valueOf(k.getStr(key)));
			}else if (key.equals("search[value]")) {
				dataSrc.getSearch().setValue((k.getStr(key)));
			}else if (key.equals("search[regex]")) {
				dataSrc.getSearch().setRegex(Boolean.parseBoolean(k.getStr(key)));
			}
		}
		return dataSrc;
	}


Controller中调用下面的方法无效:

DataSrc dataSrc = getBean(DataSrc.class);

System.out.println(dataSrc.getColumns().size());

无效

前端提交的数据:

draw: 4
columns[0][data]: 
columns[0][name]: 
columns[0][searchable]: true
columns[0][orderable]: true
columns[0][search][value]: 
columns[0][search][regex]: false
columns[1][data]: function
columns[1][name]: 
columns[1][searchable]: true
columns[1][orderable]: true
columns[1][search][value]: 
columns[1][search][regex]: false
columns[2][data]: bianhao
columns[2][name]: 
columns[2][searchable]: true
columns[2][orderable]: true
columns[2][search][value]: 
columns[2][search][regex]: false
columns[3][data]: changjia
columns[3][name]: 
columns[3][searchable]: true
columns[3][orderable]: true
columns[3][search][value]: 
columns[3][search][regex]: false
columns[4][data]: pinzhong
columns[4][name]: 
columns[4][searchable]: true
columns[4][orderable]: true
columns[4][search][value]: 
columns[4][search][regex]: false
columns[5][data]: cangku
columns[5][name]: 
columns[5][searchable]: true
columns[5][orderable]: true
columns[5][search][value]: 
columns[5][search][regex]: false
columns[6][data]: caizhi
columns[6][name]: 
columns[6][searchable]: true
columns[6][orderable]: true
columns[6][search][value]: 
columns[6][search][regex]: false
columns[7][data]: guige
columns[7][name]: 
columns[7][searchable]: true
columns[7][orderable]: true
columns[7][search][value]: 
columns[7][search][regex]: false
columns[8][data]: zhongliang
columns[8][name]: 
columns[8][searchable]: true
columns[8][orderable]: true
columns[8][search][value]: 
columns[8][search][regex]: false
columns[9][data]: weizhi
columns[9][name]: 
columns[9][searchable]: true
columns[9][orderable]: true
columns[9][search][value]: 
columns[9][search][regex]: false
columns[10][data]: beizhu
columns[10][name]: 
columns[10][searchable]: true
columns[10][orderable]: true
columns[10][search][value]: 
columns[10][search][regex]: false
columns[11][data]: function
columns[11][name]: 
columns[11][searchable]: true
columns[11][orderable]: true
columns[11][search][value]: 
columns[11][search][regex]: false
columns[12][data]: function
columns[12][name]: 
columns[12][searchable]: true
columns[12][orderable]: true
columns[12][search][value]: 
columns[12][search][regex]: false
columns[13][data]: liubanjieru
columns[13][name]: 
columns[13][searchable]: true
columns[13][orderable]: true
columns[13][search][value]: 
columns[13][search][regex]: false
columns[14][data]: function
columns[14][name]: 
columns[14][searchable]: true
columns[14][orderable]: true
columns[14][search][value]: 
columns[14][search][regex]: false
columns[15][data]: LB_time
columns[15][name]: 
columns[15][searchable]: true
columns[15][orderable]: true
columns[15][search][value]: 
columns[15][search][regex]: false
columns[16][data]: cancelUserName
columns[16][name]: 
columns[16][searchable]: true
columns[16][orderable]: true
columns[16][search][value]: 
columns[16][search][regex]: false
columns[17][data]: cancelTime
columns[17][name]: 
columns[17][searchable]: true
columns[17][orderable]: true
columns[17][search][value]: 
columns[17][search][regex]: false
columns[18][data]: stockOutTime
columns[18][name]: 
columns[18][searchable]: true
columns[18][orderable]: true
columns[18][search][value]: 
columns[18][search][regex]: false
columns[19][data]: saleTime
columns[19][name]: 
columns[19][searchable]: true
columns[19][orderable]: true
columns[19][search][value]: 
columns[19][search][regex]: false
order[0][column]: 11
order[0][dir]: asc
start: 0
length: 500
search[value]: 
search[regex]: false


后端写的javaBean:

package com.steel.datatables;

import java.util.List;


public class DataSrc {
	private List<Column> columns;
	private List<Order> order;
	private Integer start;
	private Integer length;
	private Search search;
	public List<Column> getColumns() {
		return columns;
	}
	public void setColumns(List<Column> columns) {
		this.columns = columns;
	}
	public List<Order> getOrder() {
		return order;
	}
	public void setOrder(List<Order> order) {
		this.order = order;
	}
	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 Search getSearch() {
		return search;
	}
	public void setSearch(Search search) {
		this.search = search;
	}
	
}


Column:

package com.steel.datatables;

public class Column {
	private String data;
	private String name;
	private boolean searchable;
	private boolean orderable;
	private Search search;
	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 isSearchable() {
		return searchable;
	}
	public void setSearchable(boolean searchable) {
		this.searchable = searchable;
	}
	public boolean isOrderable() {
		return orderable;
	}
	public void setOrderable(boolean orderable) {
		this.orderable = orderable;
	}
	public Search getSearch() {
		return search;
	}
	public void setSearch(Search search) {
		this.search = search;
	}
	
}


order:

package com.steel.datatables;

public class Order {
	private Integer column;
	private String dir;

	public Integer getColumn() {
		return column;
	}

	public void setColumn(Integer column) {
		this.column = column;
	}

	public String getDir() {
		return dir;
	}

	public void setDir(String dir) {
		this.dir = dir;
	}

}


search:

package com.steel.datatables;

public class Search {
	private String value;
	private boolean regex;
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	public boolean isRegex() {
		return regex;
	}
	public void setRegex(boolean regex) {
		this.regex = regex;
	}
	
}


评论区

JFinal

2020-08-23 15:39

核心在于看一下 eclipse/IDEA 控制台输出的 jfinal action report 中的 parameter 这一栏,根据这一栏中的格式,选择合适的 getBean、getModel、getPara 方法

假定输出是这样的:
columns[0][data]:
columns[0][name]:
columns[0][searchable]: true
columns[0][orderable]: true

那么代码是:
getBean(DataSrc.class, "columns[0]", true);

注意,如果你的 DataSrc 有相应的 setter 方法就用 getBean,否则用 getModel

回到你的具体需求,你的 columns[X] 中的 X 值是变化的,所以,你只需要用一个 for 循环即可:
for (int X=0; X《 len; X++) {
DataSrc ds = getBean(DataSrc.class, "columns[" + X + "]", true);
list.add(ds);
}

最后,你的 DataSrc 下面还有 List《Column》 columns, 这种多级 model 结构,这种场景,使用 json 传数据是最好的,具体传递方式见下一条回复

JFinal

2020-08-23 15:44

先创建如下函数,可以将表单数据转成 json 字符串
function formToJsonString(formId) {
var paramArray = $('#' + formId).serializeArray();
// 表单参数转 json 对象
var jsonObj = {};
$(paramArray).each(function() {
jsonObj[this.name] = this.value;
});

// json 对象转 json 字符串
return JSON.stringify(jsonObj);
}

然后用如下函数发送 json 字符串到后端:
$.ajax({
type: "post",
url: "http://localhost/action",
contentType: 'application/json; charset=UTF-8', // 关键参数
dataType: 'json',
data: formToJsonString("表单id"),
success: function(ret) {
}
});

注意,关键参数是 contentType: 'application/json; charset=UTF-8'

将所有数据以 string 格式发送到后端以后,再用如下代码转成 json :
String jsonStr = getRawData();
Map map = FastJson.getJson().parse(jsonStr, Map.class);

转成 map 以后,再转成各种 jave bean 就方便多了,并且 fastjson 也有比较智能的方法转为更符合你要求的类型,这个你看一下 fastjson 的 parse 方法

fmpoffice

2020-08-23 20:03

@JFinal 谢谢老哥,回复,我也写了另一个比较笨的方法,可以用了,回头补充这个帖子

JFinal

2020-08-23 23:14

@fmpoffice 期待分享

fmpoffice

2020-08-24 16:54

@JFinal 以补充到这个帖子了哈

热门反馈

扫码入社