JFinal有没有注解Action参数的插件

发布于 2021-12-04 10:52:13 字数 340 浏览 723 评论 14

在用SpringMVC的时候,发觉它的参数配置非常不错,所以经常在工作中中被用来对外提供Restful接口,特别是它的定义接口参数的required=true/false,对参数是否为空进行验证,很方便。

以前也用JFinal1.8的在实际项目中,对外提供API,发现必须在每个Action的中提前对参数进行手动验证处理,有点恼火。这种在拦截器中是不好处理的。不知道网友在用的过程中有没有遇到这种情况,是怎么解决的。有没有比较好的解决办法。

@JFinal

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

韬韬不绝 2021-12-04 17:10:58

引用来自“快速开发师”的评论

  1. 这算是基础了:
  2. url:http://localhost/mvc/test/toPerson1.do?name=zhangsan&age=14&address=china&birthday=2000-2-11
  3. @RequestMapping("/toPerson1.do")  
  4. public String toPerson1(String name, Integer age, String address,  
  5.              Date birthday) {  
  6.            System.out.println(name + " " + age + " " + address + " " + birthday);  
  7.            return "jsp1/index";  
  8. }  
眼眸里的那抹悲凉 2021-12-04 17:10:57

@JFinal 如果在Person对象中有name属性,而参数中也有一个String name, springmvc都会注入,springmvc会自动扫描所有参数,以及参数内部成员变量。这节省了用户写什么getParameter() 和什么@Parameter 以下输出应该是一样的。

  1. @RequestMapping("/toPerson3.do")  
  2. public String toPerson3(Person person, User user,String name) {  
  3.     System.out.println(person.getName());  
  4.     System.out.println(name);  
  5.     return "jsp1/index";  
  6. }  

酷到爆炸 2021-12-04 17:10:55
  1. 这算是基础了:
  2. url:http://localhost/mvc/test/toPerson1.do?name=zhangsan&age=14&address=china&birthday=2000-2-11
  3. @RequestMapping("/toPerson1.do")  
  4. public String toPerson1(String name, Integer age, String address,  
  5.              Date birthday) {  
  6.            System.out.println(name + " " + age + " " + address + " " + birthday);  
  7.            return "jsp1/index";  
  8. }  
緦唸λ蓇 2021-12-04 17:10:55

@JFinal

2.2传递数组:

url:http://localhost/mvc/test/toPerson2.do?name=tom&name=jack  

Java代码  
收藏代码

鹤舞 2021-12-04 17:10:53

@Parameter(name="userName") 这句话并不是一定要写,我就没写过,一样接受参数,既然可以不写还需要什么学习成本?而至于反射性能的问题并不是用户该考虑的问题,这是语言的局限服务器的局限,而现在cpu内存等都有提高又能有多少延迟?作者并没有测试就妄下论断,并且极简并不应该以代码量为标准,应该以用户操作性来考量。毕竟该是以用户(程序员)服务,追求代码量少,我也是醉了,如果怕是研究你代码的人读起来不方便,那我要告诉你读起来方不方便在于代码的架构简不简单,而不是代码量。

疾风者 2021-12-04 17:10:53

引用来自“快速开发师”的评论

@Parameter(name="userName") 这句话并不是一定要写,我就没写过,一样接受参数,既然可以不写还需要什么学习成本?而至于反射性能的问题并不是用户该考虑的问题,这是语言的局限服务器的局限,而现在cpu内存等都有提高又能有多少延迟?作者并没有测试就妄下论断,并且极简并不应该以代码量为标准,应该以用户操作性来考量。毕竟该是以用户(程序员)服务,追求代码量少,我也是醉了,如果怕是研究你代码的人读起来不方便,那我要告诉你读起来方不方便在于代码的架构简不简单,而不是代码量。

柒夜笙歌凉 2021-12-04 17:10:51

比我想象的代码量还要大,这个在java语言的限制下确实不容易做到很好

皇甫轩 2021-12-04 17:10:51

struts2 也是通过配置的方式获取到的参数名,本质上是一样的

累赘 2021-12-04 17:10:41

没有提供这个功能的最大原因还是获取参数名称不方便

复古式 2021-12-04 17:10:41

引用来自“JFinal”的评论

    去年开发 jfinal 2.0 时候,已经开发完成了参数注入到方法形参的功能,上线前两天给删除了,因为带来的坏处比坏处还多。

   由于 java 语言的局限性,实现注入通常两个办法:

