2017-08-28 11:44

用 find 系列的方法,而不要用 query 系的

find 系会将返回值封装成 Record 对明,而 query 系不做任何封装,原样返回

2017-08-28 11:33

首先通过设置断点,单步调试,看代码有没有执行 conn.rollback() 这个方法,如果执行了,只需要确保以下几件事就可以了:
1:mysql 是不是在用 InnoDB 引擎,其它引擎不支持事务
2:事务级别是否足够高,如果是 2 的话,建议调为 4 看一下:arp.setTransactionLevel(4)
3:是不是不细心,上次提交过的已成定局的数据,误认为是本次事务没有回滚

2017-08-28 11:30

只要让多个 service 处在同一个事务内就可以,也可以处在潜逃的事务内,例如:
Db.tx(new IAtom() {
public void call(...) {
serviceAaa.doIt(...); // 业务 aaa
serviceAbb.doIt(...); // 业务 bbb
}
}

如果是 业务 aaa 调用业务 bbb 也可以

2017-08-27 14:23

@北流家园网 没有问题, _MappingKit 中生成的映射同时也被改变过来,符合生成的 Model

2017-08-27 14:22

@北流家园网 具体需求是什么样的? 知道了需求才知道怎么添加这个 url 指令

2017-08-27 00:21

添加一个 handler,一行代码的事:
me.add(new FakeStaticHandler(".do"));

通过上面的代码,你的动态请求全部变成了 locahost/action.do 这种形式

你还可以做成 jsp 的形式:
me.add(new FakeStaticHandler(".jsp"));

上面两个都是 jfinal 官方提供的 handler 组件支持的

2017-08-26 15:59

看到你的扩展指令中需要使用 SqlKit.SQL_PARA_KEY 这类常量,jfinal 3.3 考虑将这些常量弄成 public 的,便于这类扩展

2017-08-26 15:50

指令扩展又玩出了新意,超赞

2017-08-26 15:49

@阿萨德fei 异常提示大致是 tomcat 启动的时候加载 jar 时出异常,而且说是 jar 包本身的格式有问题

不要用 eclipse 自带的 maven,下载完整的 maven ,并配置 eclipse 指向它

2017-08-26 15:20

异常信息内容没有任何地方与你添加的 jar 有关,很可能是 tomcat 的 webapp 里面有其它的项目,又或者是 tomcat 自身的 jar 包有问题造成的

检验方法很简单:独立运行 tomcat 的 startup.sh 或 startup.bat , 独立启动 tomcat

2017-08-26 12:43

configEngine(Engine engine) 这个方法中的 Engine 对象,默认已经将 baseTemplatePath 设置成了 PathKit.getWebRootPath(),大部分情况下不需要再干预,而且这个值也是 web 项目最佳的配置

少数 maven 类型的 web 项目将模板放在了 src/resources 目录下,最终会被编译到 classes 类路径之下,使用下面的配置是最好的:
engine.setBaseTemplatePath(null);
engine.setSourceFactory(new ClassPathSourceFactory());
这个在手册里面有说明

2017-08-26 10:24

解决办法极其简单,不管用户登录还是没登录,都让其持有一个 session 对象,都在数据库的 session 表中创建一条记录

然后,再为这个 session 添加一个 isLogin 字段,没登录就是 0,登录就是 1。通过 session 对象去获取用户的 account 对象时,先判断一下 isLogin 是否为 1

当然,对于没有注册的用户,accountId 设置为 0 就可以了

2017-08-25 21:34

@pfjia 自定义一个 RedisExt 扩展工具类就好,好多人都是这么做的,用 jfinal 提供的 redis 插件完成绝大部分功能,无法实现的功能通过 RedisExt 完成

RedisExt 内部主要是通过 Redis.use().getJedis() 获取底层连接来实现想要的功能,注意在用完 getJedis() 连接后,要在 finally 块中 close() 掉,回收资源

2017-08-25 21:32

arp.start() 要放在 arp.addMapping(...) 之后,一定要在所有准备工作完成后,再 start()

2017-08-25 16:23

干净利落,超赞