GWT Training - Session 3/3

19
GWT Training – Session III Communicating with the Server

description

This is the 3rd of 3 parts of GWT Training. In this session, you will learn how to communicate with your server side application using GWT.

Transcript of GWT Training - Session 3/3

Page 1: GWT Training - Session 3/3

GWT Training – Session III

Communicating with the Server

Page 2: GWT Training - Session 3/3

Contents

Asynchronous HTTP Request Submitting Data using HTML Form

Traditional GWT

GWT RPC

Page 3: GWT Training - Session 3/3

Asynchronous HTTP Requests

/ /create a new GET requestRequestBuilder builder = new RequestBuilder(RequestBuilder.GET, "/info.php”);try{

//send the requestbuilder.sendRequest( null, new RequestCallback() {

public void onError(Request request, Throwable exception){ //log the error

}public void onResponseReceived(Request request, Response response){

//process response}

});}catch (RequestException e){

//handle request exception}

Page 4: GWT Training - Session 3/3

Asynchronous HTTP Requests – cont'd

builder.sendRequest() method receives a string data to be sent with the request and RequestCallback object that handles the response from the server

null is passed if there is no data to be sent to the data

Page 5: GWT Training - Session 3/3

Submitting Data to Server Using HTML Form

<form name="input" action="register.php" method="post"> Username: <input type="text" name="user"><br/> Email: <input type="text" name="email"><br/> Password: <input type="password" name="password"><br/> <input type="submit" value="Submit"></form>

Data SubmittedPOST /register.php HTTP/1.1Content-Type: application/x-www-form-urlencodedusername=Faiz&email=faizbash%40gmail.com&password=secret

Page 6: GWT Training - Session 3/3

GWT Equivalent for Form Data Submission - Constructing HTTP Request Manually

//build the data to postStringBuffer postBuilder = new StringBuffer();postBuilder.append("username=" );postBuilder.append( URL.encodeComponent( username ) );postBuilder.append("&email=" );postBuilder.append( URL.encodeComponent( email ) );postBuilder.append("&password=" );postBuilder.append( URL.encodeComponent( password ) );try{ //create and submit the request RequestBuilder requestBuilder = new RequestBuilder( RequestBuilder.POST, GWT.getModuleBaseURL()+"/register.php" ); requestBuilder.sendRequest( postBuilder.toString(), new RequestCallback(){ public void onError(Request request, Throwable exception){ // handle error } public void onResponseReceived(Request request, Response response){ // handle response } });}catch( Exception e){ // handle exception }

Page 7: GWT Training - Session 3/3

GWT Equivalent for Form Data Submission – Using FormPanel

//create the form panel, set its action and methodfinal FormPanel form = new FormPanel();form.setAction("/register.php");form.setMethod(FormPanel.METHOD_POST);

//set the main widget for the panel to a vertical panelVerticalPanel panel = new VerticalPanel();form.setWidget(panel);

//create the username fieldTextBox tb = new TextBox();tb.setName("username");panel.add(tb);

//create the e-mail fieldTextBox tb = new TextBox();tb.setName("email ");panel.add(tb);

Page 8: GWT Training - Session 3/3

GWT Equivalent for Form Data Submission – Using FormPanel (cont'd)

//create the password fieldPasswordTextBox ptb = new PasswordTextBox();ptb.setName("password");panel.add(ptb);

//create the Submit buttonButton submit = new Button(“Submit”);submit.addClickHandler( new ClickHandler() { public void onClick(Widget sender) { form.submit(); }});

//add submit button to panelpanel.add(submit);

Page 9: GWT Training - Session 3/3

GWT RPC

GWT extends a browser’s capability to asynchronously communicate with the server by providing a remote procedure call (RPC) library.

Calls to the server are simplified by providing you with an interface of methods that can be called similarly to regular method calls.

GWT marshal the calls (convert to a stream of data) and send to the remote server.

At the server side, the data, is un-marshalled the method on the server is invoked

Page 10: GWT Training - Session 3/3

GWT RPC – cont'd

In GWT, the RPC library is divided into two packages: com.google.gwt.user.client.rpc package used for client-

side RPC support com.google.gwt.user.server.rpc package used for server-

side RPC support The client side provides interfaces that you can use to tag

When the client code is compiled to Javascript using the GWT compiler, the code required to do the RPC marshaling will be generated

Page 11: GWT Training - Session 3/3

GWT RPC Implementation

To understand how GWT RPC works, we would implement the data form submission using it

Page 12: GWT Training - Session 3/3

GWT RPC Implementation – Step 1

Create the RPC interface (stub) on the client side Create a new interface named LoginService under the

my.utm.kase.gwttraining.client package Edit the code to look like the one below:

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

@RemoteServiceRelativePath("login")public interface LoginService extends RemoteService {

boolean login(String username, String email, String password);}

Add the following in /war/WEB-INF/web.xml

Page 13: GWT Training - Session 3/3

GWT RPC Implementation – Step 2

Configure the servlet Add the following in /war/WEB-INF/web.xml

<servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>

my.utm.kase.gettraining.server.LoginServiceImpl</servlet-class>

</servlet>

<servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/gwttraining/login</url-pattern>

</servlet-mapping>

Page 14: GWT Training - Session 3/3

GWT RPC Implementation – Step 3

Create an async counterpart interface of the LoginService. This interface defines the callback method that will be called when the server generates a response Create another interface, LoginServiceAsync under

my.utm.kase.gwttraining.client package Edit the code to look like the one below:

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

public interface LoginServiceAsync {boolean login(String username, String email,

String password, AsyncCallback<Boolean> callback);}

The async method always returns void and takes parameters similar to its stub counterpart plus an AsyncCallback parameter which specifies the return value of the stub method which is Void in this case

Page 15: GWT Training - Session 3/3

GWT RPC Implementation – Step 4 Implement the remote method on the server side

Create a class, LoginServiceImpl under my.utm.kase.gwttraining.server package

Edit the code to look like the one below:

import my.utm.kase.gwttraining.client.LoginService;import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class LoginServiceImpl extends RemoteServiceServlet implements LoginService {

public boolean login(String username, String email, String password){

if( username.equals("faizbash") && password.equals("secret") ) {

return true;}else return false;

}}

Page 16: GWT Training - Session 3/3

GWT RPC Implementation – Step 5 Call the remote method

Create a login widget in my.utm.kase.gwttraining.client package to get username, email and password from user. It also captures login event and makes a RPC to loign user.

public class LoginWidget extends Composite {public LoginWidget() {

//login panelFlexTable loginTable = new FlexTable();final TextBox usernameBox = new TextBox();final TextBox emailBox = new TextBox();final PasswordTextBox passwordBox = new PasswordTextBox();Button loginButton = new Button("Login");loginButton.addClickHandler( new ClickHandler() {

public void onClick(ClickEvent event) {login(usernameBox.getText(), emailBox.getText(), passwordBox.getText();}

});//username widgetloginTable.setWidget(0, 0, new Label("Username"));loginTable.setWidget(0, 1, usernameBox);//email widgetloginTable.setWidget(1, 0, new Label("Email"));loginTable.setWidget(1, 1, emailBox);

Page 17: GWT Training - Session 3/3

GWT RPC Implementation – Step 5 (cont'd)

//password widgetloginTable.setWidget(2, 0, new Label("Password"));loginTable.setWidget(2, 1, passwordBox);//login button widgetloginTable.setWidget(3, 0, loginButton);loginTable.getFlexCellFormatter().setColSpan(3, 0, 2);

//init loginTableinitWidget(loginTable);

}

public void login(String username, String email, String password) {//create a callback methodAsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {

public void onFailure(Throwable caught) {//handle failureWindow.alert("Failed to login");

}public void onSuccess(Boolean status) {

if( status )Window.alert("Login successful");elseWindow.alert("Invalid username or passord");

}};

Page 18: GWT Training - Session 3/3

GWT RPC Implementation – Step 5 (cont'd)

//Create a remote service proxy to talk to the server-side Greeting service.

final LoginServiceAsync loginService = GWT.create(LoginService.class);

//invoke the remote methodloginService.login(username, email, password, callback);

}}

Instantiate the widget in the GWTTrainingWidgets entry point class://login widgetLoginWidget loginWidget = new LoginWidget();tabPanel.add(loginWidget, "Login");

Run or refresh to test

Page 19: GWT Training - Session 3/3

Thank you