GWT - RPC İletişimi

GWT tabanlı bir uygulama genellikle bir istemci tarafı modülü ve sunucu tarafı modülünden oluşur. İstemci tarafı kodu tarayıcıda çalışır ve sunucu tarafı kodu web sunucusunda çalışır. İstemci tarafı kodunun, sunucu tarafı verilerine erişmek için ağ genelinde bir HTTP isteği yapması gerekir.

RPC, Uzaktan Prosedür Çağrısı, GWT tarafından kullanılan ve istemci kodunun doğrudan sunucu tarafı yöntemlerini çalıştırabildiği bir mekanizmadır.

  • GWT RPC sunucu uygulaması tabanlıdır.

  • GWT RPC eşzamansızdır ve iletişim sırasında istemci hiçbir zaman engellenmez.

  • GWT RPC'yi kullanarak Java nesneleri, istemci ve sunucu arasında doğrudan gönderilebilir (bunlar, GWT çerçevesi tarafından otomatik olarak serileştirilir).

  • Sunucu tarafı sunucu uygulaması şu şekilde adlandırılır: service.

  • İstemci tarafı kodundan sunucu tarafı sunucu uygulamalarının yöntemlerini çağıran uzaktan yordam çağrısı, invoking a service.

GWT RPC Bileşenleri

GWT RPC iletişim mekanizmasında kullanılan üç bileşen aşağıdadır

  • Sunucuda çalışan bir uzak hizmet (sunucu tarafı sunucu uygulaması).
  • Bu hizmeti çağırmak için istemci kodu.
  • İstemci ve sunucu arasında aktarılacak Java veri nesneleri.

GWT istemcisi ve sunucusu verileri otomatik olarak seri hale getirir ve serisini kaldırır, böylece geliştiricilerin nesneleri serileştirmesi / serisini kaldırması gerekmez ve veri nesneleri HTTP üzerinden hareket edebilir.

Aşağıdaki şema RPC Mimarisini göstermektedir.

RPC'yi kullanmaya başlamak için GWT kurallarına uymamız gerekiyor.

RPC İletişim İş Akışı

Adım 1 - Serileştirilebilir Model Sınıfı Oluşturun

İstemci tarafında serileştirilebilir olması gereken bir java modeli nesnesi tanımlayın.

public class Message implements Serializable {
   ...
   private String message;
   public Message(){};

   public void setMessage(String message) {
      this.message = message;
   }
   ...
}

Adım 2 - Bir Servis Arayüzü Oluşturun

Tüm hizmet yöntemlerini listeleyen RemoteService'i genişleten istemci tarafında hizmet için bir arabirim tanımlayın.

Hizmeti modül temel URL'sine göre varsayılan uzak sunucu uygulaması yolu ile eşlemek için @RemoteServiceRelativePath annotation özelliğini kullanın.

@RemoteServiceRelativePath("message")
public interface MessageService extends RemoteService {
   Message getMessage(String input);
}

Adım 3 - Zaman uyumsuz bir hizmet arabirimi oluşturun

GWT istemci kodunda kullanılacak olan, istemci tarafında hizmete (yukarıda belirtilen hizmetle aynı konumda) asenkron bir arabirim tanımlayın.

public interface MessageServiceAsync {
   void getMessage(String input, AsyncCallback<Message> callback);
}

Adım 4 - Service Implementation Servlet sınıfı oluşturun

Arabirimi sunucu tarafında uygulayın ve bu sınıf RemoteServiceServlet sınıfını genişletmelidir.

public class MessageServiceImpl extends RemoteServiceServlet
   implements MessageService{
   ...
   public Message getMessage(String input) {
      String messageString = "Hello " + input + "!";
      Message message = new Message();
      message.setMessage(messageString);
      return message;
   }
}

Adım 5 - Web.xml'yi Servlet bildirimini içerecek şekilde güncelleyin

Web uygulaması dağıtım tanımlayıcısını (web.xml) MessageServiceImpl Servlet bildirimini içerecek şekilde düzenleyin.

<web-app>
   ...
   <servlet>
      <servlet-name>messageServiceImpl</servlet-name>
      <servlet-class>com.tutorialspoint.server.MessageServiceImpl
      </servlet-class>
   </servlet>
   
   <servlet-mapping>
      <servlet-name>messageServiceImpl</servlet-name>
      <url-pattern>/helloworld/message</url-pattern>
   </servlet-mapping>
