2018-07-10 20:09

使用 Arrays.asList 之前需要配置一下:
engine.addSharedObject("Arrays", new Arrays());

如果不配置去使用也可以,但是要像下面这样来用:
#if (java.util.Arrays::asList(...))

第一种用法叫 shared object,第二种叫 static method 。 在文档中全都有详细的例子和说明:
http://www.jfinal.com/doc/6-8
http://www.jfinal.com/doc/6-3

2018-07-10 20:07

这个打印的信息并不一样,有的有拦截器,有的没有。

显然是跳转关系没有理清造成的,注意在不需要拦截的 action 上使用 Clear 清除掉:
@Clear(Interceptor.class)

单步调试即可发现其中的问题

2018-07-10 20:03

@静态代码块 我自己碰到这个错误,先是用 ecilpse 打开 pom.xml 进入 Dependency Hierarchy 视图,看看有没有同一个 jar 包被多个地方依赖,这样打出来的 jar 包会包含同一个 jar 包的多个版本。这种情可以通过配置 exclusion 来排除掉低版本的,只保留一个

如果不是上面的原因引起的,第二步是删掉本地 maven 库中报错的那个 jar 包所在的目录,让 maven 重新下载一次

解决这个问题很机械化,并没有什么秘密

2018-07-09 23:48

@阿呆这者几天过去了,还没解决?

2018-07-09 17:49

maven-jar-plugin 这个只是我做的一个测试用的,当时忘了删掉了,先删之,然后将 jar 改成 war

2018-07-09 17:48

配置一下 JVM 启动时的内存大小。如果还是不够用,用 java 自带的 visual vm 这个工具检查项目中是否有内存泄漏,解决之

2018-07-09 17:47

@zhaofan 将 jfinal 中的那个 HashKit 工具拿过来用就可以了,里面有些工具类,所以去除了 jfinal weixin 中重复的工具

2018-07-09 17:45

调用了 dao() 方法以后,就自然变成线程安全的了,不用担心

如果没调用 dao() 方法,并且前面是 static,那么这个对象是所有线程都可以并发使用的,自然会有线程安全问题,因为内部并没有使用 synchronized 这类锁机制

如果使用的时候每次 new 出来,功能上确实是完全一样的,就是为了省点时空,仅此而已

Model 中的 dao 是不提倡这么用的,而是在 Service 中使用一个 private Xxx dao = new Xxx().dao() , 这样可以避免在业务层之外操作数据库

在首页下载一下 jfinal demo,参考里面的用法,一定要有业务层,一定不要在 model 中 new Xxx().dao() 出来,养成良好的开发习惯

2018-07-09 14:38

@zhaofan 已发布,直接在 pom.xml 改版本号为 2.0 即可升级

2018-07-09 11:12

再补充一下,如果再要做得细致一些,可以针对不同的响应数据,设置不同的 context type,具体的设置值可以参考一下 jfinal 源码中的 com.jfinal.render.ContextType 中的字符串常量

2018-07-09 11:10

最后别忘了搞定后,回来在本分享中追加上改进后的代码

2018-07-09 11:09

博主的方案非常简单,代码也很省,在 outputStream.close() 后面应该要加上一句 renderNull()

这里有个改进建议,可以将 StaticResourceController 中的代码全部转移到 FileHandler 中,request、response 对象都在里面可以直接用,最后别忘了在 if 中加两行代码:
isHandled[0] = true;
return;
加这两行一是避免 tomcat、jetty 容器处理这个请求,二是辟免执行后面的 next.handle(...)

此外,建议在 finally 块中关闭 outputStream、inputStream

最后,再建议创建一个比较小的 byte[] buffer(例如 new byte[512]),一边从 inputStream 中读,一边往 outputStream 里面写,这样就避免了每次 new 出很大的 buffer,可提升性能

在 for 循环中判断读取的 len 是不是 -1,来代替 inputStream.available();

大致结构如下:
byte[] buf = new byte[512];
int len=-1;
while((len=inputStream.read(buf)) != -1) {
outputStream.write(buf, 0, len);
}

2018-07-08 18:03

文档中有红色字体详细说明
http://www.jfinal.com/doc/5-6

2018-07-08 10:35

简单来说,jfinal 给出默认实现,有特殊需求的可以自行扩展,扩展大多可以通过 extends 然后覆盖一下父类的方法来实现

2018-07-08 10:34

@江南1111 jfinal 的 json 模块是全开放式结构,你可以继承一下 JFinalJson,然后参考 com.jfinal.json 包下面的 JsonFactory 自建一个 MyJsonFactory ,将 json 实现切到自己实现的 json 实现上去

配置:
me.setJsonFactory(new MyJsonFactory());

扩展:
public class MyJson extends JFinalJson {
...
}

jfinal 原有的 JFinalJson 不能随便动,这个类已经用了 6 年多了,改变现有规则影响面太大