Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > RPC в GWT


Автор: Sap1enS 15.11.2008, 17:45
Задача довольно простая - создать реализацию клиент-серверного взаимодействия, в качестве клиента выступает GWT приложение, в качестве сервера Apache + PHP
НИКАК не могу заставить GWT работать с сервером... пробовал
1) http://code.google.com/docreader/#p=google-web-toolkit-doc-1-5&s=google-web-toolkit-doc-1-5&t=DevGuideHttpRequests... в hosted mode не работает из-за same origin policy (SOP), у php файлов ведь урл другой... а в обычном режиме на месте получаемой с сервера информации пишет "undefined"
2) так же пробовал использовать HTTPRequest.asyncGet и чистый AJAX с помощью native-функций... получается интереснее... ответ с сервера приходит не сразу, поэтому для GWT переменные, которые получают результат работы этих функций, так и остаются пустыми... а если дополнительно выводить результат через window.alert(), то ответ к этому времени уже придет, и мы его увидим... 

вопрос - как же все-таки заставить это работать? smile 
почитал в гугл-группах, что рекомендуют использовать Timer для "торможения" выполнения запросов... однако асинхронные запросы так мне "затормозить" не удалось, и я сильно сомневаюсь в такой возможности... хотя может быть просто не там пишу?

вариант для RPC стандартный, с сайта

Код
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(jfDataURL));

        try {
          Request request = builder.sendRequest(null, new RequestCallback() {
            public void onError(Request request, Throwable exception) {
               // Couldn't connect to server (could be timeout, SOP violation, etc.)     
            }

            public void onResponseReceived(Request request, Response response) {
              if (200 == response.getStatusCode()) {
                  // Process the response in response.getText()
               resultXML = response.getText();
              } else {
                // Handle the error.  Can get the status text from response.getStatusText()
              }
            }       
          });
        } catch (RequestException e) {
          // Couldn't connect to server        
        }


HTTPRequest.asyncGet использую так

Код
        HTTPRequest.asyncGet(jfDataURL, new ResponseTextHandler() {
            public void onCompletion(final String responseText){
                Window.alert(responseText);
                resultXML = responseText;
            }
        });


заранее, спасибо

Автор: v2v 15.11.2008, 20:52
Цитата(Sap1enS @  15.11.2008,  17:45 Найти цитируемый пост)
в качестве клиента выступает GWT приложение

вот тут довольно интересно. Если я правильно понял у вас довольно не стандартное решение. Расскажите поподробней про GWT приложение, что собой представляет, из чего состоит, как запускается?

Автор: Kupal3kb 20.12.2008, 15:27
Если я правильно понимаю, то Вы пытаетесь сделать запрос, url У которого отличается от вашего, то есть он является сторонним. О чем нам и говорит sop. Чтобы это обойти, можно создать хендлер с нейтив методом. Например такой:

Код


package com.weather.client;

import java.util.Set;

import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.Window;

public class WeatherBox {

    private int jsonRequestId = 0;
    private String baseURL = "http://ws.geonames.org/weatherJSON";


    private void refresh(){
        String url = baseURL + "?" /* + какие-то еще параметры */;  
        getJson(jsonRequestId++, url, this);
    }
    
    public void handleJsonResponse(JavaScriptObject jso) {
        // обработка json объекта

    }
    
    public native static void getJson(int requestId, String url, WeatherBox handler) /*-{
        var callback = "callback" + requestId;
        var script = document.createElement("script");
        script.setAttribute("src", url+'callback='+callback);
        script.setAttribute("type", "text/javascript");
    
        window[callback] = function(jsonObj) {
          [email protected]::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(jsonObj);
          window[callback + "done"] = true;
        };
    
          // даем json'у для загрузки 3 секунды
          setTimeout(function() {
          if (!window[callback + "done"]) {
            [email protected]::handleJsonResponse(Lcom/google/gwt/core/client/JavaScriptObject;)(null);
          }
          // cleanup
          document.body.removeChild(script);
          window[callback]=null;
          window[callback + "done"]=null;
        }, 3000);
        document.body.appendChild(script);
}-*/;
    
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)