Метка: gwt

  • GWT. Обработка серверных исключений на клиенте.

    В целом обработка исключений при работе в GWT через RPC довольно детально описана в разделе документации DevGuideHandlingExceptions

    Важный момент на который следуют обратить внимание – throws для метода.

    Например, вот Ваш интерфейс:

    public interface MyService extends RemoteService {
      public String myMethod(String s);
    }

    Допустим Вы сделали класс MyException который наследуется от RuntimeException. Например, это исключение вы создали для своих прикладных нужд и хотите чтобы оно могло быть перекинуто и обработано на клиенте.

    Это конечно удобно, т.к. полученный тип исключений является Unchecked Exception. Таким образом его не нужно явно декларировать, оно может произойти где угодно (не надо прописывать везде throws) и такое исключение Вы не обязаны явно отлавливать. 

    Другими словами,  мы же не пишем для каждого метода throws RuntimeException!

    Тем не менее, если где-то у Вас в программе произойдет это исключение:

    public class MyServiceImpl extends RemoteServiceServlet implements
        MyService {
    
      public String myMethod(String s) {
        // Do something interesting with 's' here on the server.
        if (isError() ) { throw new MyException("ups");  
        // 
        return s;
      }
    }

    То это исключение в методе onFailure(Throwable caught) будет передано просто как InvocationException, а не как MyException!
    Дело в том, что если заглянуть в реализацию метода обработки вызова RPC-вызовов:

    RemoteServiceServlet. processCall() → RPC.invokeAndEncodeResponse() → RPC.encodeResponseForFailure() → RPCServletUtils.isExpectedException()
    мы найдем использование следующей конструкции:

    Class< ?>[] exceptionsThrown = serviceIntfMethod.getExceptionTypes();
    

    Другими словами, если Вы хотите чтобы Ваше исключение попадало в onFailure(Throwable caught) как MyException, то нужно обязательно декларировать throws, даже если Ваше исключение extends RuntimeException!

    В нашем примере это будет выглядеть так:

    public interface MyService extends RemoteService {
      public String myMethod(String s) throws MyException;
    }
    

    Вот такая вроде мелочь, но если ее не знать, могут возникнуть определенные неудобства.

  • GWT 2.0 + GXT (Ext GWT) + Maven

    1. GWT (Google Web Toolkit, произноситься: /’gwit/). На момент написания поста текущая версия  – 2.0.3.  Загрузить можно с официальной страницы GWT – http://code.google.com/intl/ru/webtoolkit/download.html.

    Вкратце механизм работы GWT можно описать так.  Исходный код пишется на Java, затем он транслируется в JavaScript,  в результате получаются несколько версий программ для разных браузеров (Firefox, IE, Safari, Google Chrome, Opera 9.0). Полученный JavaScript код неплохо оптимизирован – название переменных и методов сокращенны, убраны комментарии и лишние пробелы. В итоге получается его естественная обфускация.  (Пример кусочка полученного кода: function Y7(a){W7();LE(a);a.Vb=NOc;return a} ).

    После выхода версии  GWT 2.0 появилась возможность разбивать полученный JavaScript код (runAsync)  на отдельные файлы, которые затем загружаются асинхронно по мере надобности.  Так уменьшается размер первоначального скрипта и как следствие время загрузки и запуска приложения.

    Подробное описание есть на официальном сайте GWT.

    (далее…)

  • GWT+Maven

    Связка Maven + GWT на мой взгляд один из самых эффективных  способов работы.

    1. Ставим maven. Как всегда, прописываем путь в PATH к mvn.bat
    2. Читаем про maven. Прочитать можно здесь тут .  Руководство на мой взгляд не особо удобное, но разобраться можно…
    3. Читаем про плагин к maven’у для работы с GWT. Читать здесь

    Далее остается только создать соответствующий maven проект.

    Можно руками, а можно например так:

    mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo -DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 -DgroupId=myGroupId  -DartifactId=myArtifactId