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 动画去除,并显示适当的消息

2017-03-06 11:28

这个贴子是在问问题,还是在分享呢? 如果是分享需要发到分享频道去

2017-03-05 20:42

还没顾得上呢,这个一直在考虑如何来做,感谢你的建议

2017-03-05 15:46

这个异常是在表述,tomcat 在关闭时由于 JDBC 驱动 unregister 失败,为了避免内存泄漏对其进行了强制 unregister 操作

这种情况,通常是由于在项目之中存在非 daemon 类型的线程,所以在 tomcat 使用 shutdown 命令时并不能真正关闭 tomcat

解决办法极其简单,找到那个非 daemon 线程,将其改为 daemon 线程即可。寻找的办法可以是在 eclipse 时启动项目,观察所有启动的线程类型即可知道

2017-03-05 15:39

这个问题,一句话两句话说不清楚,建议加入俱乐部,可获取现成的代码,直接使用即可:http://jfinal.com/club

2017-03-05 15:38

@爱小乖 感谢支持

2017-03-05 12:18

forwardAction 是后端转发,所以当前 action 与 被跳去的 action 仍处于同一次请求之中,request 对象中的一切都原封不动的在那里

2017-03-05 12:17

handleError 被调用,意味着本次请求的验证逻辑已经失败,通常是直接 render 到某个页面,或者 renderJson 返回数据,在 handleError 中使用 forwardAction 的玩法从来没有见到过

forwardAction 是后端的转发,所以 request 中的参数天然就是在那的,所以“请问怎样才能跳转到另一个action还保留参数啊?”这个问题自身就是不存在的

2017-03-05 01:07

@wang sharedMethod 扩展以后的用法是在表达式之中直接调用方法,例如:
#if(isBlank("abc"))...
其中的 isBlank 来自于 StringKit

除了要注意用法以后,要特别注意方法的参数个数与参数类型是否匹配,如果不匹配则会报出:Shared method not found 这个异常,这个异常确实报得不太友好,jfinal 3.1 已经改进了这里,会明确告知除了方法名可能错以外,方法的参数匹配不上也会报出来

2017-03-04 16:59

@fengting jfinal 手册第一章介绍了如何升级,其中谈到了这点,搞定了没?

2017-03-04 16:48

如果是用的 IDEA,并且是用的 jfinal 集成的 jetty 启动项目,使用如下代码:
JFinal.start("WebRoot", 80, "/");

而不要使用如下代码:
JFinal.start("WebRoot", 80, "/", 5);

也就是说,IDEA 下的启动少了最后一个 int 型参数,这是由于 IDEA 启动时无法切换成 jfinal 自定义的 classloader 引发的,下载首页的 jfinal demo,看一下 DemoConfig.main() 方法中的说明文字

记得搞定后再回复一下该贴