ErrorRander在处理错误时,显得比较仓促单薄,是否考虑这样处理?

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:

要求为String类型的参数,当发送信息至服务器时,内容编码类型默认为"application/x-www-form-urlencoded"。该默认值适合大多数应用场合。

这个时候,请求也是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来进行处理。但还是希望框架里面默认处理掉。

评论区

热门反馈

扫码入社