首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
关于Jfinal源码的一点讨论,DateKit在3.1版本中会完成么?
leomj
2017-05-02 10:56
DateKit在3.1版本中会完成么?
项目:
JFinal
1
评论区
逍遥一生
2017-05-05 11:58
自己写就好了 或者用joda处理日期
回复
JFinal
2017-05-06 20:05
在 jfinal 3.2 中会添加进去,昨晚已经添加代码了
回复
leomj
2017-05-08 17:11
perfect!
回复
leomj
2017-05-18 16:20
@JFinal
现在手上维护的一个项目是好几年前的使用spring框架写的,是一个纯粹的rest接口项目,现在添加一些新的接口,用惯了jfinal的renderJson,就像把这部分功能移植过来用。于是查看源码。
1、renderJson(Ret.fail("msg", "回复内容不能为空"));
进入renderJson方法里,如下代码:
public void renderJson(Object object) {
render = object instanceof JsonRender ? (JsonRender)object : renderManager.getRenderFactory().getJsonRender(object);
}
大概意思是:如果传入的object本身就是一个JsonRender对象则直接转换后返回,否则new一个回来,那么问题来了,直接返回一个JsonRender,并未做任何实际性的动作行为,为何json值就通过response写到前端页面呢。
我跟踪了一下
renderManager.getRenderFactory().getJsonRender(object)这个代码,最后也只是到这里
public JsonRender(Object object) {
this.jsonText = JsonKit.toJson(object);
}
其实真正写回页面是这个方法
public void render() {
if (jsonText == null) {
buildJsonText();
}
PrintWriter writer = null;
try {
response.setHeader("Pragma", "no-cache"); // HTTP/1.0 caches might not implement Cache-Control and might only implement Pragma: no-cache
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType(forIE ? contentTypeForIE : contentType);
writer = response.getWriter();
writer.write(jsonText);
writer.flush();
} catch (IOException e) {
throw new RenderException(e);
}
finally {
if (writer != null) {
writer.close();
}
}
}
但是没有看到调用的地方?
本来是写在反馈里的。不知道为什么报错了,无法提交。
回复
leomj
2017-05-18 16:21
我这边是通过http代理上网的,反馈里的编辑器提交不了内容,提示http返回403,代理问题,但是这里的评论又可以。
回复
JFinal
2017-05-18 17:48
@leomj
调用的地方看一下 ActionHandler 中的 handle 方法, render 操作是在所有相关拦截器执行完以及 action 执行完以后
回复
leomj
2017-05-22 21:18
@JFinal
最近看了一点jfinal的源码,有一个疑惑,在buildActionMapping中把Controller和Action级别的拦截器都进行了初始化等处理工作,但是全局拦截器确没看到初始化等工作,唯一的一个地方还注释了就是在new 一个ActionMapping的时候注释了全局拦截器的获取,那这个全局拦截器到时候在什么时候拿到并创建了?
回复
JFinal
2017-05-22 21:25
@leomj
注意看这两个属性:
private Interceptor[] globalActionInters = NULL_INTERS;
private Interceptor[] globalServiceInters = NULL_INTERS;
在添加全局拦截器的时候,数组会添加进去
回复
leomj
2017-05-23 09:47
@JFinal
这个我看到了,疑惑就是这个globalActionInters 的内容何时有的,我并没有看到任何地方为这个数组赋值,NULL_INTERS只是定义了一个0长度的拦截器数组。
回复
JFinal
2017-05-23 10:08
@leomj
在 configInterceptor(Interceptors me) 中添加即可看到:
me.add(new GlobalInterceptor());
回复
JFinal
2017-05-23 10:09
@leomj
定义 NULL_INTERS 长度为 0 的拦截器数组,是为了在没有全局拦截器时,对全局拦截器的拼接,避免使用 if ( xxx != null) 的判断
回复
leomj
2017-05-23 10:24
@JFinal非常感谢!
回复
发送
我要反馈
热门反馈
扫码入社