2019-11-25 14:09

me.add 与 me.addGlobalActionInterceptor 是完全等价的,用法上完全没区别

2019-11-25 10:45

这个是 java 基础,一定要搞清楚,否则在面临多线程开发时,必然造成混乱

2019-11-25 10:44

@zzutligang 严格来说,业务层无状态是指:你的业务 class 里没有属性,或者只有 final 属性,例如:
public class MyService {
final int value = 123;
}

上面的 MyService 有一个 final 属性,是可以多线程共享的。或者上面的 MyService 没有属性,也可以称之为无状态


如果不严格来说,业务层无状态是指:你的业务 class 里面没有属性,或者只有无状态属性,例如:
public class MyService {
OtherService otherService;
}

上面的 MyService 有一个 OtherService 属性,如果它是无状态的,那么 MyService 也是无状态的

简单总结无状态就是:无属性或者只有无状态属性

状态这个词你简单理解为类的属性就好

2019-11-25 10:38

@jounzhang 在 BaseController 里面不断追加适用于自己项目的方法是最好的,jfinal 迭代开源八年多了,很多东西不方便动,兼容性很重要

好在 jfinal 的设计一开始就是极简,这八年来核心设计从来没有变动过,迭代主要在一些小地方进行

2019-11-25 10:37

这里补充一点,返回给前端的数据不一定非得要 json,还可以直接返回 html 动态片段,例如:
render("_reply_item.html");

客户端接收的该数据后的 js 代码稍稍改一下即可

2019-11-25 10:35

参考 jfinal club 项目中的 com.jfinal.club.share 包现下面的ShareController.saveReply() 方法

该方法内部用到下面代码:
String replyItem = renderToString("_reply_item.html", ret);
ret.set("replyItem", replyItem);
renderJson(ret);

先是对 _reply_item.html 这个 html 动态元素进行了渲染,然后再 renderJson 发回给前端,前端用 js 再显示出来即可

2019-11-24 11:39

当然可以修改,也可以增、减字段,路由在 AdminRoutes.java、FrontRoutes.java 之中,搜索一下就出来了

2019-11-24 11:38

管理图片做成九宫格,做个页面就可以了,由于用的是 bootstrap,所以只需要照着它的文档来做就可以了:
https://v3.bootcss.com/

jfinal 是没有 renderPage 方法的,我猜测你的代码中是在父类中自己添加了 renderPage 方法,参考 jfinal club 中的大量分页用法,这样来做:
setAttr("page", page);
render(...);

然后在页面中直接使用 page 对象就可以了,有方法就调,有属性就拿,参考这里:
https://www.jfinal.com/doc/6-3

2019-11-23 23:42

"/" 会被 jfinal 的 ActionHandler 首先拦截掉

你可以添加一个 Handler 将这个 "/" 放行给你的 servlet

2019-11-23 16:31

建议做个 BaseController,在里头实现一些希望的功能,例如:
public class BaseController extends Controller {
public String[] getParaArray(String name) {
...
}
}

2019-11-23 16:30

getPara 这个方法的返回值为 String , 使用了八年多了,如果改变返回值让其成为 String[] , 我肯定会被骂死

2019-11-23 16:28

@zzutligang 单例必须考虑线程安全问题,一般业务层做成无状态的,天然就是线程安全的即可

你可以在不能是 singleton 的 service 上用注解来解决,例如:
@Singleton(false)
public class BlogService {
...
}

2019-11-23 14:51

jfinal 为了极致性能,是将所有路由在项目启动的时候一次性初始化的,不支持动态路由

@海哥 对 jfinal 有扩展过这个功能,可以看看他的 #jboot 项目:
https://gitee.com/fuhai/jboot

2019-11-23 11:41

主要区别如下:
1:节省点代码

2:@Inject 的方式支持 singleton,而 new BlogService() 每次要创建新对象(除非使用 static 关键字)

3:@Inject 可以注入接口的实现类,类的子类,抽象类的子类,这样就可以实现动态化,而 new BlogService 中的 BlogService 类型是写死在代码中的

4:@Inject 在注入的时候便于实现 AOP,被注入的对象上如果使用了 @Before 拦截器是生效的。而 new BlogService() 的方式在里头用的 @Before 将不起作用

2019-11-23 10:22

你的这个发现有价值,刚刚 jfinal 4.8 版本已经改进了这个地方,放开了 #set 指令对于自增、自减表达式的使用,代码具体改变在此:
https://gitee.com/jfinal/jfinal/commit/4eccbe9bee347cdd6c32bf07c9d3e7b5f9f43912