2017-12-05 12:27

@Dreamlu 后续会干掉 cglib 依赖,但可以考虑实现 cglib 中的核心功能,一是用来实现业务层 AOP、二是用来实现你建议的让 jdk6、7 都可以用上这个 aciton 参数注入的功能

2017-12-05 11:34

@Dreamlu jfinal-java8 这个 jfinal 版本的 action 参数注入并不依赖于 cglib,而是 java8 自带的 API

cglib 目前仅用于支持业务层 AOP,而且也只是个过渡,有时间会将 cglib 干掉,让 jfinal 重回“对第三方无依赖”

2017-12-05 11:33

先点赞、收藏,有时间的时候看一下是否可以改进这里,感谢你的分享

2017-12-05 11:29

何时回收取决于 JVM 的行为。 此外,你还可以使用下面的代码重复利用 controller 对象:
me.setControllerFactory(new FastControllerFactory());

2017-12-04 21:28

ActiveRecordPlugin 没有启动,或者是当前所使用的 Model 没有映射

如果是自主管理的 ActiveRecordPlugin,需要手动调用一下它的启动方法:
arp.start()

2017-12-04 17:18

@Yuengh 新版本的引擎是 jfinal 新添加的一个功能模块,具体用法可以看一下 jfinal 手册,极其简单

2017-12-04 17:18

设置下方言试试: arp.setDialect(new SqlServerDialect());

2017-12-04 17:16

使用 jfinal 的 Generator,生成 base model,会自动拥有 getter、setter 方法,然后你再通过 Model 来转成 VO 就很方便了

报 The table name: xxx not in your sql 的错误,因为在开发模式下会检查你的 sql 是否包含了主表的表名,这个在 jfinal 更高版本中已经移除了这个判断,建议升级到 jfinal 3.3

2017-12-04 17:13

HttpKit 代码很少,仅实现了极少的常用功能,暂不支持文件上传

推荐用 okhttp 这个第三方来发送 post 方法上传文件,很轻量级

2017-12-04 17:12

根据 @lyh061619 的回复设置一下就可以了:
arp.setTransactionLevel(2);

因为 oracle 不支持 transaction level 为 4。jfinal 只有一个版本才出这个提示,其它版本处理过 oracle 下的 transaction level

2017-12-04 16:35

jfinal 的模板引擎确实还没有整合到 struts 中去,但是只要看一下 jfinal 手册的 第 6.11 章节《 任意环境下使用 Engine》,就知道如何在任意环境下使用了

大致就是先配置,后使用:
1:配置:Engine.use().setBaseTemplatePath(...)
2:使用:Engine.use().getTemplate(fileName).render(...)

render 方法中的参数,可以参考一下 jfinal 中的 com.jfinal.render.TemplateRender 中的用法,就是从 request 中获取一个 outputStream 来用:
OutputStream os = requet.getOutputStream();
Engine.use().getTemplate(fileName).render(data, os);

如果你用到了 shared method、shared function 功能,也就是再添加两行代码的事:
1:Engine.use().addSharedFunction("layout.html");
2:Engine.use().addSharedMethod(new StrKit());

无论是配置,还是使用,代码量都少得惊人

2017-12-04 16:08

再补充一下,上面的所说的一切,仅仅针对于 #define 定义的 template function 而言,而表达式中调用 java 方法时,与 java 规则完全一样,例如:
#("abc".substring(1))
#("abc".substring(0, 2))
上面的 substring 方法调用的是 java 中的 String 类型的两个重载过的 substring 方法,这类调用是支持通过不同的参数个数、不同的参数类型,去调用不同的重载方法的

除了上面的调用 java 类上的方法以外,jfinal 的 shared object、shared method、extension method 这三种扩展全都支持方法重载

2017-12-04 16:03

用 #define 定义的 template function 的参数个数是固定的,除了性能方面的考虑,本质上是模板引擎是动态类型,不方便像java一样通过类型去判断调用的是哪个重载方法。

此外, template function 天然就支持更方便的传参方式,所以就更加没有必要像 java 那样实现,例如,你可在定义时只使用一个参数,例如:
#define layout(map)
#(map.title)
#(map.desc)
#end

传参的时候这样:
#@layout({title : "JFinal 极速开发社区" , desc: "天下武功,唯快不破"})
通过上面的方式,你可以传递任意类型,任意数量的参数进去


除了以上的方式传参以外,还可以通过 #set(...) 指令在模板中任意传参,例如:
#define layout()
#(title)
#(desc)
#end

用的时候这样:
#set(title = "JFinal", desc = "天下武功,唯快不破")
#@layout()
第二种方式相当于将参数从调用向前挪到了 #set 指令中

通过上面两种用法可以看出来,虽然 jfinal enjoy 引擎没有通过参数个数与参数类型进行函数重载,但传参可以更加自由灵活。

本质上是因为动态类型不方便通过参数的变数来实现重载

2017-12-04 11:22

如果是在 jfinal 中用,那么 @杜福忠 的分享就极好

如果是整合在 spring 中用,需要在 spring 的配置文件中为 不同的 ViewResolver 配置上不同的 order、suffix,重点关注册 spring 的配置就可以了

2017-12-02 17:21

前端弄一个 nginx 做负载均衡,后面是多个 tomcat,后面的 tomcat 每个管一个项目,升级的时候停掉 tomcat 一个个来升级项目

某一个 tomcat 停掉的时候, nginx 发现不能连通,会自动将请求转发给连通的 tomcat,这样就可以实现 24 小时不停服升级

这种架构属性于集群部署,所以 session 之类的就必须工共享,每个项目实例不能存放可修改的状态,否则会有问题。 当然,如果应用不是很关键,是可以允许这种情况的