我有多个上传选项调用相同的servlet进行处理。 我使用参数来区分来自GWT的调用,并在每次完成文件处理时设置响应。 resopnse被称为罚款,但是firebug调试器说它无法识别功能
TypeError:window.parent.uploadCompleteXls不是函数
以下是用于设置响应的servlet代码
public class UploadServlet extends HttpServlet {
.
.
setResponseXls(response,message)
}
public void setResponseXls(HttpServletResponse response, String message)
{
response.setContentType("text/html");
response.setHeader("Pragma", "No-cache");
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-cache");
PrintWriter out;
try {
out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<script type=\"text/javascript\">");
out.println("window.parent.uploadCompleteXls('" + message + "');");
out.println("</script>");
out.println("</body>");
out.println("</html>");
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我在我的GWT类中编写了JSNI方法,扩展了窗口,如下所示。
private static native void initComplete(ProjectRunWindow uploadWindow) /*-{
$wnd.uploadCompleteXls = $entry(function(fileName) {
this.@com.citi.sevi.web.client.explorer.window.ProjectRunWindow::uploadCompleteXls(Ljava/lang/String;)(fileName);
});
}-*/;
public void uploadCompleteXls(String status) {
if (!status.equalsIgnoreCase("SUCCESS")) {
SC.say(status);
}
回应并没有回到GWT。 反讽是,在另一个扩展窗口的gwt类中使用相同的语法。它在其他课程中工作得非常好!!!。
答案 0 :(得分:0)
我还没有看到您的其他客户端代码,但我希望您实际上调用initComplete(ProjectRunWindow uploadWindow)
来在DOM中创建$wnd.uploadCompleteXls
。如果没有,那就是问题。
答案 1 :(得分:0)
我看到你的jsni方法有两个问题。一个是它被标记为静态,就像在java中一样,您将无法访问this
引用。您可以在静态jsni方法中使用console.log(this);
,您将看到它将打印出$ wnd全局对象。如果要在jsni中调用非静态方法,则jsni方法需要是非静态的。第二种情况是,如果要在回调函数中调用方法,则仍需要在回调之外添加本地var作为范围。如果在回调中执行console.log,您将看到它是您的内部函数,而不是对实际gwt类的引用。
private native void initComplete(ProjectRunWindow uploadWindow) /*-{
var self = this;
$wnd.uploadCompleteXls = $entry(function(fileName) {
this.@com.citi.sevi.web.client.explorer.window.ProjectRunWindow::uploadCompleteXls(Ljava/lang/String;)(fileName);
});
}-*/;