簡體   English   中英

從Servlet調用時無法識別JSNI函數

[英]JSNI function not recognized while calling from Servlet

有多個上載選項,調用相同的servlet進行處理。 我使用這些參數來區分來自GWT的調用,並在每次處理文件時設置響應。 reopnse很好,但是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類中確實使用了相同的語法。 它在其他班上的表現都很好!

我沒有看到其余的客戶端代碼,但希望您實際上調用了initComplete(ProjectRunWindow uploadWindow)在DOM中創建$wnd.uploadCompleteXls 如果沒有,那就是問題所在。

我看到您的jsni方法有兩個問題。 一個是它被標記為靜態,就像在Java中一樣,您將無法訪問this引用。 您可以使用console.log(this); 在您的靜態jsni方法中,您會看到它將打印出$ 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);
    });
}-*/;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM