2017-03-06 17:13

@JFinal 虽然看似程序 setAttr 过来的是一个 Object 型对象,但这个 Object 型对象本质上仍然是 ArrayList

2017-03-06 17:12

@Ferrari8899 不要去猜测程序的行为,一定要单步调试,程序不是写出来的,是调试出来的

2017-03-06 17:11

@Ferrari8899 注意看异常中的这句:TemplateException: In the class java.util.ArrayList can not find getUserName() method, also can not find "userName" field

已经明确说明了是在调用 java.util.ArrayList 这个对象的 getUserName() 方法,仔细单步调试一下程序

2017-03-06 17:04

@Ferrari8899 异常已经很明显,你是在对一个 ArrayList 型的对象进行 getUserName() 取值,显然是取不到的,对这个 ArrayList 进行迭代就可以了:
#for(x : list)
#(x.userName)
#end

2017-03-06 16:42

jfinal 自身定位于 MVC + ORM,并且自 jfinal 2.1 版本以来,model 也具有了 getter、setter 方法,所以理论上来说 jfinal 项目可以作为微服务架构之下的节点而存在,选择自己喜欢爱的微服务支持的第三方直接用就好,例如使用 doubbo

用 jfinal 来做微服务时,主要注意如下几点:
1:每个 jfinal 节点,如果同时又做了集群,那么让节点是无状态,如果有状态则要有状态同步机制,例如节点 JVM 内的缓存要在集群之中同步
2:每个 jfinal 节点,可以使用 renderJson() 实现 rest 服务,也可以使用 rpc + 业务层拦截器的方式直通业务层,这样可以连控制器都省了

2017-03-06 16:37

@Ferrari8899 终极解决办法是打断点,然后单步进行调试,动态地去看程序到底在做些什么,而不要静态去看源代码

2017-03-06 16:21

@Ferrari8899 调试的时候,没有那个字段,那肯定是取不到值的,注意排查一下错误

2017-03-06 16:19

#(user.name) 调用优先级从高到低如下:
1:user.getName()
2:如果 user 为 Model 或者 Record,则调用 user.get(name)
3:如果 user 为 Map,则调用 user.get(name)
4:如果 user 存在 public 型的 name 属性,则获取 user.name 的值

对照以上优先级检查一下,是否满足了这些条件之一

2017-03-06 15:58

@Ferrari8899 看控制台的异常,不要看浏览器,如果控制台没有异常,则检查一下日志配置好没有,异常是通过日志组件输出的

2017-03-06 11:47

Render 类中的 render 方法是被 jfinal 框架内部调用的,看一下 ActionHandler 源码便知

2017-03-06 11:44

添加一个全局拦截器,使用 try { inv.invoke() } catch (Exception e) {...} 在 catch 块之中去决定是用 renderJson(...) 还是 renderError(...)

2017-03-06 11:41

在某些情况下,传入的参数个数与 sql 中的问号个数不相同导致的,并非多线程问题,不建议在 BaseModel 中弄个 List,浪费内存,在需要的时候再去 new

2017-03-06 11:38

期待将扩展分享出来,有不少小伙伴们也需要,感谢支持

2017-03-06 11:36

大致按下面的流程:
1:ajax 发起请求
2:控制器接受到请求以后,启动一个新的线程处理当前的任务,并且将该任务存放在一个下次请求到来时可以拿到的地方,例如用一个 static Map 来存放
3:控制器在启动线程处理任务以后,马上将该任务的 key 值,进度值返回给 ajax 这一端
4:ajax 这一端在拿到进度值操作一下界面,例如,显示进度条的长度。
5:过了一定的间隔以后再次发起 ajax 请求去获取当前的进度,发请求时将上次控制器传过来的任务的 key 值作为参数发过去
6:控制台通过 key 值去 static Map 中拿到任务,以及任务状态,再次返回给 ajax 端
7:重复上面第 4 步到第 7 步,直到任务完成

上面的过程比较复杂,一般通过如下方式进行简化:
1:ajax 发送请求,然后在页面显示一个 loading 样式的 gif 动画,该动画不关心进度值
2:控制器接受到请求以后,不创新线程处理任务,而是在当前线程直接处理,直到处理完成才 renderJson 给 ajax 这端
3:ajax 这端得到响应后,将 loading 的 gif 动画去除,并显示适当的消息