6
回答
JFinal如何接受多个model的参数。

比如我们有一个User的model。页面只要参数名字为user.age  user.name,后台可以用getModel得到 User的model然后进行保存更新工作。

 

但是现在我是需要一次性添加多条数据,request参数如下

users[0].age=11

users[0].name=1

users[1].age=22

users[1].name=2

在传统的struts2中我们可以直接用一个list<user>很方便的接受此类参数。

请问在jfinal的model中能否支持类似功能?

举报
共有6个答案 最后回答: 4年前

     @alvinte 也曾经碰到过这个需求,当时本想在Controller 中做个 getModels(...) 方法的,后来觉得这种需求可能太少,而且代码不太好看,所以留给开发者自己了。目前 JFinal 已有的功能也可以解决这个问提。只需要在表单中生成这样的input 域: user1.name  user2.name  user3.name,然后在 Controller 中这样:

for (int i=0; i<size; i++) {
  getModel(User.class, "user" + i).save();
}

    针对于你在问答中的这类形式的参数:users[0].age  users[1].age,可以这样解决:

for (int i=0; i<size; i++) {
  getModel(User.class, "user[" + i + "]").save();
}

   可以走得更远,在 YourController 方法中实现:

public List<Model> getModels(Class<? extends Model> modelClass) {
  // TODO
}

     有时间我会考虑在新版本中加入这个特性,如果哪位童鞋先实现了这个方法,可以发给我先看看 :)

--- 共有 4 条评论 ---
JFinal回复 @alvinte : 用的 String[] HttpServletRequest.getParameterValues(String),页面表单将name设置为相同,如: user.name user.name .... 6年前 回复
alvinte回复 @JFinal : getModels无非就是用约定? 6年前 回复
JFinal回复 @绝望的八皮 : 了然 6年前 回复
绝望的八皮String paraName = paraKey.substring(modelNameAndDot.length()); 看到这句就明白了~ 6年前 回复

引用来自“27号”的答案

参考实现:http://my.oschina.net/wen3062/blog/116162
@JFinal 这个参考实现挺不错的,波波有没有考虑加入到框架中呢

今天也碰到这个需求了,@27号 的实现挺不错的,但是要重写框架的实现,对框架有一定的侵入性,所以我就在我的BaseController中增加了自己的实现。我习惯提供一个自己的基类来对Controller进行扩展。同时增加了getRecord和getRecords方法,具体代码如下:

/**
	 * 获取以modelName开头的参数,并自动赋值给record对象
	 * 
	 * @author yongtree
	 * @date 2013-9-25上午9:14:00
	 * @param modelName
	 * @return
	 */
	public Record getRecord(String modelName) {
		String modelNameAndDot = modelName + ".";
		Record model = new Record();
		boolean exist = false;
		Map<String, String[]> parasMap = getRequest().getParameterMap();
		for (Entry<String, String[]> e : parasMap.entrySet()) {
			String paraKey = e.getKey();
			if (paraKey.startsWith(modelNameAndDot)) {
				String paraName = paraKey.substring(modelNameAndDot.length());
				String[] paraValue = e.getValue();
				Object value = paraValue[0] != null ? (paraValue.length == 1 ? paraValue[0]
						: StringKit.array2str(paraValue, ","))
						: null;
				model.set(paraName, value);
				exist = true;
			}
		}
		if (exist) {
			return model;
		} else {
			return null;
		}
	}

	/**
	 * 获取前端传来的数组对象并响应成Record列表
	 * @author yongtree
	 * @date 2013-9-26上午10:21:38
	 * @param modelName
	 * @return
	 */
	public List<Record> getRecords(String modelName) {
		List<String> nos = getModelsNoList(modelName);
		List<Record> list = new ArrayList<Record>();
		for (String no : nos) {
			Record r = getRecord(modelName + "[" + no + "]");
			if (r != null) {
				list.add(r);
			}
		}
		return list;
	}

	/**
	 * 获取前端传来的数组对象并响应成Model列表
	 * @author yongtree
	 * @date 2013-9-26上午10:22:38
	 * @param modelClass
	 * @param modelName
	 * @return
	 */
	public List<T> getModels(Class<T> modelClass, String modelName) {
		List<String> nos = getModelsNoList(modelName);
		List<T> list = new ArrayList<T>();
		for (String no : nos) {
			T m = getModel(modelClass, modelName + "[" + no + "]");
			if (m != null) {
				list.add(m);
			}
		}
		return list;
	}

	/**
	 * 提取model对象数组的标号
	 * 
	 * @author yongtree
	 * @date 2013-9-26上午10:17:14
	 * @param modelName
	 * @return
	 */
	private List<String> getModelsNoList(String modelName) {
		// 提取标号
		List<String> list = new ArrayList<String>();
		String modelNameAndLeft = modelName + "[";
		Map<String, String[]> parasMap = getRequest().getParameterMap();
		for (Entry<String, String[]> e : parasMap.entrySet()) {
			String paraKey = e.getKey();
			if (paraKey.startsWith(modelNameAndLeft)) {
				String no = paraKey.substring(paraKey.indexOf("[") + 1,
						paraKey.indexOf("]"));
				if (!list.contains(no)) {
					list.add(no);
				}
			}
		}
		return list;
	}

@JFinal

--- 共有 1 条评论 ---
27号我只是提供了直接改的思路,我在实际用的过程中,也是自己实现的基类。呵呵 5年前 回复

这上面提供的案例都是把对象在页面提供下标users[0].age users[1].age。怎么实现 不加下标。就和struts ognl 一样 封装到list<bean>集合.尊敬的波波 有这方面demo么?

@jfinal

顶部