第一个jfinal demo 之感

Ken5233 发布于 2012/09/21 00:08
阅读 4K+
收藏 6

我使用的是官方的 for_jsp demo, 运行之后 感觉很神奇,竟然不用为 model 提供 dao 实现 ,就能对数据库进行操作 第一感觉 这东西有新意。之后 立马翻开官方手册学习。。。

通篇阅读之后,有几个疑问

1、对于需要在动态切换视图类型的,jf怎样处理的?如: controller actionA 返回 render(x.ftl) 但 controller actionB 返回 render(y.jsp) 。。。 

2、jf 的所有拦截操作基于 jf Interceptor 实现,此 Interceptor 的执行顺序可否配置?是否以声明时顺序执行?

3、jf 的 ActiveRecord 是db操作的核心,它是怎样进行属性与列名之间的匹配的呢?若类的属性为 name 数据库内列名为 user_name 时 如何处理?当数据库列数量类属性数量不相符时 如何处理?

4、jf 对事务的处理手册中篇幅不够,从示例代码中感觉 Interceptor 不能参与到事务中来?即多个 interceptor 之间不能事务管理?

5、jf 有后置拦截器吗? 类似 spring after around 之类 。

 以上观点问题,仅个人初次使用之体验,我会在后续使用中 对以上问题进行一一解答,并及时发表。

以下是话题补充:

@Ken5233:对于第三点,我想已经知道答案了。至于jf如何实现 要从源码中找答案了 哈哈(ps:自己看东西太粗心了) (2012/09/21 00:22)
@Ken5233:@JFinal 这几天闲下来,开始看看源码写写应用,发现几个问题,请教下 1)对于action处理类,只能在config中静态添加吗?貌似buildActionMapping方法是受保护的,暂时没发现有注解支持.提出这个问题是受s2的影响,不想静态写好路由设置. (2012/11/15 10:22)
@Ken5233:@JFinal 2)对于render方法的处理不是很明了. 基于官方dome_for_jsp中,我本意将update\add\delete这三个方法修改为完成后redirect to list 页面的.代码如下,public void save(){ model.save()... redirect("") 空路径 } 前两个方法会没有问题,但到了delete方法redirect时,则会报数据库执行出错.查看源码发现,执行的也是 response.sendRedirect(url) 这个url是空字符串的情况下,竟然会转向至旧地址,即原来的删除方法请求路径.故异常抛出. (2012/11/15 10:30)
加载中
1
a
alvinte

第二和第四感觉是同一问题,Interceptor是按声明的拦截器栈的顺序作为执行顺序的。例如:@Before({inter1.class,inter2.class,inter3.class}) 所以第四就是把事务拦截器放到合适的顺次就可以控制事务的范围喽。

第五、拦截器里面有Actioninvocation.invoke();方法表示从拦截器进入下一层调用,在此行代码之前就是前置处理,之后就是后置处理呗~

JFinal
JFinal
回复 @java_cmm : JFinal 天然支持声明式事务,只需: @Before(Tx.class)
Ken5233
Ken5233
谢谢你的回答,早上我重新看过一遍之后,基本跟你的看法相同。 觉得 jf 是轻量级的(ps:较于spring而言) 一些事务及其它控件可能还是需要自己去实现,就像 jf 设计者所言 基于plug 的开放接口,让大家去扩展吧
1
JFinal
JFinal

再补充一下三个级别的拦截器如何配置:

1:Global 级别拦截器在 YourJFinalConfig.configInterceptor(Interceptors me)中声明

public void configInterceptor(Interceptors me) {
  me.add(new Aaa());
  me.add(new Bbb());
}

 这类拦截器会拦截所有action 请求,拦截器顺序为:Aaa、Bbb

2:Controller级别拦截器在Controller类定义的前面声明

@Before({Ccc.class, Ddd.class})
public class BlogClass {
   public void actionAaa(){}
   public void actionBbb(){}
}

以上Controller 中的 actionAaa与actoinBbb都将被Ccc、Ddd拦截,并且拦截顺序为:Ccc、Ddd

3:Action级别拦截器在方法定义前声明

public class BlogClass {
   @Before({Eee.class, Fff.class})
   public void action() {
   }
}

以上actoin()方法将被Eee、Fff拦截,并且拦截顺序为:Eee、Fff

4:假设某个actoin方法依照上面三个代码示例分别声明了Global、Controller、Actoin三个级别的拦截器,那么它将会被  Aaa、Bbb、Ccc、Ddd、Eee、Fff六个拦截器依次拦截到。

5:Controller、Action这两个级别上可以使用 @ClearInterceptor清除上层拦截器

@ClearInterceptor
@Before({Ccc.class, Ddd.class})
public class BlogController {
    @ClearInterceptor
    @Before({Eee.class, Fff.class})
    public void index() {
    }
}

以上代码的类定义上的@ClearIntercptor 将清除全局拦截器对此Controller中所有acton的拦截。而indext方法上的@ClearInterceptor将清除Ccc、Ddd拦截器,全局拦截器依然有效,如果要在此处清除全局拦截器可以使用@ClearInterceptor(ClearLayer.ALL)来做到

0
菜根乱谭
菜根乱谭

第一个问题,他有不同的Render方法,比如RenderJsp,Render需要指定默认的视图类型。

手机打字太费劲,先说这么多

Ken5233
Ken5233
谢谢明白意思了,就是指在具体处理不同的请求时,可以动态指定返回视图的类型?
0
边缘行者
边缘行者
约定大于配置  现在开发之道~~~~
Ken5233
Ken5233
最炫Restful风
0
cwledit
cwledit
你说的第五点是什么? 没看懂啊
0
JFinal
JFinal

楼主这么短的时间内提出了这么多重要的问题  我简单的做下回答:

1:JFinal 同时支持多种视图类型,支持方式是: 1 个主视图 + N 个辅视图。主视图可以通过调用 Controller.render(...) 方法来实现,辅视图通过调用各自的方法来实现,如: renderJsp(...)、 renderJson(...)、renderFreeMarker(...) 或render(new XxxRender(...))等等。

2:JFinal 拦截器是根据配置的顺序来调用的,配置在前面的会先调用。JFinal拦截器分为三个级别:Global、Controller、Actoin。Global拦截器将拦截所有action 请求,Controller 拦截器将拦截定义在该Controller中的所有action,Actoin拦截器只拦截本actoin。这三大类拦截器的调用次序是:Global、Controller、Actoin。

3:ActiveRecord 中的属性于字段匹配是自动完成的,无需干预。类属性与数据表字段不同的时候可以通过创建setter getter 方法来解决,或者在继承类中覆盖Model的set与get实现。

4:JFinal 事务处理的例子代码看起来是不能参与到事务中来,其实是参与到的,实现方法比较独特,注意看一下 DbKit.getConnection() 就明白了。

5:JFinal 拦截器可以实现前置拦截与后置拦截的功能,与Struts2很类似的实现。jfinal demo 项目中的 BlogInterceptor这个拦截器已经演示了这种用法。

谢谢楼主的关注,多来提建议 

 

 

k-magic
k-magic
回复 @JFinal : 感觉把这些整理下写到JFinal手册里。 比如手册后面写个常见问题列表。
JFinal
JFinal
回复 @java_cmm : 感谢大家的支持才对,能提出问题,才可能有进步,感谢 :)
Ken5233
Ken5233
感谢作者亲临呀。 本篇分享只是个人初次使用疑问,并不代表jf有任何问题,jf的设计思想和具体实现还有待深入了解 学习。 重新看过一遍demo和手册之后 对于心中多数疑问已经解决
返回顶部
顶部