2019-08-15 20:36
jfinal 与 spring cloud 是不同的领域,前者是 web + orm + aop + template engine 框架,后者是微服务技术栈,无法相比较
jfinal 要比较的话,是要同 spring boot 比较,其中的 web 部分属于同类,但 spring boot 的 orm 与 template engine 等模块都是集成的第三方,jfinal 这些功能都是自己手写,确保极简与高品质
关注一个技术是不是很老,还不如关注一个技术是不是最好用,如果一个很古老的技术直到现在都很好用,恰恰验证了其优秀
你可以试用一下 spring cloud , 买本书看一看,应用成本非常之高,对于绝大多数项目用用集群就搞定了,根本用不上 spring cloud
spring cloud 是对很多种技术的一个整合性的技术栈,是个大杂汇,我从来没见过哪家公司真正能将之用起来的,这个技术栈涉及面非常广:
服务治理整合的 Eureka
客户端负载均衡整合的 Ribbon
服务容错保护整合的 Hystrix
声明式服务调用整合的 Feign
Api 网关整合的 Zuul
消息总线整合的 RabbitMQ 或 Kafka
分布式服务跟踪整合的 Sleuth
web 框架整合的 spring boot
其它功能的整合不再赘述,总之用到啥就得去整合
spring 那套东西与 jfinal 基本是相反的路,jfinal 做小而精,核心功能都是自己写,保持极简设计,学习成本低,spring cloud 与 spring boot 绝大部分功能都是去整合,走的大而全的路
上面谈到的这些技术, 你要用上 spring cloud 的步骤大致如下:
1:将你的项目先拆分成小型的项目,也就是所谓的微服务。根据项目大小去拆分,有些人一个项目能拆成十多个微服务
2:拆分之前各模块的调用是方法调用,拆分后变成了服务间调用,一般是走 http、rpc 等机制,不仅徒增很多开发成本,而且会拉低性能,服务间通信的效率比方法调用要低得多
3:将前面谈到的一些技术用到的软件安装、配置、部署起来
4:按照 spring cloud 各项技术的要求,将第一步拆分的项目分别部署起来
这么多的技术全部跑起来并且进行维护的成本是极高的,99.9% 的公司顶多弄弄集群就搞定的事,根本不需这么来弄
剩下来有需要的是有钱、有人的大公司,而大部分大公司都有自己的一套分布式解决方案,仍然也用不上这些东东,这就是 spring cloud 的尴尬之处
最后,由于 spring cloud 的应用成本如此之高,未来分布式的趋势是走 k8s + docker + rancher 的技术路线,不仅成本低,而且对于应用来说是透明的,也就是说你开发的项目根本不用管分布式的事情,全交给更底层的容器来解决
jfinal 早在去年就思考过要不要介入微服务,也正由于 k8s + docker + rancher 这类技术路子更适合未来分布式的方向,所以 jfinal 才没出手微服务的事
一定要记住:选择不做什么比做什么更重要
2019-08-15 14:58
@戒不掉 线程之间是独立的,不会有影响,我怀疑是你的 afterJFinalStart() 因为大小写问题或者字母错误没有被回调
新版本 jfinal 支持 onStart() 回调,方法名改成 onStart() 再断点调试一下,这里有相关文档:
https://www.jfinal.com/doc/2-8
2019-08-15 09:24
@373118970 异常中出现了 spring 字眼,我估计应该是 spring 的问题, 当成是 spring 的问题搜索一下解决办法
2019-08-14 20:56
@也许这就是萌新吧 其实不用这么麻烦,直接在 exec 中表达式求值对比即可:
Object userId = exprList.getExpr(0).eval(scope);
Object role = exprList.getExpr(1).eval(scope);
if (userId.equals(role)) {
stat.exec(env, scope, writer);
}
2019-08-14 20:53
@zeroabc JSP 的用法是要极力避免的,因此 JSP 后来也转向了 JSTL,后来的主流模板引擎都走的 指令式路线, 而不是脚本式路线
enjoy 有很多扩展功能可以很方便实现这些功能,如果放开可以写脚本这个口子,后患无穷
模板引擎的定位是 将模式化的文本与动态数据结合起来, 生成 view , 一定要避免表达复杂逻辑的可能
2019-08-14 15:01
@Willson_L getBean、getModel 目前不支持这种格式的数据接收,目前支持 modelName.attribute 这种格式的数据
你要的支持可以自己写一个 getBeanList(...) 方法来实现,大致如下:
1:通过控制台输出的 jfinal action report 中的 parameter 这一样的参数的 key 来用好 getBean、getModel 帮助实现
2:用一个 for 循环来分步骤获取,在获取的时候注意参数的生成:
List ret = new ArrayList();
for (int i=0; i < size; i++) {
Team t = getBean("team[" + i + "]", true);
ret.add(t);
}
注意几点:
1:如果你的 Team 生成了 setter 方法可以使用 getBean,否则要使用 getModel
2: getBean、getModel 的第一个参数是动态生成的,里头有中扩号的生成,以及下标值的生成
3: getBean、getModel 的第二个参数传递 true,可以跳过一些类型转换之类的异常
4:size 值通过别的方式获取一下
2019-08-13 17:30
@江流儿0526 文档中都是现成的,而且极其简单,先看文档,节省大量时间:
https://www.jfinal.com/doc/9-1
2019-08-13 17:29
@奔跑路上的小高 纠正前面回复的一个笔误:
arp.setShowSql(...) 一定要放在 arp.start() 之前,而不是之后