2017-09-27 21:36

确实会碰到这个初始化次序的事情,最简单的办法是将 Redis.use(...) 放在 put 方法内部

还有一个办法是通过一个 static Constants constants 属性在 configConstant(Constants me) 中通过下面的代码将 me 存起来:
constants = me;

然后创建一个方法来操作:
public void afterJFinalStart() {
constants.setCaptchaCache(...);
}

afterJFinalStart() 的说明见 jfinal 手册

2017-09-27 21:33

@djs19960601 打成 jar 以后是怎么启动的项目? 通过 java -jar .... 启动的? 入口方法是哪个?

2017-09-27 21:21

model 是由于在 arp.addMapping(....) 时就建立了与数据源的关联,而 Record 这个对象是人各个数据源通用的,不可能与某一个数据源建立关联

除了 Db.use(...) 还可以通过多种方式扩展,例如通过拦截器来动态切换,这里有一些例子:
http://www.jfinal.com/share/236

2017-09-27 21:19

shrioFilter 配置在 JFinalFilter 之后试试, filter 的生效是有先后次序的

2017-09-27 21:18

实现一下 ITokenCache 接口,然后通过 me.setTokenCache(new MyTokenCache()) 即可切换到自己的实现

ITokenCache 接口只有 put remove 等基本的方法,具体实现为 redis 还是数据库都很方便,别忘了搞定后回来分享一下哈

2017-09-27 20:22

@喜欢自在 文章中的用法性能没有问题

2017-09-27 18:13

正常的 404 应该是出现jfinal 的 404 页面,类似于这个页面:
http://www.jfinal.com/a/b/c/d

而你出现的是 jetty 的 404 页面,证明 jfinal 并未真正启动,可能是 web.xml 中的配置有误

2017-09-27 18:10

我记得 cron4j 的表达式只有五个部分,而你的代码中是 6 部分,先拿全部是 * 号的表达式测试一下,然后改成自己想要的表达式

多数错误是表达式写错而引起的,建议看一下 jfinal 手册中有关表达式每个部分的说明,参照着做就好

2017-09-27 18:08

有些情况 contextPath 为 "/",所以要对此进行判断,而为 "" 的情况,正好 length() 值为 0,这段代码依然正常

2017-09-27 16:32

后台管理部分做得不错,点赞收藏一个

2017-09-27 16:10

如果用了 public static final Xxx me 并且配合 private 构造方法,则就会变成单例的,因为 private 构造方法可以阻止 new 出对象来

通常只要将业务层做成无状态的,让所有状态都放在数据库或者共享的中心缓存中,就可以使用这种模式

不仅省去了 IOC 容器、省去了大量的 XML 或 annotation 进行注入装配、提升了性能、减少了代码量,而且还无比简单好理解。

更重要一点就是:无状态的业务层,让分布式与集群变得无比方便,无状态的业务层为下一步的分布式与集群做好了充分的准备

2017-09-27 12:07

不是有没有必要, 而是必须要引入,以前老版本的 demo 仅仅是演示,没入 service 进去误导了不少人,新版本的 demo 加入了 service

2017-09-27 11:34

补充一下,如果逼不得已经使用 /friendship/rKJGdAKPm/profile 这样的路由,也只需要添加一个 Handler 做下转换就好,有几个用户在对接第三方的时候碰到这种需求就是通过 Handler 转换搞定的,非常容易

参考一下 jfinal 里的 com.jfinal.ext.handler 包下面的源代码,自己写一个

2017-09-27 11:33

你把指令扩展与 shared method 搞混了,再仔细看一下手册, shared method 是利用普通的 java 类,而不需要实现任何接口或继承任何类

2017-09-27 11:13

@liuvlun 如果你不使用 fst 序列化就可以删掉 fst 这个包,这样配置一下:
redisPlugin.setSerializer(new JdkSerializer());