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 15:58
@Ferrari8899 看控制台的异常,不要看浏览器,如果控制台没有异常,则检查一下日志配置好没有,异常是通过日志组件输出的
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 动画去除,并显示适当的消息