jfinal该如何接收页面相同名称的数组数据

QQ图片20171020152805.png

请问各位大神,@JFinal,如图家庭成员是不确定,动态的,成员的信息就是一个对象,然后提交时是对象数组,不知道这页面的name属性该是怎么个写法了以及提交到controller中该怎么获取到???

评论区

JFinal

2017-10-23 10:52

假定表名为 member,以身份证号为例,可以将 input 的 name 做成这个样子:
name="member[0].idNumber"
name="member[1].idNumber"
name="member[2].idNumber"
如上所示,可以在 modelName 上做文章,给添加上一个数组一样的号,当然,你也可以添加下划线,道理是一样的

然后在 controller 中用一个循环来获取就好了:
List memberList = new ArrayList();
for (int i=0; iMember m = getModel(Member.class, "member[" + i + "]");
memberList.add(m);
}

上面是大概的代码,仅给出思路

zlsj80

2017-10-24 14:21

@JFinal OK已搞定

小鱼儿2

2018-09-11 11:45

我这边是这样的:
页面是一个用户列表
name="user[0].id"
name="user[0].name"

name="user[1].id"
name="user[1].name"

后台接收时候对象:
public class ConThumbnail extends Model{
public void setOrderNumber(java.lang.Integer orderNumber) {
set("order_number", orderNumber);
}

public java.lang.Integer getOrderNumber() {
return get("order_number");
}
}

后台接收controller
List list = new ArrayList();
for(int i =0;i<8;i++){
User m = getModel(User.class, "user["+i+"]");
list.add(m);
}

后台还是一直报错The model attribute name is not exists.,这个怎么解决啊?我的数据库中user表中也有这个name 字段

年轻似水

2018-12-07 11:24

@zlsj80
我也碰到一样需求了 能提供下代码吗?

zlsj80

2018-12-07 14:31

@年轻似水
/**
* 将页面中的数组对象转换成List
* @param request
* @param modelClass
* @param prefix
* @return
*/
public static List batchInjectModel(final HttpServletRequest request,Class modelClass, String prefix){
List modelList = new ArrayList();
int size = getArrayLength(request, prefix);
for (int i = 0; i < size; i++)
modelList.add((T) Injector.injectModel(modelClass, prefix + "[" + i + "]", request, false));
return modelList;
}

/**
* Get array length
* @param request
* @param prefix
* @return
*/
public static int getArrayLength(final HttpServletRequest request, String prefix) {

return getArrayKeys(request, prefix).size();

}

/**
* Get array key beans[0].ID -->beans[0] beans[1].ID -->beans[1]
* @param request
* @param prefix 前缀
* @return
*/
public static Set getArrayKeys(final HttpServletRequest request, String prefix) {

Set keys = new HashSet();
String arrayPrefix = prefix + "[";
String key = null;
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
key = names.nextElement();
if (!key.startsWith(arrayPrefix))
continue;
if (key.indexOf("]") == -1)
continue;
keys.add(key.substring(0, key.indexOf("]") + 1));// Get all bean[X]
}
return keys;
}
调用方法: List beanList = ModelUtil.batchInjectModel(getRequest(),Const.class,"beans");

zlsj80

2018-12-10 17:39

@年轻似水 前端比较渣,不一定适合你,实现方式是这样的:
提交之前使用jquery修改表单元素name属性
var htmlObj = $(".family .layui-col-md12").children(".layui-form-item");
var itemLen = htmlObj.length;
for(var i=0;i $.each($(htmlObj[i]).find("input,select"),function(index,item){
if($(item).attr("class")!="layui-input layui-unselect"){
var name = $(item).attr("name");
if(name!=undefined){
if(name.indexOf(".")!=-1){
$(item).attr("name",name.split(".")[1]);
}
name = $(item).attr("name");
//此处修改name属性为 family[0].name,family[0].age
// family[1].name,family[1].age....family[n].name,family[n].age
$(item).attr("name","family["+i+"]."+name);
}
}
});
}
然后用 jquey的表单序列化方法$(form).serialize()通过ajax提交到服务器端

年轻似水

2018-12-11 10:29

@zlsj80 谢谢啦 正好我前端也是用的layui

你妹啊

2019-05-30 14:45

@JFinal 什么意思