GWT, рдЬрд╛рд╡рд╛ 8 рдФрд░ рднрд╡рд┐рд╖реНрдп

рд╢реБрдн рджреЛрдкрд╣рд░
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рдЬрд╛рд╡рд╛ 8 рдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдирд╡рд╛рдЪрд╛рд░ рд▓рд╛рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдордп GWT (2.6.0) рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЕрднреА рднреА рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдЬреАрдбрдмреНрд▓реНрдпреВрдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛рдлреА рдорд╛рдВрдЧ рдореЗрдВ рд╣реИ, рдХрдИ рдмрд╛рд░ рдЗрд╕ рдкрд░ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдореИрдВ рдлрд┐рд░ рд╕реЗ рднрд╛рд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреАрдбрдмреНрд▓реНрдпреВрдЯреА рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдерд╛ред

рдпрд╣ рдЖрд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЬреАрдбрдмреНрд▓реНрдпреВрдЯреА рдореЗрдВ рдЬрд╛рд╡рд╛ 8 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП, рд╕рд╛рде рд╣реА рдХреНрдпреЛрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдЬреАрдбрдмреНрд▓реНрдпреВрдЯреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рд░реНрд╡рд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓рдмреИрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдиреБрдХрд╕рд╛рди рдФрд░ рдЕрд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ Future / Promise рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдпрд╣ рдЕрд╡рдзрд╛рд░рдгрд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, GWT рдЕрднреА рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд░реЗрдореЛрд╕реЗрд╕реЗрд░реНрд╡рд╕рд░реНрд╡рд▓реЗрдЯ, RPC-Dispatch рдпрд╛ RequestFactoryред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо GWT рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ


рдПрдХ рдЫреЛрдЯреА рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, GWT рдХрд╛ рдПрдХ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдХрд╛рдВрдЯрд╛ рдорд┐рд▓рд╛ред рдпрд╣ рдЬрд╛рд╡рд╛ 8 (JRE рдЗрдореНрдпреВрд▓реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде) рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╕рдорд░реНрдерди рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдХрд╛рдлреА рдирд╣реАрдВ рдерд╛ред рдЗрд╕ рдХрд╛рдВрдЯреЗ рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ jdt-core рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рдлреА рдкреБрд░рд╛рдирд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ 3.9.5 рддрдХ рдЙрдард╛рдирд╛ рдкрдбрд╝рд╛, рд▓рд╛рдн рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рдХреЗрд╡рд▓ рдХреБрдЫ рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓ рдЧрдП)ред

рд╣реЛ рдЧрдпрд╛, gwt-dev.jar, gwt-user.jar, gwt-codeserver.jar рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ gwt-sandbox / build / lib рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВред

RestyGWT рдХреЛ рдареАрдХ рдХрд░реЗрдВ



рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрд╢реЛрдзрд┐рдд RestyGWT рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдБ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде RestyGWT рд╣реИред

рдЕрдм рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
 void makeServerRequest(MethodCallback<Void> callback); 

рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 Future<Void> makeServerRequest(); 


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдлреНрдпреВрдЪрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореБрдЭреЗ рдмрд╣реБрдд рд╣реА рдЖрдХрд░реНрд╖рдХ рд▓рдЧрд╛, рдФрд░ рдореИрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
рдЗрдВрдЯрд░рдлрд╝реЗрд╕
 public interface Future<T> { public void onComplete(Consumer<Try<T>> consumer); public void handle(Consumer<Throwable> errorHandler, Consumer<T> successHandler); public void forEach(Consumer<T> consumer); public <R> Future<R> map(Function<T, R> function); public <R> Future<R> flatMap(Function<T, Future<R>> function); public T get(); } 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
 public class FutureImpl<T> implements Future<T> { private List<Consumer<Try<T>>> completeFunctions = new ArrayList<>(); private Option<Try<T>> result = Option.getEmpty(); public FutureImpl() { } @Override public void onComplete(Consumer<Try<T>> consumer) { result.forEach(consumer::accept); completeFunctions.add(consumer); } @Override public void handle(Consumer<Throwable> errorHandler, Consumer<T> successHandler) { onComplete((result) -> { if (result.isSuccess()) successHandler.accept(result.get()); else errorHandler.accept(result.getCause()); }); } public void completeWithResult(Try<T> result) { this.result = Option.create(result); for (Consumer<Try<T>> completeFunction : completeFunctions) { completeFunction.accept(result); } } public void completeWithSuccess(T result) { completeWithResult(new Success<T>(result)); } public void completeWithFailure(Throwable ex) { completeWithResult(new Failure<T>(ex)); } @Override public void forEach(Consumer<T> consumer) { onComplete((result) -> { if (result.isSuccess()) { consumer.accept(result.get()); } }); } @Override public <R> Future<R> map(Function<T, R> function) { FutureImpl<R> future = new FutureImpl<R>(); onComplete((result) -> { if (result.isSuccess()) { future.completeWithSuccess(function.apply(result.get())); } }); return future; } @Override public <R> FutureImpl<R> flatMap(Function<T, Future<R>> function) { FutureImpl<R> mapped = new FutureImpl<R>(); onComplete((result) -> { if (result.isSuccess()) { Future<R> f = function.apply(result.get()); f.onComplete(mapped::completeWithResult); } }); return mapped; } @Override public T get() { return result.get().get(); } } 



