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 动画去除,并显示适当的消息
2017-03-05 01:07
@wang sharedMethod 扩展以后的用法是在表达式之中直接调用方法,例如:
#if(isBlank("abc"))...
其中的 isBlank 来自于 StringKit
除了要注意用法以后,要特别注意方法的参数个数与参数类型是否匹配,如果不匹配则会报出:Shared method not found 这个异常,这个异常确实报得不太友好,jfinal 3.1 已经改进了这里,会明确告知除了方法名可能错以外,方法的参数匹配不上也会报出来