我想请教jfinal使用上的几个问题

loda0128 发布于 2015/04/17 22:31
阅读 394
收藏 1

@JFinal 你好,想跟你请教两个问题:

1.jfinal框架里面有没有像springmvc那样方便的Controller类上RequestMapping注解

2.jfinal里面有没有像springmvc里面那样传递参数的时候可以动态绑定到参数列表中的对象中的方法

支持jfinal。如果有的话就能方便的拿来用了。如果没有的话,那我这边就自己造轮子了

加载中
0
xiuj
xiuj
可看手册
0
JFinal
JFinal

      无论是注解还是其它形式的配置,例如xml,在 JFinal 中都会被尽可能地避免,注解也是配置的一种形式。COC 原则是比使用配置更加优秀的思想。

    所以 JFinal 只需要使用 me.add("user", UserController.class) 这种方式即可将 UserController 中所有 action 进行路由配置,而不必对每个 action 使用冗余而繁琐的 RequestMapping 注解。

   动态参数绑定到参数列表对于 java 语言来说不太合适,除了有性能方面的原因,更重要是语言方面的支持力度不够。例如:假定 public void action(String userName) 这个 action,传来了一个参数叫 String userName,对于框架实现来说,要得到 userName 这个参数所对应的值需要这样 reqeuest.getParameter("userName"),问题来了,对于java 语言来说无法得到 "userName" 这个字符串,也即你无法知道形参的参数名,只能知道它的参数类型,因为String userName 这个参数的名称会在编译后变成一个符号性的东西。

    在 java 世界里,想要知道方法参数名称通常的做法是使用额外的注解,spring 是这样解决的:public void action(@Parameter(name="userName") String un),这种方式代码量提升了不利于极速开发。另一个得到参数名称的办法是通过类似于 eclipse 编译器 ecj 这样的东东,这种编译器在编译 java 代码时,将参数名称进行了保留没有符号化,但你需要写程序对编译后的 class 文件进行分析得到参数名称,这样不仅对性能十分不利而且一旦换了编译器就会失效,体验非常地差。eclipse 的 ecj 的目的是为了代码提示功能可以显示出参数名,也为了调试程序时可以显示参数名。语言层面还有一个纠结的问题,如果编译时保留参数名,那么反编译就变得更容易。

    以上的讨论还没有涉及action method带参数后重载方法的问题,随着讨论的深入会发现复杂度会提升更多,而 jfinal 的解决方案是以上权衡后的结果,使用 getModel(...) 就可以搞定参数的绑定,代码量不仅极少,而且性能最优。如果将来 java 在语言层面对方法参数名有支持 jfinal 会立即考虑实现,作者所期望的形式类似于这样: Para p = method.getPara(int); String paraName = p.getName();

   几年前曾经想过对 java 做一个极速化简洁的方言,类似于groovy但比 groovy 要简单得多,时间太有限没有精力弄。

loda0128
loda0128
spring确实有很多让我们用着看起来很方便但是确实极大的影响速度的一些东西。我觉得java语言在这些框架的狂轰滥炸和像我们一样的小白大批涌入的情况下,会为了学起来简单后面做不知道多少多少工作,最后变得无比复杂,以至于小白们最后都完全不能了解原理什么的了。支持像jfinal这样的框架,让java重返青春
0
红薯官方
红薯官方

其实你想要的感觉可以这样实现:

自己定义个RequestMapping注解,然后呢,写个包扫描器,扫描controller自动注册。

JFinal
JFinal
回复 @mjaow : jfinal 在默认路由规则之外,还可以使用 @ActionKey(String) 来打破原有规则,少数情况下比较实用。配置集中是 jfinal 一直坚持的设计原则,分散意味着不方便查找和管理
loda0128
loda0128
恩,这个我昨天确实是自己写了个ControllerKey(value="xxx")的注解,并加上了包扫描功能,今天一想,这样做确实存在一定的效率问题,因为要递归扫描磁盘上包中的类文件,而且注解代码比较分散,不容易统一管理
红薯官方
红薯官方
回复 @JFinal : 对,这种东西可以根据实际需要去定制。
JFinal
JFinal
除了增加了复杂度,降低了效率,增加了代码量,这样做相对于 jfinal 给出的实现没啥优势
返回顶部
顶部