2017-06-19 10:27

现有信息量无法解决问题

2017-06-18 12:41

全是干货啊,代码简洁清晰,感谢你的分享

2017-06-18 10:09

用一个 Handler 来做就可以了,记得搞定后回来分享一下

2017-06-17 16:44

@nbjgl 用 jfinal template engine 的语法来做是最方便的,不用做其它的事情

2017-06-17 12:38

@wendell620 配置一下 ehcache.xml , 将 temp 目录指向别处试试

2017-06-17 12:37

@netwild 关于第二点,指令参数必须是表达式,则不能是指令,所以你可以使用表达式作为自定义指令的参数

而指令间的嵌套是指这样的形式:
#dirAaa(...)
#dirBbb(...)
#end
#end

这样的嵌套 jfinal 必然是支持的,用自定义指令扩展是绝对可以实现你的需求的,有不少人已经是这样做的了,注意看下面的用法:
#hasPermission("menu:add")
。。。。。
#end

项目链接在下面:
http://git.oschina.net/jfinal/LMS/blob/master/lms-web/src/main/webapp/WEB-INF/views/admin/menu/menuManage.html?dir=0&filepath=lms-web%2Fsrc%2Fmain%2Fwebapp%2FWEB-INF%2Fviews%2Fadmin%2Fmenu%2FmenuManage.html&oid=da7ebdfd43636a17cc62c8ebe08d187f63befece&sha=0ad0fa183a3e90af4593f6bf6793377bbcb362cf

2017-06-17 11:44

jfinal 的 renderXml 在底层使用的是 XmlRender 实现,而 XmlRender 又使用的是 jfinal template engine

当你要使用别的模板引擎来输出 XML 时,只需要类似于下面这样用就可以
render(new XxxRender("books.xml"))

也就是说通过 Controller.render(Render render) 这个方法来无限扩展自己要用的 Render 实现

2017-06-17 11:41

@sunsunday 可以自定义 dao,model 中是有保存对象的方法的,建议看下 jfinal 手册

2017-06-17 11:40

@netwild 这个设计非常简洁,已点赞 + 收藏

有几个小建议:
1:#if(user.checkPerm("addUser")??false) 可以改为:#if(user.checkPerm("addUser")??),因为 ?? 表达式右侧没有任何表达式时与 expr ?? null 是完全等价的,而 null 值的 boolean 求值为 false

2:建议用 jfinal template engine 的指令级扩展实现界面的权限控制,类似于这样的用法:
#roles("role1", "role2")
### 显示某某菜单的 html 内容
#end

#permission(...)
### 显示某某操作按钮的 html 内容
#end

3:EInterceptorAuth 这个拦截器有线程安全问题,因为 jfinal 拦截器是全局共享的,所以 authCode、authId、authIds 这三个属性在多线程并发时会出问题

改进的办法是将继承 Interceptor 改为继承 PrototypeInteceptor。最好的办法是让那三个属性变为方法内的临时变量,这样性能最好

2017-06-16 11:57

可以为 c,d,f,g 使用合适的 modelName 前缀,就可以选择性的注入 c,d,f,g 这几个属性

还可以带上 true 参数来做: getModel(Xxx.class, true);

如果不使用 modelName 前缀,可以这样带 true 参:getModel(Xxx.class, "", true)

2017-06-16 11:54

@rocker18 日志写数据库要用一个独立的库,不要与业务使用同一个库,写日志入库的时候先写到内存的缓存队列之中,然后用独立的线程定时批量写入库

2017-06-16 11:53

@nbjgl 写个分享出来啊: jfinal.com/share

2017-06-16 00:17

建议不要生成视图的 model,这样来操作:
继承一下 MetaBuilder 这个类,覆盖掉其中的 getTablesResultSet(...) 方法,去掉其中的 "VIEW" 参数,再将继承类注入到 Generator 中去即可

如果一定要生成视图的 view,可以扩展 MetaBuilder,覆盖掉 buildPrimaryKey(...) 方法,将主键限定改一下

特别注意 Active record 模式是需要主键值的,意味着生成的 Model 仍然无法使用该模式操作数据库,非 AR 模式可以使用 Db + Record 模式操作数据库

2017-06-15 22:49

对重要方法使用拦截器利用正则做日志,可以起到很好的回溯作用,尤其在业务出现不一致时方便追溯,感谢你的分享

controller 与 request 的获取建议放在 if 分支里头,可节省点时空