6
回答
jfinal是否支持页面到action的List<Map<String,Object>>类型的参数传递?
百度AI开发者大赛带你边学边开发,赢100万奖金,加群:418589053   

@JFinal 你好,想跟你请教个问题:

以前用struts就发现不支持这种方式

举报
luckythc
发帖于5年前 6回/1K+阅
共有6个答案 最后回答: 5年前

    其实楼主的问题放在 JFinal 上是JFinal能否支持页面到 action的 List<Model>传值,目前来说还没有将 getModels这个功能做进去,不过利用 JFinal现在提供的 getModel可以很轻易地实现这个功能。

    大概的代码是:

List<User> users = new ArrayList<Users>();
for (int i=0; i<size; i++) {
  User user = getModel(User.class, "user[" + i + "]");
  users.add(user);
}
页面表单的model的name属性是这种形式: user[i].name、 user[i].password,上面代码中的size是表单中model的数量

    JFinal未来的版本一定会支持 getModles。

--- 共有 7 条评论 ---
luckythc回复 @JFinal : List/Map/List<Map>都是类型,其实我说的是便页面交互的类型转换,倒不是数据库的类型映射 5年前 回复
luckythc回复 @JFinal : 当然不是使用配置文件,我所说的“使用者知晓”的意思是你自己传的参数,你自己应该知道用什么来接收,1.如果是需要在控制层操作数据对象的话,需要自己编写bean来接收,2如果是直接的模型层操作,则可以直接在sql语句中用参数拼接的方式接收(在我的例子里写的是第2种情况) 5年前 回复
JFinal回复 @luckythc : getModel对基本类型做了自动转换,但前提是知道该转成什么类型,getModel需要的类型是通过反射数据库自动获得的。楼主提到的情况如何获得类型,需要配置文件挨个去配置么? 5年前 回复
luckythc回复 @JFinal : 回复 @JFinal : 嗯,这个我认为适用“使用者知晓”的原则,框架只负责传递,使用者在后端自行转换接收。当然,框架可以缺省内置一些基本类型转换,这个其实是与struts的思想一致的,所谓List<MAP>的转换其实只是对这种前后台参数传递进行了扩充,增加了一种叫LIST<MAP<String,Object>>的基本类型 5年前 回复
JFinal回复 @luckythc : 页面表单中的数据传到后端全是String,如何确定String转成合适的类型? 5年前 回复

引用来自“缪斯的情人”的答案

目前不支持这种凌乱的复杂数据传递模式

不觉得凌乱啊,实际上我觉得Map也是一种bean,既然List<自定义的bean>可以用,为什么List<Map>反而不行呢。

一直很喜欢使用Map这种,可以很方便的把不同类型的东西传来传去,尤其是在数据库经常变动的情况下,用来做结果映射很方便

--- 共有 3 条评论 ---
缪斯的情人回复 @luckythc : 其实jfinal连list的形式还没支持,不过可以自己写扩展 5年前 回复
luckythc还好吧,原来是依托struts的线程机制来规避线程安全问题,空间的话,反正数据量不大,每次页面交互大多就几行数据 5年前 回复
缪斯的情人Map占内存空间很大,而且多线程有线程安全问题,好用但不能滥用 5年前 回复

呃,原来的工程不能用了,没有当时的环境,也不太愿意动弹去做改版(实在是太懒了

其实还算简单吧,主要就是利用mybatis的动态sql功能,直接将sql语句作为变量传入去执行,所有的sql另外配置在xml里面,使用的时候在html页面上指定sql语句对应的id,传到action,action通过id找到sql,再拼凑替换好参数变量,形成完整的可执行的sql,放到mybatis里去执行,返回结果统一通过List<Map<String,Object>>进行接收,返回页面后可通过ognl进行展示。

我喜欢jfinal的口号,程序员就应该要变得懒,而且要懒得有型。从我接触java开始我就一直觉得程序开发的大量时间花费在开发无关的外部支撑环境和接口处理上,譬如数据库、页面交互等。而上面那个思路就是把所有的数据库映射的实体bean全部取消,不再提供类似User.name之类的访问方式,改成List<Map>方式,因此在访问实体的时候不能通过.号,只能通过下标和key,如result[0]['name']表示某个查询结果的第一行name字段的值(话说回来,不知道java能不能重载.号,好像c++里可以重载操作符,要是可以的话就通过注解或别的方式将访问方式自定义成.号,这样就完美了)。

顶部