JFinal有没有注解Action参数的插件
在用SpringMVC的时候,发觉它的参数配置非常不错,所以经常在工作中中被用来对外提供Restful接口,特别是它的定义接口参数的required=true/false,对参数是否为空进行验证,很方便。
以前也用JFinal1.8的在实际项目中,对外提供API,发现必须在每个Action的中提前对参数进行手动验证处理,有点恼火。这种在拦截器中是不好处理的。不知道网友在用的过程中有没有遇到这种情况,是怎么解决的。有没有比较好的解决办法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
引用来自“快速开发师”的评论
@JFinal 如果在Person对象中有name属性,而参数中也有一个String name, springmvc都会注入,springmvc会自动扫描所有参数,以及参数内部成员变量。这节省了用户写什么getParameter() 和什么@Parameter 以下输出应该是一样的。
@JFinal
2.2传递数组:
url:http://localhost/mvc/test/toPerson2.do?name=tom&name=jack
Java代码
@Parameter(name="userName") 这句话并不是一定要写,我就没写过,一样接受参数,既然可以不写还需要什么学习成本?而至于反射性能的问题并不是用户该考虑的问题,这是语言的局限服务器的局限,而现在cpu内存等都有提高又能有多少延迟?作者并没有测试就妄下论断,并且极简并不应该以代码量为标准,应该以用户操作性来考量。毕竟该是以用户(程序员)服务,追求代码量少,我也是醉了,如果怕是研究你代码的人读起来不方便,那我要告诉你读起来方不方便在于代码的架构简不简单,而不是代码量。
引用来自“快速开发师”的评论
@Parameter(name="userName") 这句话并不是一定要写,我就没写过,一样接受参数,既然可以不写还需要什么学习成本?而至于反射性能的问题并不是用户该考虑的问题,这是语言的局限服务器的局限,而现在cpu内存等都有提高又能有多少延迟?作者并没有测试就妄下论断,并且极简并不应该以代码量为标准,应该以用户操作性来考量。毕竟该是以用户(程序员)服务,追求代码量少,我也是醉了,如果怕是研究你代码的人读起来不方便,那我要告诉你读起来方不方便在于代码的架构简不简单,而不是代码量。
比我想象的代码量还要大,这个在java语言的限制下确实不容易做到很好
struts2 也是通过配置的方式获取到的参数名,本质上是一样的
没有提供这个功能的最大原因还是获取参数名称不方便
引用来自“JFinal”的评论
去年开发 jfinal 2.0 时候,已经开发完成了参数注入到方法形参的功能,上线前两天给删除了,因为带来的坏处比坏处还多。
由于 java 语言的局限性,实现注入通常两个办法:
1:用 java 8,然后还要配置编译参数
在被编译后的class文件中保留参数名称,这样才能够通过java 8 提供的反射功能得到参数名称,拿到参数名称是注入参数值的关键。因为你只有知道了请求中的参数名才能拿到参数值。这个方案的缺点是必须要用 java 8,以及还要配置编译参数,会给用户带来麻烦,现在很多用户还在用 java 5
2:spring 那种通过配置的方式
例如在参数名前面使用类似于 @Parameter 这样的注解
这种方案要引入额外的概念,不是极简,会提升学习成本,而且代码量也有一定的提升。所以 jfinal 2.0 在开发完成后都给删除掉了这个特性。此外,还有一些其它缺点,例如action允许有参数后,方法重载如何确定路由,注入参数要使用反射对性能有一定影响,代码实现复杂度提升有损极简等等。
有关action参数的验证,jfinal 提供了 Validator 可以非常方便地进行,并且 Controller 中还提供了 checkUrlPara(int, int) 这类方法来验证。楼主的问答中有一个说法比较有价值:require=true/false 这种简便的用法,虽然 jfinal 也可以使用Validator 来实现,但对于这些简单的校验还是稍欠方便性,后续会考虑增强简便地验证支持。
最后,能否给出一点示例代码,展示一下你所看到的 spring 是怎么用的,jfinal 好在未来的版本中改进。
回复
嗯。如果不用java8的话,的确不方便,写注解还不如通过getPara**方法来得方便。
可否有相应的源码参考,给个参考文章地址,多谢.
说说我的思路,基于java8实现,编译时需要加-parameters这个参数。当时也实现了一个@Param注解,主要用于url参数名与java参数名不一致的地方,还有就是有默认值的地方。大多数情况下不需要这个@Param参数。
我对jfinal进行了一定的改造,我是在启动时分析所有的Controller,若某个方法为public且参数不为空,则自动构建一个参数获取器,并存储在Action对象中。并修改Invocation,invoke时使用action中存储的参数获取器来获取参数,然后invoke时加入参数。 因为是在启动时通过分析(编译)来提前进行参数相关运算,所以运行时几乎没有性能损失。
波总因为要照顾到java6、7、8各个版本的开发者,所有不可能这么激进。
我是做了一个的特定改造版本的jfinal,只支持java8,自己玩着用。
刚看了一下,这个特性2014年10月份写的,一直在自己用,当时写的初衷是为了提升代码质量,因为字符串很容易写错。
去年开发 jfinal 2.0 时候,已经开发完成了参数注入到方法形参的功能,上线前两天给删除了,因为带来的坏处比好处还多。
由于 java 语言的局限性,实现注入通常两个办法:
1:用 java 8,然后还要配置编译参数
在被编译后的class文件中保留参数名称,这样才能够通过java 8 提供的反射功能得到参数名称,拿到参数名称是注入参数值的关键。因为你只有知道了请求中的参数名才能拿到参数值。这个方案的缺点是必须要用 java 8,以及还要配置编译参数,会给用户带来麻烦,现在很多用户还在用 java 5
2:spring 那种通过配置的方式
例如在参数名前面使用类似于 @Parameter 这样的注解
这种方案要引入额外的概念,不是极简,会提升学习成本,而且代码量也有一定的提升。所以 jfinal 2.0 在开发完成后都给删除掉了这个特性。此外,还有一些其它缺点,例如action允许有参数后,方法重载如何确定路由,注入参数要使用反射对性能有一定影响,代码实现复杂度提升有损极简等等。
有关action参数的验证,jfinal 提供了 Validator 可以非常方便地进行,并且 Controller 中还提供了 checkUrlPara(int, int) 这类方法来验证。楼主的问答中有一个说法比较有价值:require=true/false 这种简便的用法,虽然 jfinal 也可以使用Validator 来实现,但对于这些简单的校验还是稍欠方便性,后续会考虑增强简便地验证支持。
最后,能否给出一点示例代码,展示一下你所看到的 spring 是怎么用的,jfinal 好在未来的版本中改进。