从Servlet调用时无法识别JSNI函数

时间:2015-03-02 05:25:08

标签: java servlets gwt smartgwt jsni

我有多个上传选项调用相同的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类中使用相同的语法。它在其他课程中工作得非常好!!!。

2 个答案:

答案 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);
    });
}-*/;
相关问题