2017-08-13 12:12

通过如下方法保障项目中的 log4j 可以正确工作:
1:在本站首页下载 jfinal demo,然后将 log4j.jar 以及里面的一个 log4j.properties 配置放在你的项目之中

2:项目中测试 log4j 是否可以正确工作,使用如下的代码:
Log.getLog(getClass()).error("测试日志是正工作正常");

3:找到日志文件,查看里面是否有内容

确保了在项目中日志可以工作以后,再去部署项目才有意义

2017-08-13 11:58

如果日志中的信息拿不到手,没人能帮你猜出来问题原因

2017-08-13 11:57

首先,要确保配置好项目的日志,如果启动时是项目代码自身的问题,那么项目中的日志会记录下来异常信息。项目的日志是最最基本的要求

其次,tomcat 的日志本身已经存在,但是只在某些情况下才会做日志,通常是与 tomcat 有关的异常

了解了上面两点,优先从项目日志中找问题,如果项目日志配置正确但没有内容,那么就从 tomcat 中找问题

2017-08-13 11:54

在 _MappingKit.mapping(arp);这行一行代码之后添加一行:
arp.setPrimaryKey("points", "member_id, point_type, index_time");

这样就强制指定了多主键的次序,如果不强制指定,那么默认按照反射的结果来。 反射的结果通常是正确的,如果不正确很可能是建表的 sql 里面的次序有变动

2017-08-13 11:49

看下 tomcat 的 log 目录下的日志,找到 cause 这段信息才能知道具体原因

仅凭上面的信息量无法定位

2017-08-12 23:22

@地狱里的帅灵魂 _MappingKit 是生成器自己生成的,不用自己手写,生成器在 jfinal demo 里面有,运行一下里面的 main 方法就生成了 _MappingKit

2017-08-12 18:03

如果暂时不想升级,可以用下面的方法支持:
SqlPara sp = Db.getSqlPara(...);
Db.update(sp.getSql(), sp.getPara());

2017-08-12 17:41

升级到 jfinal 3.2 就支持了这个功能

2017-08-12 17:17

@i++ 这个改进很不错,下个版本添加这个功能,感谢你的贡献 ^_^

2017-08-12 11:36

要特别注意:经过上面的改进以后,如果某个参数值为 null,那么所报的异常为参数个数不对,对于不知道有此扩展的背景的开发者可能会被搞糊涂,以为自己少传了参数,这也是 jfinal 为啥不直接支持的原因之一

还有一个原因是字段值是可以设置为 null 值的,所以在有些场景下 null 本身是正确的值

2017-08-12 11:34

扩展一下,先创建一个 MyParaDirective:
public class MyParaDirective extends ParaDirective

在 MyParaDirective 中覆写一下 exec(...) 方法,将原来的 ParaDirective.exec(...) 方法中的代码全 copy过来,改掉下面这一行代码:
sqlPara.addPara(exprList.eval(scope));

上面代码改成:
Object value = exprList.eval(scope);
if (value != null) {
sqlPara.addPara((value);
}

最后配置一下就可以了:
1:arp.getEngine().removeDirective("para") 先移除老的 para 指令
2:arp.getEngine().addDirective("para", new MyParaDirective()) 再添加自己扩展后的指令

sql 管理功能中的三个指令本身也全是扩展而来的,大家可以用类似的办法自由定制自己需要的指令

记得搞后来回来分享一下

2017-08-12 10:18

jfinal 3.2 手册第五章第 11 小节 《Sql 管理与动态生成》 这部分内容有过详细的讲解

jfinal 的 sql 管理用的是模板引擎,所以比 ibatis 这类用 xml 管理的灵活性、简单性要高得多

2017-08-12 10:16

@rocker18 下载首页的 jfinal demo,页面里面有一个 _layout.html 就是布局模板了,然后每个具体的模板都是被该 layout 文件调用而已

例如其中的 index.html、blog.html 的这些模板中根本没有 html head 这类头部的标记存在

layout 的核心功能是重用模板内容,避免代码冗余重复

2017-08-11 23:16

@RonnyZhang 可以自己做一个 getModels 方法来支持,大概方法是:
1:表单域用下标方式表示,例如:
name="user_0.userName"
name="user_0.age"

name="user_1.userName"
name="user_1.age"

2:后端通过已有的 getModel 方法来实现 getModels,大致如下:
List userList = new ArrayList();
for (int i=0; i<size; i++) {
User user = getModel(User.class, "user_" + i);
userList.add(user);
}

2017-08-11 22:55

后来听说 jetty 出了一个支持 java 6、java 7 的版本了,有情况请告知 jfinal 社区,谢谢