2015-03-02 4 views
1

У меня есть параметры загрузки mulitple, вызывающие тот же сервлет для обработки. Я использую параметры для дифференцирования вызовов от GWT и каждый раз задаю ответ на обработку файла. resopnse вызывается нормально, но поджигатель отладчик говорит, что его не в состоянии распознать функциюФункция JSNI не распознается при вызове с сервлета

TypeError: window.parent.uploadCompleteXls is not a function

Ниже приведен код сервлета, который я использую, чтобы установить поведение

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(); 
    } 
} 

Я написал метод JSNI в моем классе GWT, который расширяет окно, как показано ниже.

private static native void initComplete(ProjectRunWindow uploadWindow) /*-{ 
$wnd.uploadCompleteXls = $entry(function(fileName) { 
    [email protected]::uploadCompleteXls(Ljava/lang/String;)(fileName); 
}); 
}-*/; 

public void uploadCompleteXls(String status) { 
    if (!status.equalsIgnoreCase("SUCCESS")) { 

     SC.say(status); 
    } 

Ответ не возвращается в GWT. Ирония - это то же синтаксис, что и в другом классе gwt, который расширяет окно. Он отлично работает в другом классе !!!.

+0

Не забудьте избежать 'сообщения'! Если у вас есть '' 'или' 'в сообщении, в лучшем случае код не будет работать, и в худшем случае вы будете подвергать своих пользователей атакам XSS какого-то рода! –

+0

Вы предлагаете некоторые изменения в существующем коде, который я дал? – Jess

+0

Да, хотя это, вероятно, не связано с проблемой, которую вы испытываете. Ваша переменная «сообщение» в сервлете может потенциально подвергнуть ваших пользователей какой-либо форме атаки JS с инъекцией. Избегайте текста в «сообщении», чтобы предотвратить это. –

ответ

0

Я не видел остальную часть вашего клиентского кода, но я надеюсь, что вы действительно вызвали initComplete(ProjectRunWindow uploadWindow), чтобы создать $wnd.uploadCompleteXls в DOM. Если нет, это проблема.

0

Есть две проблемы с вашим методом 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) { 
     [email protected]::uploadCompleteXls(Ljava/lang/String;)(fileName); 
    }); 
}-*/;