关于Jfinal源码的一点讨论,DateKit在3.1版本中会完成么?

DateKit在3.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非常感谢!

热门反馈

扫码入社