public void render() {
response.setStatus(getErrorCode()); // HttpServletResponse.SC_XXX_XXX
String ct = request.getContentType();
boolean isJsonContentType = ct != null && ct.indexOf("json") != -1;
// 支持 me.setErrorView(xxx.html) 配置
// 注意:针对 json 的 setErrorJsonContent(...) 直接覆盖掉了默认值,会走后面的 response.getOutputStream().write(...)
if (viewOrJson == null) {
if (! isJsonContentType) {
viewOrJson = getErrorView(getErrorCode());
}
}
// render with viewOrJson
if (viewOrJson != null) {
if (isJsonContentType) {
RenderManager.me().getRenderFactory().getJsonRender(viewOrJson).setContext(request, response).render();
} else {
RenderManager.me().getRenderFactory().getRender(viewOrJson).setContext(request, response).render();
}
return;
}
// render with html content
try {
response.setContentType(isJsonContentType ? contentTypeJson : contentTypeHtml);
response.getOutputStream().write(isJsonContentType ? getErrorJson() : getErrorHtml());
} catch (IOException e) {
throw new RenderException(e);
}
}String ct = request.getContentType();
boolean isJsonContentType = ct != null && ct.indexOf("json") != -1;在以上代码处,目前只处理了是否是json的ajax请求,如果客户端请求的不是json,而是默认的Content-Type:
12.contentType:
这个时候,请求也是ajax请求,只不过没有指定json,但dataType指定了json,这时也要求服务器返回json,目前此处代码处理没有考虑这些情况,应该增加一下判断,先判断是否是ajax请求,如果是再判断是否是json请求,如果不是,需要判断dataType里面的值,进行分情况处理, 如 txext, json, xml,html等,没有指定的情况下默认返回json,这样是否会更好?
7.dataType: 要求为String类型的参数,预期服务器返回的数据类型。如果不指定,JQuery将自动根据http包mime信息返回responseXML或responseText,并作为回调函数参数传递。可用的类型如下: xml:返回XML文档,可用JQuery处理。 html:返回纯文本HTML信息;包含的script标签会在插入DOM时执行。 script:返回纯文本JavaScript代码。不会自动缓存结果。除非设置了cache参数。注意在远程请求时(不在同一个域下),所有post请求都将转为get请求。 json:返回JSON数据。 jsonp:JSONP格式。使用SONP形式调用函数时,例如myurl?callback=?,JQuery将自动替换后一个“?”为正确的函数名,以执行回调函数。 text:返回纯文本字符串。
分类处理如下:
// 处理ajax请求,根据返回值
if (viewOrJson != null) {
IRenderFactory renderFactory = RenderManager.me().getRenderFactory();
Render render = renderFactory.getRender(viewOrJson);
if (RequestKit.isAcceptAll(request)) { // all, 如果全部接受,直接返回html
// do nothing, use default
} else if (RequestKit.isAcceptJson(request)) { // json
render = renderFactory.getJsonRender(viewOrJson);
} else if (RequestKit.isAcceptText(request)) { // text
render = renderFactory.getTextRender(viewOrJson);
} else if (RequestKit.isAcceptXml(request)) { // xml
render = renderFactory.getXmlRender(viewOrJson);
}
render.setContext(request, response).render();
return;
}
// render with html content
try {
// default html type and html content
String contentType = RequestKit.contentTypeHtml;
byte[] content = getErrorHtml();
if (RequestKit.isAcceptAll(request)) { // all, 如果全部接受,直接返回html
// do nothing, use default
} else if (RequestKit.isAcceptJson(request)) { // json
contentType = RequestKit.contentTypeJson;
content = getErrorJson();
} else if (RequestKit.isAcceptText(request)) { // text
contentType = RequestKit.contentTypeText;
content = getErrorText();
} else if (RequestKit.isAcceptXml(request)) { // xml
contentType = RequestKit.contentTypeXml;
content = getErrorXml();
}
response.setContentType(contentType);
response.getOutputStream().write(content);
} catch (IOException e) {
throw new RenderException(e);
}ps, 我也知道可以自己定义ErrorHander来进行处理。但还是希望框架里面默认处理掉。