2020-07-24 21:43

@大大咧咧 还得麻烦你再多试几个,尤其是 renderQrCode("abc")

这个是输出二维码的,很重要

2020-07-24 21:36

@大大咧咧 幸好你提出来了,正要发布新版本 jfinal 4.9.01 到 maven 中心库,你迟一点就晚来一步了 ^_^

2020-07-24 19:44

这个涉及到比较繁琐的细节,建议加入俱乐部,除了 jfinal.com 官网源代码以外,我再给你一套极简的微信支付源码

2020-07-24 16:53

@大大咧咧 感谢支持

由于 TextRender 已添加了 flush(), 所以我现在最关心的是 TemplateRender 是否有此问题

希望你能在你出问题的机器上进行这个测试,如果 TemplateRender 也有问题,那就也要添加

有可能与电脑也有关系,要在你出问题的那台电脑上测试

2020-07-24 15:31

这里还有个问题需要你来帮助一下

在你当前的开发环境下,碰到了 TextRender 需要 writer.flush() 才有返回的情况

那么你再用一下 TemplateRender,看看这个工作是否正常,因为这个也是没有 outputStream.flush() 的

再告知一下你运行使用的容器,是 tomcat、jetty 还是 jfinal undertow,版本是多少,这有助于打磨 jfinal 自身

2020-07-24 15:29

@Dirge 连启动脚本为啥不用一个 bin 子目录来放也是有考虑的,你可以思考一下这里头的好处

2020-07-24 14:59

这个应该是与其它 Render 的 OutputStream.flush() 一起注掉的,主要是因为跟踪到 tomcat、jetty 容器底层,发现它们本身就有一个 flush()

所以 jfinal 中减少一次 flush() 可以提升性能

而 TextRender 面对的是 Writer 而非 OutputStream,或许有些底层容器并没有及时 flush()

请问你用的哪个容器,是不是 undertow? 我还得看看它的源码

此外,由于这个地方不能非分百保障所有容器都及时 flush,所以 jfinal 也只是先注释,并没有删掉这行代码

刚刚已经去除了注释:
https://gitee.com/jfinal/jfinal/commit/ae0c988bc3387981ceb62ebe36abf85d920828b6

2020-07-24 12:08

做到 jfinal 内部,可能会失掉一些通用性,所以暂时建议扩展一下,起码有如下方式扩展,任选其一:
1:通过实现 com.jfinal.core.paragetter.ParaGetter.java 这个接口扩展一个支持 json 的类,例如:
public class JsonMapGetter extends ParaGetter {
public JsonMapGetter(String parameterName, String defaultValue) {
super(parameterName, defaultValue);
}

public T get(Action action, Controller c) {
return to(c.getRawData());
}

protected T to(String v) {
return v != null ? FastJson.getJson().parse(v, Map.class): "null";
}
}

然后注册一下:
ParaProcessorBuilder.me.regist(Map.class, JsonMapGetter.class, null);

用的时候这样:
public class MyController extends Controller {
public void index(Map jsonMap) {
...
}
}

上面的扩展可以将 json 数据转成 Map 类型,你希望支持哪种类型就像上面的这样扩展,当然,上面的扩展还可以更更完善,例如在 get(Action, Controller) 方法中判断当前请求是否为 application/json, 分情况采取不同的处理方式会更灵活

2: 通过引入一个public class BaseController extends Controller, 在其中添加一些你常用到的 getXxx 方法,转成希望的类型,配合 getRawData() 可以很方便获取 json 数据

2020-07-24 11:47

@kulan 还是没回答我的问题, 这个掉线是什么意思? 是家里的路由器掉线了?

2020-07-24 11:44

我再多谈一点这个结构在安全性上的考虑,传统打成的 WAR 包这类方案,其配置文件与 jar 包会打到 webapp/WEB-INF 下面,例如:
webapp/WEB-INF/classes
webapp/WEB-INF/lib

而生产环境下很多都会使用 nginx 还对 webapp 下的 web 资源进行反向代理,nginx 中通常有下面一行配置:
root /my-project-path/webapp/

然后,恶意攻击者就可以通过在浏览器中输入 http://域名/WEB-INF/lib/xxx.jar 以及 http://域名/WEB-INF/classes/app-config.txt 下载你的 jar 包和配置文件了

你的数据库密码之类的也可以分分钟泄漏
你的 jar 包被下载以后可以被反编译,拿到你的业务源代码,进而可以进一步深入攻击

你得再配置 nginx 的 location 来阻止这种访问才能避掉这个坑

而 jfinal 的打包方式完全不存在这个问题,因为 config、lib 并没有放在 webapp 之下,极度安全

2020-07-24 11:37

@Dirge 浏览一下打包后的目录:
0:根目录下是启动脚本
1:config 下是配置文件
2:lib 下是依赖的 jar 包以及项目本身源码打成的 jar 包
3:webapp 下是 web 资源,例如 html、js、css、图片等等

这个结构几近完美,是经过多年经验总结与微调后的精心设计,你不可能找到比这个更爽的打包结构

2020-07-23 20:24

@谢 应变是你的定时任务启动比 ActiveRecordPlugin 要早,而线程调度的时间不是严格确定的,所以时好时坏

解决办法是在 configPlugin 中先添加 ActiveRecordPlugin,再添加 Cron4jPlugin:
configPlugin(Plugins me) {
me.add(arp);
me.add(cron4jPlugin);
}

2020-07-23 17:18

修改 jfinal.sh 中的 MAIN_CLASS 的值,提示已经给出很明确了, 天天都在用的,不会有啥问题

注意 linux 下的 .sh 脚本文件的换行字符是 \n , 而不能是 \r\n

文档中有过说明:
https://jfinal.com/doc/1-5

注意看上述文档中有关脚本使用的问题

2020-07-23 16:54

配置看着是没错误,检查一下下面原因:
1:运行 jetty 的用户是否拥有 /opt/app/log/fshop.log 这个文件的写权限
2:当前配置还能向控制台输出,看一下控制台的输出有没有

如果解决不了,下载首页的 jfinal_demo_for_maven.zip,直接使用里面的配置去修改,以免你的配置有些细节配置错误

2020-07-23 16:08

是 JVM 挂掉了? 还是像断网似的掉线?