如何显示javascript/dojo中servlet类在json对象中返回的错误消息?
我有一个客户端通过dojo.io.iframe发出文件上传请求,将二进制数据传递给运行在websphere app server上的web应用程序,web应用程序中的servlet类向外部系统发出rest web服务调用,以传递二进制数据。因此涉及到三个层面 我遇到的问题是,试图显示返回的json数据,其中包含在对客户机进行RESTWeb服务回调后在最后一层发生的异常 客户端html页面如下所示如何显示javascript/dojo中servlet类在json对象中返回的错误消息?,json,exception,servlets,dojo,Json,Exception,Servlets,Dojo,我有一个客户端通过dojo.io.iframe发出文件上传请求,将二进制数据传递给运行在websphere app server上的web应用程序,web应用程序中的servlet类向外部系统发出rest web服务调用,以传递二进制数据。因此涉及到三个层面 我遇到的问题是,试图显示返回的json数据,其中包含在对客户机进行RESTWeb服务回调后在最后一层发生的异常 客户端html页面如下所示 <form id="myForm" method="post" enctype="multip
<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>
servlet类对外部系统进行RESTWeb服务调用,如果上传的文件数据传输失败,它会将json中的异常返回给servlet类,我正试图将错误数据返回给客户端。这个servlet类可以很好地用于文件上载,如果上载了损坏的文件,则会生成异常。我在这里没有包括日志机制,但它的实现是为了在应用服务器中有一个日志文件,用于注册包含返回异常的传输数据
我是Dojo新手,在使用iframeAPI显示servlet类传递的json数据时遇到困难。我很感激你对这件事的建议。谢谢大家! 首先,我要感谢对我的问题有贡献的人。我正在解决的问题。我必须执行以下步骤 在servlet类中,通过html/body/textarea标记包装json数据 在客户端javascript中,设置handleAs:“json” 函数(数据)将被调用,数据将是json对象,所以通过调用任何属性名。然后将打印出映射值
通过多次尝试/错误找到正确的解决方案。我犯的一个错误是,我在servlet类中错误地使用了错误的斜杠来关闭textarea标记。您的代码是到达then还是error回调?我注意到一些事情:您不必
flush()
和/或close()
sos流吗?如果希望它出现在错误处理程序中,它应该将HTTP状态代码更改为500,如果异常的原因是服务器本身,而不是用户。如果请求是跨域请求,dojo/io/iframe
库无法检索响应,因此请确保它们位于同一域。@tik27:很抱歉我回复得太晚。调用错误回调,并在div id=“output”,domcont.place()处打印以下消息:“TypeError:无法获取未定义或空引用的属性“value”。听起来错误变量没有指向servlet类返回的响应对象…@Dimitri M:sos流被关闭。我没有包括完整的说明行。这三个层都在同一个域中。@tik27:奇数部分是若我将josn数据封装在。。标记并设置handleAs:“html”然后调用函数(数据){..},但会显示类似“objectundefined”的消息。
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
});
});
});
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
}