</web-app>

Adım 6 - Uygulama Kodunda uzaktan prosedür çağrısı yapın

Hizmet proxy sınıfını oluşturun.

MessageServiceAsync messageService = GWT.create(MessageService.class);

Sunucunun İletiyi istemciye geri döndürdüğü RPC geri aramayı işlemek için AsyncCallback İşleyicisini oluşturun

class MessageCallBack implements AsyncCallback<Message> {

   @Override
   public void onFailure(Throwable caught) {
      Window.alert("Unable to obtain server response: "
      + caught.getMessage());	
   }

   @Override
   public void onSuccess(Message result) {
      Window.alert(result.getMessage()); 
   }	   
}

Kullanıcı, UI ile etkileşim kurduğunda Uzaktan hizmeti arayın

public class HelloWorld implements EntryPoint {
   ... 
   public void onModuleLoad() {
   ...
      buttonMessage.addClickHandler(new ClickHandler() {			
         @Override
         public void onClick(ClickEvent event) {
            messageService.getMessage(txtName.getValue(), 
            new MessageCallBack());
         }
      });
   ...
   }
}

RPC İletişimi Tamamlandı Örneği

Bu örnek, GWT'de bir RPC İletişimi örneğini göstermek için sizi basit adımlardan geçirecektir. GWT - Uygulama Oluştur bölümünde oluşturduğumuz GWT uygulamasını güncellemek için aşağıdaki adımları izleyin -

Adım Açıklama
1 GWT - Uygulama Oluştur bölümünde açıklandığı gibi com.tutorialspoint paketinin altında HelloWorld adıyla bir proje oluşturun .
2 Değiştir HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html ve HelloWorld.java olarak aşağıda açıklanmıştır. Geri kalan dosyaları değiştirmeden tutun.
3 Uygulanan mantığın sonucunu doğrulamak için uygulamayı derleyin ve çalıştırın.

Değiştirilmiş modül tanımlayıcısının içeriği aşağıdadır src/com.tutorialspoint/HelloWorld.gwt.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<module rename-to = 'helloworld'>
   <!-- Inherit the core Web Toolkit stuff.                        -->
   <inherits name = 'com.google.gwt.user.User'/>

   <!-- Inherit the default GWT style sheet.                       -->
   <inherits name = 'com.google.gwt.user.theme.clean.Clean'/>
   <!-- Inherit the UiBinder module.                               -->
   <inherits name = "com.google.gwt.uibinder.UiBinder"/>
   <!-- Specify the app entry point class.                         -->
   <entry-point class = 'com.tutorialspoint.client.HelloWorld'/>
  
   <!-- Specify the paths for translatable code                    -->
   <source path = 'client'/>
   <source path = 'shared'/>

</module>

Değiştirilen Stil Sayfası dosyasının içeriği aşağıdadır war/HelloWorld.css.

body {
   text-align: center;
   font-family: verdana, sans-serif;
}

h1 {
   font-size: 2em;
   font-weight: bold;
   color: #777777;
   margin: 40px 0px 70px;
   text-align: center;
}

Aşağıda, değiştirilmiş HTML ana bilgisayar dosyasının içeriği verilmiştir war/HelloWorld.html.

<html>
   <head>
      <title>Hello World</title>
      <link rel = "stylesheet" href = "HelloWorld.css"/>
      <script language = "javascript" src = "helloworld/helloworld.nocache.js">
      </script>
   </head>

   <body>
      <h1>RPC Communication Demonstration</h1>
      <div id = "gwtContainer"></div>
   </body>
</html>

Şimdi Message.java dosyasını oluşturun. src/com.tutorialspoint/client aşağıdaki içeriği paketleyin ve içine yerleştirin

package com.tutorialspoint.client;

import java.io.Serializable;

public class Message implements Serializable {
 
   private static final long serialVersionUID = 1L;
   private String message;
   public Message(){};

   public void setMessage(String message) {
      this.message = message;
   }

   public String getMessage() {
      return message;
   }
}

