2019-08-15 20:38

前端使用多个 input type="file" 即可

后端用 getFiles() 来接收即可

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 12:27

@戒不掉 里头设置一个断点,调试进去看一下就清楚了,这类问题切忌猜谜,要是谜那么好猜调试也就没啥意义了

2019-08-15 09:24

@373118970 异常中出现了 spring 字眼,我估计应该是 spring 的问题, 当成是 spring 的问题搜索一下解决办法

2019-08-14 20:57

顶多再加上在 setExprList(...) 方法中控制一下参数个数,可以参考一下 com.jfinal.template.ext.directive 中一些指令的用法

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 20:49

用法上可以,可能是代码逻辑有错误,检查一下 getCurrentUser() 方法有没有线程安全问题

此外,解决这类问题通过单步调试是必然的,实时动态了解变量的变化

2019-08-14 15:04

enjoy 不支持 new 语句,可以通过 shared object、shared method 扩展一些功能来创建对象

2019-08-14 15:03

arp1 与 arp2 这两个对象不能使用同一个 _MappingKit.java 来映射, 得通过两个不同的生成器生成两个不同的文件:
_MappingKitAaa.java 与 _MappingKitBbb.java

创建两个生成器对象,对其中第二个生成器通过 generator.setMappingKitClassName("_MappingKitBbb") 可以配置生成的文件的文件名

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-14 13:26

HttpKit 仅供 jfinal 内部的几个小地方使用,并不支持太多功能

建议使用 OkHttp

2019-08-13 17:30

@江流儿0526 文档中都是现成的,而且极其简单,先看文档,节省大量时间:
https://www.jfinal.com/doc/9-1

2019-08-13 17:29

@奔跑路上的小高 纠正前面回复的一个笔误:
arp.setShowSql(...) 一定要放在 arp.start() 之前,而不是之后