程序代码,renderJson之后,程序结束,并返回json,http响应
public void listData() {
Page<UserAppointment> page = srv.paginate(getParaToInt("pageNo", 1));
ServiceBizKit.fillUserAppointment(page);
PageInfo<UserAppointment> pageInfo = WebKit.convertPage(page);
Result result = WebKit.buildDataResult(pageInfo);
renderJson(result);
}
源码,就返回了1个render对象
public void renderJson(Object object) {
render = object instanceof JsonRender ? (JsonRender)object : renderManager.getRenderFactory().getJsonRender(object);
}
序列化是怎么执行的了?
序列化后的json串,没有看到HTTP响应代码呢?比如 response.write("JFinal").
----------------------
分析这个是自己有个 个性化扩展类的需求。
Post等对象都有自己的 枚举属性,比如 频道(1、2、3)。
如果是普通代码,自己写1个get方法,序列化的时候,自动会多1个属性。
但是JFinal序列化不是根据get方法,而是attrs属性,因此 定义了1个接口,
让 Model实现,并 调用这个方法。
“super.put("channelName", ChannelEnum.getNameByCode(channel));”
ajax代码,返回后直接使用 channelName中文字符串。
现在不想手动调用。
凡是序列化都会 执行renderJson等json序列化方法。
找到这个 统一的入口,扩展下,
if( 我的模型等对象 实现了FillProperty 接口){
model.fillExtendProperty();
}
简而言之,想增加1个 json序列化的 回调方法,“钩子”。
@SuppressWarnings("serial")
public class Post extends BasePost<Post> implements FillProperty {
public PostCategory getPostCategory() {
return super.get("postCategory");
}
public void setPostCategory(PostCategory postCategory) {
super.put("postCategory", postCategory);
}
public void fillExtendProperty() {
Integer channel = super.getChannel();
super.put("channelName", ChannelEnum.getNameByCode(channel));
}
}
Render render = controller.getRender();
if (render instanceof ForwardActionRender) {
String actionUrl = ((ForwardActionRender)render).getActionUrl();
if (target.equals(actionUrl)) {
throw new RuntimeException("The forward action url is the same as before.");
} else {
handle(actionUrl, request, response, isHandled);
}
return ;
}
if (render == null) {
render = renderManager.getRenderFactory().getDefaultRender(action.getViewPath() + action.getMethodName());
}
render.setContext(request, response, action.getViewPath()).render();
会调用JSONRender
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);
}
}