Şimdi MessageService.java dosyasını oluşturun. src/com.tutorialspoint/client aşağıdaki içeriği paketleyin ve içine yerleştirin

package com.tutorialspoint.client;

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

@RemoteServiceRelativePath("message")
public interface MessageService extends RemoteService {
   Message getMessage(String input);
}

Şimdi MessageServiceAsync.java dosyasını src/com.tutorialspoint/client aşağıdaki içeriği paketleyin ve içine yerleştirin

package com.tutorialspoint.client;

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

public interface MessageServiceAsync {
   void getMessage(String input, AsyncCallback<Message> callback);
}

Şimdi MessageServiceImpl.java dosyasını oluşturun. src/com.tutorialspoint/server aşağıdaki içeriği paketleyin ve içine yerleştirin

package com.tutorialspoint.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.tutorialspoint.client.Message;
import com.tutorialspoint.client.MessageService;

public class MessageServiceImpl extends RemoteServiceServlet 
   implements MessageService{

   private static final long serialVersionUID = 1L;

   public Message getMessage(String input) {
      String messageString = "Hello " + input + "!";
      Message message = new Message();
      message.setMessage(messageString);
      return message;
   }   
}

Değiştirilmiş web uygulaması dağıtım tanımlayıcısının içeriğini güncelleyin war/WEB-INF/web.xml MessageServiceImpl Servlet bildirimini dahil etmek için.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE web-app
   PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
   "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
   <!-- Default page to serve -->
   <welcome-file-list>
      <welcome-file>HelloWorld.html</welcome-file>
   </welcome-file-list>
   
   <servlet>
      <servlet-name>messageServiceImpl</servlet-name>
      <servlet-class>com.tutorialspoint.server.MessageServiceImpl
      </servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>messageServiceImpl</servlet-name>
      <url-pattern>/helloworld/message</url-pattern>
   </servlet-mapping>
</web-app>

İçindeki HelloWorld.java içeriğini değiştirin src/com.tutorialspoint/client aşağıdaki ile paket

package com.tutorialspoint.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class HelloWorld implements EntryPoint {
	
   private MessageServiceAsync messageService = 
   GWT.create(MessageService.class);

   private class MessageCallBack implements AsyncCallback<Message> {
      @Override
      public void onFailure(Throwable caught) {
         /* server side error occured */
         Window.alert("Unable to obtain server response: " + caught.getMessage());	
      }
      @Override
      public void onSuccess(Message result) {
          /* server returned result, show user the message */
         Window.alert(result.getMessage());
      }	   
   }

   public void onModuleLoad() {
      /*create UI */
      final TextBox txtName = new TextBox(); 
      txtName.setWidth("200");
      txtName.addKeyUpHandler(new KeyUpHandler() {
         @Override
         public void onKeyUp(KeyUpEvent event) {
            if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER){
               /* make remote call to server to get the message */
               messageService.getMessage(txtName.getValue(), 
               new MessageCallBack());
            }				
         }
      });
      Label lblName = new Label("Enter your name: ");

      Button buttonMessage = new Button("Click Me!");

      buttonMessage.addClickHandler(new ClickHandler() {			
         @Override
         public void onClick(ClickEvent event) {
            /* make remote call to server to get the message */
            messageService.getMessage(txtName.getValue(), 
            new MessageCallBack());
         }
      });

      HorizontalPanel hPanel = new HorizontalPanel();	
      hPanel.add(lblName);
      hPanel.add(txtName);
      hPanel.setCellWidth(lblName, "130");

      VerticalPanel vPanel = new VerticalPanel();
      vPanel.setSpacing(10);
      vPanel.add(hPanel);
      vPanel.add(buttonMessage);
      vPanel.setCellHorizontalAlignment(buttonMessage, 
      HasHorizontalAlignment.ALIGN_RIGHT);

      DecoratorPanel panel = new DecoratorPanel();
      panel.add(vPanel);

      // Add widgets to the root panel.
      RootPanel.get("gwtContainer").add(panel);
   }    
}

Yapılan tüm değişikliklere hazır olduğunuzda, uygulamayı GWT - Uygulama Oluştur bölümünde yaptığımız gibi geliştirme modunda derleyip çalıştıralım . Başvurunuzda her şey yolundaysa, bu aşağıdaki sonucu verecektir -