GWT — передача объектов на сторону сервера
Рассмотрим как передать объект на сторону сервера в Google Web Toolkit.
Пример основан полностью на Пример создания проекта Google Web Toolkit (GWT) Hello World Example.
1. Описание класса User
Мы будем передавать на сервер объект User с именем и паролем, которые пользователь указывает в текстовом поле. Для этого необходимо создать два класса — для передачи и результата. Оба объекта обязательно должны быть сериализуемыми.
User.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package ru.javastudy.gwtApp.client.objects; import java.io.Serializable; public class User implements Serializable { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } |
UserResult.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package ru.javastudy.gwtApp.client.objects; import java.io.Serializable; public class UserResult implements Serializable { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } |
2. Описание интерфейса
По сравнению с статьей, указанной в начале, были изменены два интерфейса и класс на серверной части.
GwtAppServiceIntf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package ru.javastudy.gwtApp.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; import ru.javastudy.gwtApp.client.objects.User; import ru.javastudy.gwtApp.client.objects.UserResult; /** * The client-side stub for the RPC service. */ @RemoteServiceRelativePath("gwtAppService") public interface GwtAppServiceIntf extends RemoteService { UserResult gwtAppCallServer(User data) throws IllegalArgumentException; } |
GwtAppServiceIntfAsync
1 2 3 4 5 6 7 8 9 10 11 12 |
package ru.javastudy.gwtApp.client; import com.google.gwt.user.client.rpc.AsyncCallback; import ru.javastudy.gwtApp.client.objects.User; import ru.javastudy.gwtApp.client.objects.UserResult; /** * The async counterpart of <code>GwtAppServiceIntf</code> */ public interface GwtAppServiceIntfAsync { void gwtAppCallServer(User data, AsyncCallback<UserResult> callback) throws IllegalArgumentException; } |
GwtAppServiceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package ru.javastudy.gwtApp.server; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import ru.javastudy.gwtApp.client.GwtAppServiceIntf; import ru.javastudy.gwtApp.client.objects.User; import ru.javastudy.gwtApp.client.objects.UserResult; import ru.javastudy.gwtApp.shared.FieldValidator; /** * The server-side implementation of the RPC service. */ public class GwtAppServiceImpl extends RemoteServiceServlet implements GwtAppServiceIntf { public UserResult gwtAppCallServer(User user) throws IllegalArgumentException { if (!FieldValidator.isValidData(user.getName()) || !FieldValidator.isValidData(user.getPassword())) { throw new IllegalArgumentException("Имя должно быть больше трех символов"); } UserResult userResult = new UserResult(); userResult.setName(user.getName() + " server reply"); userResult.setPassword(user.getPassword() + " server reply"); return userResult; } } |
Как видите теперь везде указан тип передаваемого объекта как User, а возвращаемый тип UserResult.
3. Запуск приложения
Основной модуль подвергся небольшим изменениям для передачи объекта User и обработки результата UserResult.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
package ru.javastudy.gwtApp.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.*; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.*; import ru.javastudy.gwtApp.client.objects.User; import ru.javastudy.gwtApp.client.objects.UserResult; import ru.javastudy.gwtApp.shared.FieldValidator; /** Entry point classes define <code>onModuleLoad()</code>. */ public class GwtApp implements EntryPoint { final Button confirmButton = new Button("Confirm"); final TextBox nameField = new TextBox(); final TextBox passField = new TextBox(); final Label errorLabel = new Label(); final Label helloLabel = new Label(); VerticalPanel dialogVPanel = new VerticalPanel(); final DialogBox dialogBox = new DialogBox(); final HTML serverResponseHtml = new HTML(); final Label sendToServerLabel = new Label(); final Button closeButton = new Button("Close"); private final GwtAppServiceIntfAsync gwtAppService = GWT.create(GwtAppServiceIntf.class); /** This is the entry point method.*/ public void onModuleLoad() { helloLabel.setText("GwtApp Application hello world"); final Label usernameLabel = new Label(); final Label passwordLabel = new Label(); usernameLabel.setText("Username: "); passwordLabel.setText("Password: "); /*Связываем id='' на html странице с компонентами */ RootPanel.get("helloId").add(helloLabel); RootPanel.get("usernameLabelId").add(usernameLabel); RootPanel.get("usernameId").add(nameField); RootPanel.get("passLabelId").add(passwordLabel); RootPanel.get("passId").add(passField); RootPanel.get("confirmButtonId").add(confirmButton); RootPanel.get("errorLabelContainer").add(errorLabel); //остальной код в предыдущей статье } private void sendInfoToServer() { //validate input text errorLabel.setText(""); User user = new User(); user.setName(nameField.getText()); user.setPassword(passField.getText()); //отобразить ошибку на html странице if (!FieldValidator.isValidData(user.getName()) || !FieldValidator.isValidData(user.getPassword())) { errorLabel.setText("Поле должно содержать больше трех символов"); confirmButton.setEnabled(true); return; } confirmButton.setEnabled(false); sendToServerLabel.setText("username: " + user.getName()+ " password: " + user.getPassword()); serverResponseHtml.setText(""); gwtAppService.gwtAppCallServer(user, new AsyncCallback<UserResult>() { public void onFailure(Throwable caught) { dialogBox.setText("Remote Procedure Call - Failure"); serverResponseHtml.addStyleName("serverResponseLabelError"); serverResponseHtml.setHTML("ERROR ON SERVER"); dialogBox.center(); closeButton.setFocus(true); } public void onSuccess(UserResult result) { dialogBox.setText("Remote Procedure Call"); serverResponseHtml.removeStyleName("serverResponseLabelError"); serverResponseHtml.setHTML("username: " + result.getName()+ "<br>password: " + result.getPassword()); dialogBox.center(); closeButton.setFocus(true); } }); } } |
Результат:
Исходный код
10