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来进行处理。但还是希望框架里面默认处理掉。