1:用 java 8,然后还要配置编译参数

     在被编译后的class文件中保留参数名称,这样才能够通过java 8 提供的反射功能得到参数名称,拿到参数名称是注入参数值的关键。因为你只有知道了请求中的参数名才能拿到参数值。这个方案的缺点是必须要用 java 8,以及还要配置编译参数,会给用户带来麻烦,现在很多用户还在用 java 5

2:spring 那种通过配置的方式

    例如在参数名前面使用类似于 @Parameter 这样的注解

public void action(@Parameter(name="userName")String userName, @Parameter(name="password")String password) {
  // other code here
}

   这种方案要引入额外的概念,不是极简,会提升学习成本,而且代码量也有一定的提升。所以 jfinal 2.0 在开发完成后都给删除掉了这个特性。此外,还有一些其它缺点,例如action允许有参数后,方法重载如何确定路由,注入参数要使用反射对性能有一定影响,代码实现复杂度提升有损极简等等。

    有关action参数的验证,jfinal 提供了 Validator 可以非常方便地进行,并且 Controller 中还提供了 checkUrlPara(int, int) 这类方法来验证。楼主的问答中有一个说法比较有价值:require=true/false 这种简便的用法,虽然 jfinal 也可以使用Validator 来实现,但对于这些简单的校验还是稍欠方便性,后续会考虑增强简便地验证支持。

    最后,能否给出一点示例代码,展示一下你所看到的 spring 是怎么用的,jfinal 好在未来的版本中改进。

   

柒夜笙歌凉 2021-12-04 17:10:05

回复
嗯。如果不用java8的话,的确不方便,写注解还不如通过getPara**方法来得方便。

画骨成沙 2021-12-04 17:07:34

可否有相应的源码参考,给个参考文章地址,多谢.

把回忆走一遍 2021-12-04 17:03:52

说说我的思路,基于java8实现,编译时需要加-parameters这个参数。当时也实现了一个@Param注解,主要用于url参数名与java参数名不一致的地方,还有就是有默认值的地方。大多数情况下不需要这个@Param参数。

我对jfinal进行了一定的改造,我是在启动时分析所有的Controller,若某个方法为public且参数不为空,则自动构建一个参数获取器,并存储在Action对象中。并修改Invocation,invoke时使用action中存储的参数获取器来获取参数,然后invoke时加入参数。 因为是在启动时通过分析(编译)来提前进行参数相关运算,所以运行时几乎没有性能损失。

波总因为要照顾到java6、7、8各个版本的开发者,所有不可能这么激进。

我是做了一个的特定改造版本的jfinal,只支持java8,自己玩着用。

刚看了一下,这个特性2014年10月份写的,一直在自己用,当时写的初衷是为了提升代码质量,因为字符串很容易写错。

顾挽 2021-12-04 16:59:57

    去年开发 jfinal 2.0 时候,已经开发完成了参数注入到方法形参的功能,上线前两天给删除了,因为带来的坏处比好处还多。

   由于 java 语言的局限性,实现注入通常两个办法:

1:用 java 8,然后还要配置编译参数

     在被编译后的class文件中保留参数名称,这样才能够通过java 8 提供的反射功能得到参数名称,拿到参数名称是注入参数值的关键。因为你只有知道了请求中的参数名才能拿到参数值。这个方案的缺点是必须要用 java 8,以及还要配置编译参数,会给用户带来麻烦,现在很多用户还在用 java 5

2:spring 那种通过配置的方式

    例如在参数名前面使用类似于 @Parameter 这样的注解

public void action(@Parameter(name="userName")String userName, @Parameter(name="password")String password) {
  // other code here
}

   这种方案要引入额外的概念,不是极简,会提升学习成本,而且代码量也有一定的提升。所以 jfinal 2.0 在开发完成后都给删除掉了这个特性。此外,还有一些其它缺点,例如action允许有参数后,方法重载如何确定路由,注入参数要使用反射对性能有一定影响,代码实现复杂度提升有损极简等等。

    有关action参数的验证,jfinal 提供了 Validator 可以非常方便地进行,并且 Controller 中还提供了 checkUrlPara(int, int) 这类方法来验证。楼主的问答中有一个说法比较有价值:require=true/false 这种简便的用法,虽然 jfinal 也可以使用Validator 来实现,但对于这些简单的校验还是稍欠方便性,后续会考虑增强简便地验证支持。

    最后,能否给出一点示例代码,展示一下你所看到的 spring 是怎么用的,jfinal 好在未来的版本中改进。

   

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文