2010-09-28 2 views
0

Im перемещение первых шагов сегодня на основе GWT. Мне нужно понять (с использованием Netbeans чиновника tutorial, как это приложение работать :) я размещаю код:GWT - Основные шаги для этого кода

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package org.yournamehere.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.core.client.GWT; 
import com.google.gwt.user.client.ui.Button; 
import com.google.gwt.user.client.ui.Label; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.event.dom.client.ClickEvent; 
import com.google.gwt.event.dom.client.ClickHandler; 
import com.google.gwt.user.client.Timer; 
import com.google.gwt.user.client.rpc.AsyncCallback; 

/** 
* Main entry point. 
* 
* @author djfonplaz 
*/ 
public class MainEntryPoint implements EntryPoint { 
    /** 
    * Creates a new instance of MainEntryPoint 
    */ 
    public MainEntryPoint() { 
    } 

    public static GWTServiceAsync getService() { 
     // Create the client proxy. Note that although you are creating the 
     // service interface proper, you cast the result to the asynchronous 
     // version of the interface. The cast is always safe because the 
     // generated proxy implements the asynchronous interface automatically. 

     return GWT.create(GWTService.class); 
    } 

    public void onModuleLoad() { 
     final Label quoteText = new Label(); 

     Timer timer = new Timer() { 
      public void run() { 
       //create an async callback to handle the result: 
       AsyncCallback callback = new AsyncCallback() { 
        public void onFailure(Throwable arg0) { 
         //display error text if we can't get the quote: 
         quoteText.setText("Failed to get a quote"); 
        } 

        public void onSuccess(Object result) { 
         //display the retrieved quote in the label: 
         quoteText.setText((String) result); 
        } 
       }; 
       getService().myMethod(callback); 
      } 
     }; 

     timer.scheduleRepeating(1000); 
     RootPanel.get().add(quoteText); 
    } 
} 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package org.yournamehere.client; 

import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; 

/** 
* 
* @author djfonplaz 
*/ 
@RemoteServiceRelativePath("gwtservice") 
public interface GWTService extends RemoteService { 
    public String myMethod(); 
} 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package org.yournamehere.client; 

import com.google.gwt.user.client.rpc.AsyncCallback; 

/** 
* 
* @author djfonplaz 
*/ 
public interface GWTServiceAsync { 
    public void myMethod(AsyncCallback callback); 
} 

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

package org.yournamehere.server; 

import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import org.yournamehere.client.GWTService; 

/** 
* 
* @author djfonplaz 
*/ 
public class GWTServiceImpl extends RemoteServiceServlet implements GWTService { 
    private Random randomizer = new Random(); 
    private static final long serialVersionUID = -15020842597334403L; 
    private static List quotes = new ArrayList(); 

    static { 
     quotes.add("No great thing is created suddenly - Epictetus"); 
     quotes.add("Well done is better than well said - Ben Franklin"); 
     quotes.add("No wind favors he who has no destined port - Montaigne"); 
     quotes.add("Sometimes even to live is an act of courage - Seneca"); 
     quotes.add("Know thyself - Socrates"); 
    } 

    public String myMethod() { 
     return (String) quotes.get(randomizer.nextInt(5)); 
    } 
} 

Так (более или менее):

  1. стандарт welcomeGWT.html подается на сервер, вызывающий непосредственно вызванный JS созданный сервлет MainEntryProject.java
  2. MainEntryProject.java (при загрузке trought onModuleLoad()), который должен сгенерировать строку и отправить клиенту.

Право на данный момент?

Что я не понимаю:

  1. Кто вызов метода MyMethod() в GWTServiceImpl? Никто не спрашивает этот метод, я просто вижу getService(). MyMethod (callback), который должен вызывать один из классов GWTServiceAsync.
  2. Кто передает строку, сгенерированную GWTServiceImpls, в public void onSuccess (результат объекта)?
  3. Почему getService() возвращает GWTService, а не GWTServiceImpl? Он должен возвращать класс, а не интерфейс;

Если кто-то может мне помочь, был бы действительно рад! cheers

ответ

1

Файл MainEntryProject.java находится в клиентском пакете, поэтому он не сервлет - это java-файл, который будет скомпилирован GWT на JavaScript. Результат javascript, встроенный в ваш HTML-файл (welcomeGWT.html). Так,

  • первые грузы welcomeGWT.html
  • затем браузер начинает выполнение Javascript генерируется GWT, который после 1000 мс вызывает метод сервера MyMethod
  • наконец сервер возврата обратного вызова, клиент выполняет следующий код:

public void onFailure(Throwable arg0) {
quoteText.setText("Failed to get a quote");
}
public void onSuccess(Object result) {
quoteText.setText((String) result);
}

ответы:
1) Клиент называет, что метод.
2) Клиент
3) Я мог только догадываться, кажется, что это просто, как RPC-ролл

+0

Uhm ... ok! Я просто нахожу это bizzare hehe (на самом деле я не знаю эту структуру вообще, я думаю, хе-хе). Итак, вызов «абстрактного» метода GWTServiceAsync автоматически вызовет реализацию этого метода, написанного на GWTServiceImpl? После, я могу управлять тем, что этот метод возвращает, используя экземпляр «результат»? – markzzz

+0

Да, если вы вызываете метод из службы YourServiceAsync, это приведет к вызову метода сервера из файла YourServiceImpl. Подумайте, эта статья должна объяснить все остальное: http://code.google.com/intl/ru/webtoolkit/doc/1.6/DevGuideServerCommunication.html#DevGuideRemoteProcedureCalls –

+0

И возвращаемый тип, определенный в интерфейсе YourService, как обычно, YourServiceAsync в аргументе AsyncCallback, например : «AsyncCallback callback». А затем на стороне сервера в методе YourServiceImpl: «public String myMethod (String s) {...}" –

2

Чтобы понять, что происходит, важно, что GWT использует Generators создать фактическую реализацию клиента этого сервиса. С помощью этой технологии можно сгенерировать код, который вы обычно должны писать самостоятельно. Все вызовы RPC генерируются автоматически.
Интерфейс GWTService: Это просто ваше определение того, как выглядит сервис
Интерфейс GWTServiceAsync: Это интерфейс, реализованный в автоматически созданной клиентской части вашего сервиса.
класс GWTServiceImpl: Это код, который выполняется на стороне сервера.

Поэтому, когда вы вызываете GWT.create(GWTService.class);, вы получаете автогенерированный экземпляр класса.Если вы действительно заинтересованы в том, что происходит, вам нужно взглянуть на реализацию Generator.
Это более или менее то, что вы могли бы сделать вручную:
- Serialize (Google использует нестандартный метод для этого, и он может изменить с помощью различных версий GWT)
- Настройка запроса с последовательными данными
- Послать запросить и дождаться ответа
- Отменить перезагрузку и вернуть результат через обратный вызов

+0

Да, это случилось с основным приложением Java. Но, по крайней мере, есть класс, который получает и отправляет методы обработки стоимости. На этой основе я не понимаю, как это возможно :) – markzzz

Смежные вопросы