рдХреЗ рдЙрдкрдпреЛрдЧ


рд╣рдо рд╕рдмрдиреЗ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛? рдореИрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ "рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░" рдХреНрдпрд╛ рд╣реИред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЗрд╢реЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ:

 @Path("../service") @Consumes(MediaType.APPLICATION_JSON) public interface CallbackCountryService extends RestService { @GET @Path("/countires/") public void getCountries(MethodCallback<List<Country>> callback); @GET @Path("/regions/{countryId}/") public void getRegions(@PathParam("countryId") Integer countryId, MethodCallback<List<Region>> callback); } 


рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдЗрд╕ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ:
  1. рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╣рдо рджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рджреГрд╢реНрдп рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
    рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд┐рдирд╛:

     countryService.getCountries(new MethodCallback<List<Country>>() { @Override public void onFailure(Method method, Throwable exception) { } @Override public void onSuccess(Method method, List<Country> response) { view.displayCountries(response); } }); 


    рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде:

     countryService.getCountries().forEach(view::displayCountries); 

    ForEach рдореЗрдердб рдПрдХ рддрд░рд╣ рдХрд╛ onSuccess callback рд╣реИред рдЕрд░реНрдерд╛рддреН, рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░, рд╡реНрдпреВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

  2. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
    рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд┐рдирд╛:

     countryService.getCountries(new MethodCallback<List<Country>>() { @Override public void onFailure(Method method, Throwable exception) { view.displayError(exception.getMessage()); } @Override public void onSuccess(Method method, List<Country> response) { view.displayCountries(response); } }); 


    рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде:

     countryService.getCountries().handle(t -> view.displayError(t.getMessage()), view::displayCountries); 

    рд╣рдо Future.handle рдкрджреНрдзрддрд┐ рдореЗрдВ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рджреВрд╕рд░рд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдлрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдПред

  3. рд╣рдореЗрдВ рд╕реВрдЪреА рд╕реЗ рдкрд╣рд▓рд╛ рджреЗрд╢ рд▓реЗрдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
    рднрд╡рд┐рд╖реНрдп рдХреЗ рдмрд┐рдирд╛:

     countryService.getCountries(new MethodCallback<List<Country>>() { @Override public void onFailure(Method method, Throwable exception) { view.displayError(exception.getMessage()); } @Override public void onSuccess(Method method, List<Country> response) { countryService.getRegions(response.get(0).getId(), new MethodCallback<List<Region>>() { @Override public void onFailure(Method method, Throwable exception) { view.displayError(exception.getMessage()); } @Override public void onSuccess(Method method, List<Region> response) { view.displayRegions(response); } }); } }); 

    рднрд╡рд┐рд╖реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:

     countryService.getCountries() .map(countries -> countries.get(0).getId()) .flatMap(countryService::getRegions) .handle(err -> view.displayError(err.getMessage()), view::displayRegions); 

    рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо Future<List> Future, countryId . Future . , , .


    .
    Future . .

    :

    рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ Future<List> Future, countryId . Future . , , .


    .
    Future . .

    :

    Future<List> Future, countryId . Future . , , .


    .
    Future . .

    :

     Future<List<Future<List<Region>>>> regionFutures = countryService.getCountries() .map( countries -> countries.map(country -> countryService.getRegions(country.getId())) ); 

    рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИред

    рдЕрдЧрд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ, рд╣рдореЗрдВ рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛
     List<Future>  Future<List>.    Future  ,   Future    . 

    Future<Future<List<List<Region>>>> regions = regionFutures.map(FutureUtils::toFutureOfList);


    рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдо рджреЗрддреЗ рд╣реИрдВ
     Future<Future>  Future,         : 

    FutureUtils .flatten(regions) .map(ListUtils::flatten) .handle(err -> view.displayError(err.getMessage()), view::displayRegions());


    рдмрд╛рдж рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдорд╛рдзрд╛рди рдХрд╛рдлреА рдХреЙрдореНрдкреИрдХреНрдЯ рдирд┐рдХрд▓рд╛ рдФрд░ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ рд╣реИред



    PS рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ GWT рдореЗрдВ Java 8 рдХреЛ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдЦ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк mvan рдЬреЗрдЯреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд░рди-рд╡рд┐рд╕реНрдлреЛрдЯред

    рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЕрдм рддрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕рднреА рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред RestyGWT рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХрд╛ рд╕рдорд░реНрдерди рдмрд╣реБрдд рдХрдЪреНрдЪрд╛ рд╣реИ, рдЕрднреА рддрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, JSONP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рдеред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд╛рдлреА рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕реНрдереИрддрд┐рдХ рддрд░реАрдХреЛрдВ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рди рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In218731/


All Articles