2016-12-14 10:36

@nbjgl 事务的用法在 jfinal 手册上有详细的例子,有两种用法,下面提供我个人常用的一种:
Db.tx(new IAtom() {
public void run() {
Db.update(sql, ...);
Db.update(sql,...);
new Xxx().set(...).set(...).save();
}
}

2016-12-13 20:05

@奋斗-now struts 的 namespace 就需要额外的 xml 配置,提交个表单还需要个 ActionForm,现在的存量用户还挺多,苦了他们了

2016-12-13 17:55

input 的 name 属性保持唯一,不要重名即可

2016-12-13 15:19

@nbjgl 那就拆分成两个 sql,大致如下:
int n = Db.update("update t set count=count+1 where where id=? and date=?", id, date);
if (n == 0) {
Xxx xxx = new Xxx();
xxx.setId(id);
xxx.setCount(1);
xxx.setDate(new Date());
xxx.save();
}
上面的代码意思是,先尝试性的让其加1,如果 n 为 0 表示记录不存在,此时就可以去插入一条记录

注意上述代码放在一个事务中,以免并发情况下插入同 id 且同 date 的记录

最好的办法还是使用缓存,让一个专门的线程处理,连事务都不需要

2016-12-13 13:26

@深海的鱼 没错,最好的办法是使用中间件,让读写分离对你的程序完全透明

2016-12-13 11:45

@奋斗-now 这就叫无招胜有招,不需要引入新的东东即可实现需要的功能

2016-12-13 11:30

@奋斗-now 天然就支持,这里是前台:
me.add("/", IndexController.class);
me.add("/project", ProjectController.class);

这里是后台:
me.add("/admin", IndexAdminController.class);
me.add("/admin/project", ProjectAdminController.class);

controllerKey 中可以包含 "/" 字符,可以自由实现 namespace 功能,并且无需引入新的概念

2016-12-13 11:01

jfinal 官网最想做就是在分享频道分享出 N 多的精品文章,这个能为大家带来真正的价值,想写的主题太多了,一直没时间

2016-12-13 11:00

jfinal 社区上线半年多了,还没有去一万多人的官方群里面宣传过一次,更没有 @过全群一次,为什么? 就是没时间

你可以去那建一个,先开个头,2017 年在那好好发展一下

2016-12-13 10:47

这个功能只是阻止非法访问,非法情况直接不提供服务,这个功能本来就是管理员用的,重定向基本上没有这个需求

如果希望重定向,可以直接继承那个 Handler,可完全接管和定制

2016-12-13 10:44

本站页面就有一些处理 json 的 js 可以参考,看这里:http://www.jfinal.com/assets/js/jfinal-com-v1.0.js

看一下 function reply(...) 这个方法中如何处理的:success: function(ret) 这个回调方法,这个 ret 是后台返回的一个对象:renderJson("ret", Ret.ok(k1, v1).put(k2, v2);

2016-12-12 21:16

一条 sql 搞定,在记录不存在时插入,存在时执行 update,大致是:
insert into table(f1, fn) VALUES(?,?) on duplicate key update count=count+1;
然后 Db.update(sql) 打完收工

通常这类功能,会做成只去操作缓存,然后再启动一个线程定时将缓存中的数据写入数据库,同时清空缓存,这样可以避免经常性写库操作,尤其对高并发有帮助

2016-12-12 20:30

arp.setTransactionLevel(2)

2016-12-12 18:11

这个 2000 人群,还有一百多个位置: JFinal极速开发官方群 38707273

请勿使用我的头像

2016-12-12 18:10

用大括号,想有多少个都可以:
@Before({A.class, B.class, C.class})