最近在读jfinal源码,有几处想向作者请教的地方

loda0128 发布于 2014/12/27 17:54
阅读 536
收藏 5

@JFinal 你好,想跟你请教个问题:因为jfinal用着舒服,所以一直在用,但是也只是停留在表面上的使用,从没有深入学习过源代码。最近下了源码,debug看了一个helloworld级别的程序。产生了几个问题

  1. jfinal里面Action类里面的actionKey和controllerKey有什么区别,actionKey好像没怎么用到。
  2. 在核心ActionHandler类里面,有一处实现是Controller controller = action.getControllerClass().newInstance()。请问是不是每次请求都要调用一次newInstance()产生一个Controller实现类,如果是这样的话,大量创建的对象会不会有性能上的问题,或者是不是有什么比较好的处理方式能够处理这些类。如果不是的话,那又是怎么处理的呢?
  3. 还有一点,我看到你render跳转到页面,我不是蛮了解你的Render接口。我这边是jsp,是不是你的Render接口判断如果是jsp就用Render的jsp实现类处理,如果是freemarker就用freemarker的实现类处理呢?是这样设计的么
  4. ps:以上问题部分可能有很多看起来小白的地方,不过我经验也才半年,所以多多见谅啦
加载中
0
JFinal
JFinal

一、第一个问题

     controllerKey 可定位一个 controller,actionKey 可定位一个 Controller 之中的一个 method。规则是 actionKey = controllerKey + methodName,当 methodName为 index时 methodName 缺省为 ""。看一下 jfinal 手册中有关路由部分就清楚了

二、第二个问题

     ActionHandler 中是利用 newInstance() 创建的对象,以前测试过在我机器上每秒可创建几百万个controller对象,速度极快。由于 Controller 中需要保存 HttpServletRequest、HttpServletResonse、Render 等对象,这样做为了保证 Controller 是线程安全的。否则通常需要用 ThreadLocal 并搭配一个所谓的 Context 来做

public void index() {
  Context ctx = ContexManager.getContext();
  HttpServletRequest req = ctx.getRequest();
  HttpServletResponse res = ctx.getResponse();
  ......
}

   以上代码在 ContextManager 中用一个ThreadLocal 来持有 Context 对象来保证线程安全,即使是这样,你仍然也需要在每次请求时 new Context() 对象出来使用,当然你可以在 ContextManager 中用多个 ThreadLocal 来存放 request、response、等对象避免引入Context,但要知道 从 ThreadLocal 取数据是有时间消耗的,这种设计势必也会反复多次在 ThreadLocal 中取数据,因为一个请求在多处可能都要同时用到 request、response等对象。而 jfinal 的设计就是一个简单的 getRequest() 性能不能再比这快了。

    另外即便引入了 Context,开发者仍然有在 Controller 创建属性的需求,那么为了线程安全Controller 不能是单例,还是得 newInstance() ,最终的结果可能是引入了 ContextManager + Context + ThreadLocal,导致增加了代码量、降低了性能,还必须得让开发者额外处理线程安全问题。

三、第三个问题

    重点在于 Controller.render(String view) 这个方法,这个方法具体使用什么视图类型,需要使用 me.setViewType(ViewType) 来配置,如果不配置则默认使用 freemarker。jfinal 并不会根据视图文件扩展名去判断视图类型,因为有些视图可以为任意的扩展名。

    除此之外注意一下具体的 render 方法,如 renderJsp、renderFreeMarker 学习成本极低,从语义上讲 renderJsp(String view) ---> render jsp view ---> 渲染 jsp 视图。


loda0128
loda0128
谢谢波总指教
返回顶部
顶部