2020-06-20 17:31
@穿越123 将事情搞复杂是很容易的,反之是很难的,jfinal 擅长将复杂问题简化
2020-06-20 17:30
很久没有关注 reids plugin 了, 发布、订阅这个功能很重要,希望 @杜福忠 同学能提交 PR 过来
2020-06-20 17:26
@SamUU jfinal 重点关注在 web + orm + aop + enjoy 这四个方面,不能平均使力,资源总是有限的
2020-06-20 17:24
jfinal undertow 的代码虽然极少,但细节极多,要实现的功能十分丰富
从 jfinal undertow 项目中的配置 demo 可以获取到 95% 以上的配置项用法,剩下的需要看看源码,当然,大分部分配置不需要关注, jfinal undertow 很贴心的处理好了默认该做什么
博主的分享非常详细,通过阅读,我自己也回忆起了一篇当初写这些代码的细节。
要实现功能是极端容易的,要简单、全面、通用、体贴入微地实现这些功能是很不容易的,魔鬼都在细节之中
最后,对于人脑来说,输出才是最好的输入,将所理解的知识通过文字或者其它方式输出,才是最好地掌握这些知识的方法
2020-06-16 17:11
结合 setRet(...) 与 getRet() 来用:
public class LoginValidator extends Validator {
protected void validate(Controller c) {
setShortCircuit(true);
/**
* 注入 Ret 对象,validateXxx(...) 方法的验证结果将被存放于该 Ret 对象之中,
* 以便于 handleError 中使用:
* controller.renderJson(getRet());
*
* 具体到本例,LoginController.doLogin() 中使用的 renderJson(ret)
* 与 LoginValidator.handleError() 中使用的 c.renderJson(getRet())
* 实现了返回值格式的统一(Ret 设置 state、msg 属性值),所以前端 js 可以
* 统一处理返回数据:
* if (ret.state == "ok") {
* location.href = ret.returnUrl;
* } else {
* alert(ret.msg);
* }
*
* 否则 Validator 层与 Service 层返回的 Ret 值格式将不同,前端 js 需要
* 对两种格式分别做处理
*/
setRet(Ret.fail()); // Ret.fail() 将设置 state : "fail" 值
validateRequired("userName", "msg", "邮箱不能为空");
validateEmail("userName", "msg", "邮箱格式不正确");
validateRequired("password", "msg", "密码不能为空");
validateCaptcha("captcha", "msg", "验证码不正确");
}
protected void handleError(Controller c) {
// getRet() 与 setRet(...) 配合使用
Ret ret = getRet();
c.renderJson(ret);
}
}
2020-06-15 22:27
@jfinal爱好者22 下载我上一条回复中链接的文件,可配置扩展来解决
配置以后,保持你以前的用法 redirect(...) 即可
2020-06-15 20:54
@zzutligang 这个方案本来是做到 4.9 中来的,有一个小问题没测试出来,所以不完美,完美的方案需要下载这个用上:
http://free-download.jfinal.com/download/MyRenderFactory.zip
2020-06-15 20:53
@jfinal爱好者22 忘了上次详细回复过这个问题,况且解决方案也有下载:
https://jfinal.com/feedback/1925
下载地址:
http://free-download.jfinal.com/download/MyRenderFactory.zip
2020-06-15 20:51
@阿国 JsonUtils 默认不会将 auto_color 转成 autoColor
估计是你扩展过 JFinalJson,让其支持了驼峰
2020-06-15 20:47
@jfinal爱好者22 当使用 nginx 做代理时,nginx 与用户客户端/浏览器之间使用的是 https 以及端口号 443。 而 nginx 与你的项目之间使用的是 http 与类似 8080 这样的端口
从而,在 jfinal 的 RedirectRender 中所能看到的仍然只可能是 http 与 8080, 而看不到 https 与 443
所以,解决的思路必定是将 nginx 所知晓的 https 与 443 传递到 RedirectRender 中
有了上述的铺垫,解决起来就容易了,首先在 nginx 中添加如下两行配置,将 https、443 这两个值传递给你的项目:
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
然后将线上的 jfinal 最新 RedidrectRender.java 源码复制出来:
https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/render/RedirectRender.java
将复制出来的源码做成一个自己的 MyRedirectRender extends Render{
复制出来的源码放这里
}
使用的时候这样:
render(new MyRedirectRender(...));
当然,你也可以继承 RenderFactory,将你自己的 MyRedirectRender 替换掉 jfinal 自带的 RedirectRender
maven 中心库的 jfinal 4.9 并未完全解决这个问题,线上提交的这个才完美解决。
2020-06-15 20:38
jfinal 的某个版本改变过 configRoute 与 configPlugin 的次序,当前是 configRoute 在 configPlugin 之前执行
而你的代码,可能是在 configRoute 中用到了 configPlugin 中加载的 ShiroPlugin ,而这个时候 ShiroPlugin 还未被加载
解决办法是使用如下配置:
public void configConfigConstant(Constants me) {
me.setConfigPluginOrder(1);
}
setConfigPluginOrder(int) 可以配置 plugin 被调用的次序,默认为 3,你可以配置成 1 或者 2
有关这个方法的使用说明在源码中有:
配置 configPlugin(Plugins me) 在 JFinalConfig 中被调用的次序。取值 1、2、3、4、5 分别表示在 configConstant(..)、configInterceptor(..)、configRoute(..)、configEngine(..)、configHandler(...) 之后被调用,默认值为 3,那么 configPlugin(..) 将在 configRoute(...) 调用之后被调用