如何在javascript / dojo中的servlet类中显示json对象中返回的错误消息?

时间:2014-09-18 22:31:50

标签: json exception servlets dojo

我有一个客户端通过dojo.io.iframe发出文件上传请求,将二进制数据传递给在websphere app服务器上运行的Web应用程序,Web应用程序内部的servlet类对外部系统进行休息Web服务调用传递二进制数据。所以涉及三个层次。

我遇到的问题是尝试显示返回的json数据,其中包含在将休息Web服务调用回客户端后在最后一层中发生的确切异常。

客户端html页面如下所示

<form id="myForm" method="post" enctype="multipart/form-data">
    <div id="output"></div>

    <input id="filename" type="file" name="filename" />
    <input id="submitButton" type="submit" value="Submit"></input>
</form>

客户端javascript看起来像这样我在将servlet中捕获的RuntimeException打印到客户端时遇到了麻烦。

require(["dojo/io/iframe","dojo/dom","dojo/on","dojo/dom-construct","dojo/domReaddy!"],function(iframe,dom,on,domConst) {
    on(dom.byId("submitButton"),"click",function() {
        iframe.send({
            form: "myForm",
            handleAs: "json",
            url: "/rootContext/myServlet"
            }).then(function(data) {
                    domConst.place("<p>" + data + "</p>","output");
            }, function(err) {
                domConst.place("<p>" + err + "</p>","output"); // hope to print out exception caught in third layer
            });
    });
});

Servlet看起来像这样。

protected void doPost(HttpServletRequest request, HttpServletResponse response) {
    ....
    ServletOutputStream sos = null;
    ....
    try {
       domSomething(payLoad);
    } catch (RuntimeException e) [
        sos = response.getOutputStream();
        sos.print(e.getMessage());
    }
}

private void doSomething(String payLoad) {
    URL url = null;
    HttpURLConnection conn = null;
    OutputStream os = null;
    resource = new URL("someWhere");
    conn = (HttpURLConnection) resource.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");

    os = conn.getOutputStream();
    os.write(payLoad.getBytes());
    os.close();

    if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
        String retMsg = null;
        StringBuilder sb = new StringBuilder();
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        while ((retMsg = br.readLine()) != null) {
           sb.append(retMsg);
        }
        br.close();
        throw new RuntimeException(sb.toString()); // throws JSON format data
}

servlet类对外部系统进行休息Web服务调用,如果上传的文件数据传输失败,则将json中的异常返回给servlet类,我试图将该错误数据返回给客户端。此servlet类适用于文件上载,如果上载了损坏的文件,则会生成异常。我没有在这里包含日志记录机制,但它是实现的,以便app服务器中有一个日志文件,用于注册传输的数据包括返回的异常。

我是Dojo的新手,无法使用iframe api显示servlet类传递的json数据。我很感激你对此事的建议。谢谢!

1 个答案:

答案 0 :(得分:1)

首先,我要感谢为我的问题提出想法的其他人。我修复的问题。我必须做以下步骤。

在servlet类中,用html / body / textarea标签包装json数据

从客户端javascript,设置handleAs:“json”

函数(数据)将被调用,数据将成为json对象,因此调用任何属性名称。然后将打印出映射值

通过许多试验/错误找到正确的解决方案。我犯的一个错误是我在servlet类中错误地使用了错误的斜杠来关闭textarea标记。