我有一个客户端通过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数据。我很感激你对此事的建议。谢谢!
答案 0 :(得分:1)
首先,我要感谢为我的问题提出想法的其他人。我修复的问题。我必须做以下步骤。
在servlet类中,用html / body / textarea标签包装json数据
从客户端javascript,设置handleAs:“json”
函数(数据)将被调用,数据将成为json对象,因此调用任何属性名称。然后将打印出映射值
通过许多试验/错误找到正确的解决方案。我犯的一个错误是我在servlet类中错误地使用了错误的斜杠来关闭textarea标记。