GWT - Panduan Cepat
Apa itu GWT?
Google Web Toolkit (GWT) adalah perangkat pengembangan yang harus dibuat RICH Internet Applications (RIA). Berikut adalah beberapa fiturnya yang terkenal -
GWT memberikan opsi pengembang untuk menulis aplikasi sisi klien di JAWA.
GWT mengkompilasi kode yang ditulis dalam JAVA ke kode JavaScript.
Aplikasi yang ditulis dalam GWT kompatibel dengan lintas browser. GWT secara otomatis menghasilkan kode javascript yang sesuai untuk setiap browser.
GWT adalah sumber terbuka, sepenuhnya gratis, dan digunakan oleh ribuan pengembang di seluruh dunia. Ini dilisensikan di bawah Lisensi Apache versi 2.0.
Secara keseluruhan, GWT adalah a framework untuk membuat aplikasi web berskala besar dan berkinerja tinggi sekaligus menjaganya agar tetap mudah dirawat.
Mengapa menggunakan GWT?
Berbasis Java, Anda dapat menggunakan JAVA IDEs seperti Eclipse untuk mengembangkan aplikasi GWT.
Pengembang dapat menggunakan pelengkapan otomatis kode / refactoring / navigasi / manajemen proyek dan semua fitur IDEs.GWT yang menyediakan kemampuan debugging penuh. Pengembang dapat men-debug aplikasi sisi klien seperti Aplikasi Java.
GWT menyediakan integrasi yang mudah dengan Junit dan Maven.
Sekali lagi berbasis Java, GWT memiliki kurva pembelajaran yang rendah untuk Pengembang Java.
GWT menghasilkan kode javascript yang dioptimalkan, menghasilkan kode javascript khusus browser sendiri.
GWT menyediakan pustaka Widget yang menyediakan sebagian besar tugas yang diperlukan dalam aplikasi.
GWT dapat diperluas dan widget khusus dapat dibuat untuk memenuhi kebutuhan aplikasi.
Di atas segalanya, aplikasi GWT dapat berjalan di semua browser utama dan ponsel pintar termasuk ponsel / tablet berbasis Android dan iOS.
Kekurangan GWT
Meskipun GWT menawarkan banyak keuntungan, GWT menderita kerugian berikut -
Not Indexable - Halaman web yang dibuat oleh GWT tidak akan diindeks oleh mesin pencari karena aplikasi ini dibuat secara dinamis.
Not Degradable - Jika pengguna aplikasi Anda menonaktifkan Javascript maka pengguna hanya akan melihat halaman dasar dan tidak lebih.
Not Designer's Friendly - GWT tidak cocok untuk desainer web yang lebih suka menggunakan HTML biasa dengan placeholder untuk memasukkan konten dinamis di lain waktu.
Komponen GWT
Kerangka GWT dapat dibagi menjadi tiga bagian utama berikut -
GWT Java to JavaScript compiler- Ini adalah bagian terpenting dari GWT yang menjadikannya alat yang ampuh untuk membangun RIA. Kompiler GWT digunakan untuk menerjemahkan semua kode aplikasi yang ditulis di Java ke dalam JavaScript.
JRE Emulation library- Google Web Toolkit menyertakan pustaka yang mengemulasi subset pustaka runtime Java. Daftar tersebut termasuk java.lang, java.lang.annotation, java.math, java.io, java.sql, java.util dan java.util.logging
GWT UI building library - Bagian GWT ini terdiri dari banyak subbagian yang mencakup komponen UI aktual, dukungan RPC, pengelolaan Riwayat, dan banyak lagi.
GWT juga menyediakan Browser Web yang Dihosting GWT yang memungkinkan Anda menjalankan dan mengeksekusi aplikasi GWT dalam mode yang dihosting, dengan kode Anda berjalan sebagai Java di Mesin Virtual Java tanpa mengompilasi ke JavaScript.
Tutorial ini akan memandu Anda tentang cara mempersiapkan lingkungan pengembangan untuk memulai pekerjaan Anda dengan Kerangka GWT. Tutorial ini juga akan mengajari Anda cara menyiapkan JDK, Tomcat, dan Eclipse di komputer Anda sebelum Anda menyiapkan Kerangka GWT -
Persyaratan Sistem
GWT membutuhkan JDK 1.6 atau lebih tinggi, jadi persyaratan pertama adalah menginstal JDK di mesin Anda.
JDK | 1.6 atau lebih tinggi. |
---|---|
Penyimpanan | tidak ada persyaratan minimum. |
Ruang Disk | tidak ada persyaratan minimum. |
Sistem operasi | tidak ada persyaratan minimum. |
Ikuti langkah-langkah yang diberikan untuk menyiapkan lingkungan Anda untuk memulai pengembangan aplikasi GWT.
Langkah 1 - Verifikasi Instalasi Java di Mesin Anda
Sekarang buka konsol dan jalankan perintah java berikut.
OS | Tugas | Perintah |
---|---|---|
Windows | Buka Konsol Perintah | c: \> java -version |
Linux | Buka Terminal Perintah | $ java -version |
Mac | Buka Terminal | mesin: ~ joseph $ java -version |
Mari kita verifikasi keluaran untuk semua sistem operasi
Sr.No. | OS & Output yang Dihasilkan |
---|---|
1 | Windows versi java "1.6.0_21" Java (TM) SE Runtime Environment (build 1.6.0_21-b07) VM Klien Java HotSpot (TM) (build 17.0-b17, mode campuran, berbagi) |
2 | Linux versi java "1.6.0_21" Java (TM) SE Runtime Environment (build 1.6.0_21-b07) ava HotSpot (TM) Client VM (build 17.0-b17, mode campuran, berbagi) |
3 | Mac versi java "1.6.0_21" Java (TM) SE Runtime Environment (build 1.6.0_21-b07) Java HotSpot (TM) 64-Bit Server VM (build 17.0-b17, mode campuran, berbagi) |
Langkah 2 - Siapkan Java Development Kit (JDK)
Jika Anda belum menginstal Java, Anda dapat menginstal Java Software Development Kit (SDK) dari situs Java Oracle: Java SE Downloads . Anda akan menemukan instruksi untuk menginstal JDK dalam file yang diunduh, ikuti instruksi yang diberikan untuk menginstal dan mengkonfigurasi pengaturan. Terakhir, setel variabel lingkungan PATH dan JAVA_HOME untuk merujuk ke direktori yang berisi java dan javac, biasanya masing-masing java_install_dir / bin dan java_install_dir.
Mengatur JAVA_HOMEvariabel lingkungan untuk menunjuk ke lokasi direktori dasar tempat Java diinstal pada mesin Anda. Sebagai contoh
Sr.No. | OS & Output |
---|---|
1 | Windows Setel variabel lingkungan JAVA_HOME ke C: \ Program Files \ Java \ jdk1.6.0_21 |
2 | Linux ekspor JAVA_HOME = / usr / local / java-current |
3 | Mac ekspor JAVA_HOME = / Library / Java / Home |
Tambahkan lokasi compiler Java ke System Path.
Sr.No. | OS & Output |
---|---|
1 | Windows Tambahkan string;% JAVA_HOME% \ bin ke akhir variabel sistem, Path. |
2 | Linux ekspor PATH =$PATH:$JAVA_HOME / bin / |
3 | Mac tidak dibutuhkan |
Alternatifnya, jika Anda menggunakan Integrated Development Environment (IDE) seperti Borland JBuilder, Eclipse, IntelliJ IDEA, atau Sun ONE Studio, kompilasi dan jalankan program sederhana untuk memastikan bahwa IDE mengetahui di mana Anda menginstal Java, jika tidak lakukan pengaturan yang tepat seperti dokumen yang diberikan. dari IDE.
Langkah 3 - Siapkan Eclipse IDE
Semua contoh dalam tutorial ini telah ditulis menggunakan Eclipse IDE. Jadi saya sarankan Anda harus menginstal Eclipse versi terbaru pada mesin Anda berdasarkan sistem operasi Anda.
Untuk menginstal Eclipse IDE, unduh binari Eclipse terbaru dari https://www.eclipse.org. Setelah Anda mengunduh instalasi, keluarkan distribusi biner ke lokasi yang nyaman. Misalnya di C: \ eclipse di windows, atau / usr / local / eclipse di Linux / Unix dan terakhir atur variabel PATH dengan tepat.
Eclipse dapat dimulai dengan menjalankan perintah berikut di mesin windows, atau Anda cukup mengklik dua kali pada eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse dapat dimulai dengan menjalankan perintah berikut di mesin Unix (Solaris, Linux, dll.) -
$/usr/local/eclipse/eclipse
Setelah startup berhasil, jika semuanya baik-baik saja maka itu akan menampilkan hasil sebagai berikut -
Step 4 - Install GWT SDK & Plugin for Eclipse
Follow the instructions given at the link Plugin for Eclipse (incl. SDKs) to install GWT SDK & Plugin for Eclipse version installed on your machine.
After a successful setup for the GWT plugin, if everything is fine then it should display following screen with Google icon marked with red rectangle as shown below −
Step 5: Setup Apache Tomcat
You can download the latest version of Tomcat from https://tomcat.apache.org/. Once you downloaded the installation, unpack the binary distribution into a convenient location. For example in C:\apache-tomcat-6.0.33 on windows, or /usr/local/apache-tomcat-6.0.33 on Linux/Unix and set CATALINA_HOME environment variable pointing to the installation locations.
Tomcat can be started by executing the following commands on windows machine, or you can simply double click on startup.bat
%CATALINA_HOME%\bin\startup.bat
or
/usr/local/apache-tomcat-6.0.33/bin/startup.sh
After a successful startup, the default web applications included with Tomcat will be available by visiting http://localhost:8080/. If everything is fine then it should display following result −
Further information about configuring and running Tomcat can be found in the documentation included here, as well as on the Tomcat web site − https://tomcat.apache.org/
Tomcat can be stopped by executing the following commands on windows machine −
%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown
Tomcat can be stopped by executing the following commands on Unix (Solaris, Linux, etc.) machine −
$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh
Before we start with creating actual "HelloWorld" application using GWT, let us see what are the actual parts of a GWT application are −
A GWT application consists of following four important parts out of which last part is optional but first three parts are mandatory.
- Module descriptors
- Public resources
- Client-side code
- Server-side code
Sample locations of different parts of a typical gwt application HelloWord will be as shown below −
Name | Location |
---|---|
Project root | HelloWorld/ |
Module descriptor | src/com/tutorialspoint/HelloWorld.gwt.xml |
Public resources | src/com/tutorialspoint/war/ |
Client-side code | src/com/tutorialspoint/client/ |
Server-side code | src/com/tutorialspoint/server/ |
Module Descriptors
A module descriptor is the configuration file in the form of XML which is used to configure a GWT application.
A module descriptor file extension is *.gwt.xml, where * is the name of the application and this file should reside in the project's root.
Following will be a default module descriptor HelloWorld.gwt.xml for a HelloWorld application −
<?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'/>
<!-- specify the app entry point class. -->
<entry-point class = 'com.tutorialspoint.client.HelloWorld'/>
<!-- specify the paths for translatable code -->
<source path = '...'/>
<source path = '...'/>
<!-- specify the paths for static files like html, css etc. -->
<public path = '...'/>
<public path = '...'/>
<!-- specify the paths for external javascript files -->
<script src = "js-url" />
<script src = "js-url" />
<!-- specify the paths for external style sheet files -->
<stylesheet src = "css-url" />
<stylesheet src = "css-url" />
</module>
Following is the brief detail about different parts used in module descriptor.
Sr.No. | Nodes & Description |
---|---|
1 | <module rename-to = "helloworld"> This provides name of the application. |
2 | <inherits name = "logical-module-name" /> This adds other gwt module in application just like import does in java applications. Any number of modules can be inherited in this manner. |
3 | <entry-point class = "classname" /> This specifies the name of class which will start loading the GWT Application. Any number of entry-point classes can be added and they are called sequentially in the order in which they appear in the module file. So when the onModuleLoad() of your first entry point finishes, the next entry point is called immediately. |
4 | <source path = "path" /> This specifies the names of source folders which GWT compiler will search for source compilation. |
5 | <public path = "path" /> The public path is the place in your project where static resources referenced by your GWT module, such as CSS or images, are stored. The default public path is the public subdirectory underneath where the Module XML File is stored. |
6 | <script src="js-url" /> Automatically injects the external JavaScript file located at the location specified by src. |
7 | <stylesheet src="css-url" /> Automatically injects the external CSS file located at the location specified by src. |
Public Resources
These are all files referenced by your GWT module, such as Host HTML page, CSS or images.
The location of these resources can be configured using <public path = "path" /> element in module configuration file. By default, it is the public subdirectory underneath where the Module XML File is stored.
When you compile your application into JavaScript, all the files that can be found on your public path are copied to the module's output directory.
The most important public resource is host page which is used to invoke actual GWT application. A typical HTML host page for an application might not include any visible HTML body content at all but it is always expected to include GWT application via a <script.../> tag as follows
<html>
<head>
<title>Hello World</title>
<link rel = "stylesheet" href = "HelloWorld.css"/>
<script language = "javascript" src = "helloworld/helloworld.nocache.js">
</script>
</head>
<body>
<h1>Hello World</h1>
<p>Welcome to first GWT application</p>
</body>
</html>
Following is the sample style sheet which we have included in our host page −
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;
}
Client-side Code
This is the actual Java code written implementing the business logic of the application and that the GWT compiler translates into JavaScript, which will eventually run inside the browser. The location of these resources can be configured using <source path = "path" /> element in module configuration file.
For example Entry Point code will be used as client side code and its location will be specified using <source path = "path" />.
A module entry-point is any class that is assignable to EntryPoint and that can be constructed without parameters. When a module is loaded, every entry point class is instantiated and its EntryPoint.onModuleLoad() method gets called. A sample HelloWorld Entry Point class will be as follows −
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
Window.alert("Hello, World!");
}
}
Server-side Code
This is the server side part of your application and its very much optional. If you are not doing any backend processing with-in your application then you do not need this part, but if there is some processing required at backend and your client-side application interact with the server then you will have to develop these components.
Next chapter will make use of all the above mentioned concepts to create HelloWorld application using Eclipse IDE.
As power of GWT lies in Write in Java, Run in JavaScript, we'll be using Java IDE Eclipse to demonstrate our examples.
Let's start with a simple HelloWorld application −
Step 1 - Create Project
The first step is to create a simple Web Application Project using Eclipse IDE. Launch project wizard using the option Google Icon
Unselect Use Google App Engine because we're not using it in this project and leave other default values (keep Generate Sample project code option checked) as such and click Finish Button.
Once your project is created successfully, you will have following content in your Project Explorer −
Here is brief description of all important folders
Sr.No. | Folder & Location |
---|---|
1 | src Source code (java classes) files. Client folder containing the client-side specific java classes responsible for client UI display. Server folder containing the server-side java classes responsible for server side processing. Shared folder containing the java model class to transfer data from server to client and vice versa. HelloWorld.gwt.xml, a module descriptor file required for GWT compiler to compile the HelloWorld project. |
2 | test Test code (java classes) source files. Client folder containing the java classes responsible to test gwt client side code. |
3 | war This is the most important part, it represents the actual deployable web application. WEB-INF containing compiled classes, gwt libraries, servlet libraries. HelloWorld.css, project style sheet. HelloWorld.html, hots HTML which will invoke GWT UI Application. |
Step 2 - Modify Module Descriptor: HelloWorld.gwt.xml
GWT plugin will create a default module descriptor file src/com.tutorialspoint/HelloWorld.gwt.xml which is given below. For this example we are not modifying it, but you can modify it based on your requirement.
<?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. You can change -->
<!-- the theme of your GWT application by uncommenting -->
<!-- any one of the following lines. -->
<inherits name = 'com.google.gwt.user.theme.clean.Clean'/>
<!-- <inherits name = 'com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name = 'com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits -->
<!-- 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>
Step 3 - Modify Style Sheet: HelloWorld.css
GWT plugin will create a default Style Sheet file war/HelloWorld.css. Let us modify this file to keep our example at simplest level of understaning −
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;
}
Step 4 - Modify Host File: HelloWorld.html
GWT plugin will create a default HTML host file war/HelloWorld.html. Let us modify this file to keep our example at simplest level of understaning −
<html>
<head>
<title>Hello World</title>
<link rel = "stylesheet" href = "HelloWorld.css"/>
<script language = "javascript" src = "helloworld/helloworld.nocache.js">
</script>
</head>
<body>
<h1>Hello World</h1>
<p>Welcome to first GWT application</p>
</body>
</html>
You can create more static files like HTML, CSS or images in the same source directory or you can create further sub-directories and move files in those sub-directories and configure those sub-directories in module descriptor of the application.
Step 5 - Modify Entry Point: HelloWorld.java
GWT plugin will create a default Java file src/com.tutorialspoint/HelloWorld.java, which keeps an entry point for the application.
Let us modify this file to display "Hello,World!"
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
Window.alert("Hello, World!");
}
}
You can create more Java files in the same source directory to define either entry points or to define helper routines.
Step 6 - Compile Application
Once you are ready with all the changes done, its time to compile the project. Use the option Google Icon
Keep default values intact and click Compile button. If everything goes fine, you will see following output in Eclipse console
Compiling module com.tutorialspoint.HelloWorld
Compiling 6 permutations
Compiling permutation 0...
Compiling permutation 1...
Compiling permutation 2...
Compiling permutation 3...
Compiling permutation 4...
Compiling permutation 5...
Compile of permutations succeeded
Linking into C:\workspace\HelloWorld\war\helloworld
Link succeeded
Compilation succeeded -- 33.029s
Step 7 - Run Application
Now click on
If everything is fine, you must see GWT Development Mode active in Eclipse containing a URL as shown below. Double click the URL to open the GWT application.
Because you are running your application in development mode, so you will need to install GWT plugin for your browser. Simply follow the onscreen instructions to install the plugin.
If you already have GWT plugin set for your browser, then you should be able to see the following output
Congratulations! you have implemented your first application using Google Web Toolkit (GWT).
This tutorial will explain you how to create an application "war" file and how to deploy that in Apache Tomcat Websever root.
If you understood this simple example then you will also be able to deploy a complex GWT application following the same steps.
Let us have working Eclipse IDE along with GWT plug in place and follow the following steps to create a GWT application −
Step | Description |
---|---|
1 | Create a project with a name HelloWorld under a package com.tutorialspoint as explained in the GWT - Create Application chapter. |
2 | Modify HelloWorld.gwt.xml, HelloWorld.css, HelloWorld.html and HelloWorld.java as explained below. Keep rest of the files unchanged. |
3 | Compile and run the application to make sure business logic is working as per the requirements. |
4 | Finally, zip the content of the war folder of the application in the form of war file and deploy it in Apache Tomcat Webserver. |
5 | Launch your web application using appropriate URL as explained below in the last step. |
Following is the content of the modified module descriptor 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'/>
<!-- 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>
Following is the content of the modified Style Sheet file 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;
}
Following is the content of the modified HTML host file 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>Hello World</h1>
<div id = "gwtContainer"></div>
</body>
</html>
I modified HTML a little bit from previous example. Here I created a placeholder <div>...</div> where we will insert some content using our entry point java class. So let us have following content of Java file src/com.tutorialspoint/HelloWorld.java.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootPanel;
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
HTML html = new HTML("<p>Welcome to GWT application</p>");
RootPanel.get("gwtContainer").add(html);
}
}
Here we created on basic widgest HTML and added it inside the div tag having id="gwtContainer". We will study different GWT widgets in coming chapters.
Once you are ready with all the changes done, let us compile and run the application in development mode as we did in GWT - Create Application chapter. If everything is fine with your application, this will produce following result −
Create WAR File
Now our applictaion is working fine and we are ready to export it as a war file.
Follow the following steps −
Go into your project's war directory C:\workspace\HelloWorld\war
Select all the files & folders available inside war directory.
Zip all the selected files & folders in a file called HelloWorld.zip.
Rename HelloWorld.zip to HelloWorld.war.
Deploy WAR file
Stop the tomcat server.
Copy the HelloWorld.war file to tomcat installation directory > webapps folder.
Start the tomcat server.
Look inside webapps directory, there should be a folder helloworld got created.
Now HelloWorld.war is successfully deployed in Tomcat Webserver root.
Run Application
Enter a url in web browser: http://localhost:8080/HelloWorld to launch the application
Server name (localhost) and port (8080) may vary as per your tomcat configuration.
GWT widgets rely on cascading style sheets (CSS) for visual styling. By default, the class name for each component is gwt-<classname>.
For example, the Button widget has a default style of gwt-Button and similar way TextBox widgest has a default style of gwt-TextBox.
In order to give all buttons and text boxes a larger font, you could put the following rule in your application's CSS file
.gwt-Button { font-size: 150%; }
.gwt-TextBox { font-size: 150%; }
By default, neither the browser nor GWT creates default id attributes for widgets. You must explicitly create a unique id for the elements which you can use in CSS. In order to give a particular button with id my-button-id a larger font, you could put the following rule in your application's CSS file −
#my-button-id { font-size: 150%; }
To set the id for a GWT widget, retrieve its DOM Element and then set the id attribute as follows −
Button b = new Button();
DOM.setElementAttribute(b.getElement(), "id", "my-button-id")
CSS Styling APIs
There are many APIs available to hangle CSS setting for any GWT widget. Following are few important APIs which will help you in your day to day web programming using GWT −
Sr.No. | API & Description |
---|---|
1 | public void setStyleName(java.lang.String style) This method will clear any existing styles and set the widget style to the new CSS class provided using style. |
2 | public void addStyleName(java.lang.String style) This method will add a secondary or dependent style name to the widget. A secondary style name is an additional style name that is,so if there were any previous style names applied they are kept. |
3 | public void removeStyleName(java.lang.String style) This method will remove given style from the widget and leaves any others associated with the widget. |
4 | public java.lang.String getStyleName() This method gets all of the object's style names, as a space-separated list. |
5 | public void setStylePrimaryName(java.lang.String style) This method sets the object's primary style name and updates all dependent style names. |
For example, let's define two new styles which we will apply to a text −
.gwt-Big-Text {
font-size:150%;
}
.gwt-Small-Text {
font-size:75%;
}
.gwt-Red-Text {
color:red;
}
Now you can use setStyleName(Style) to change the default setting to new setting. After applying the below rule, a text's font will become large
txtWidget.setStyleName("gwt-Big-Text");
We can apply a secondary CSS rule on the same widget to change its color as follows −
txtWidget.addStyleName("gwt-Red-Text");
Using above method you can add as many styles as you like to apply on a widget. If you remove first style from the button widget then second style will still remain with the text.
txtWidget.removeStyleName("gwt-Big-Text");
Primary & Secondary Styles
By default, the primary style name of a widget will be the default style name for its widget class for example gwt-Button for Button widgets. When we add and remove style names using AddStyleName() method, those styles are called secondary styles.
The final appearance of a widget is determined by the sum of all the secondary styles added to it, plus its primary style. You set the primary style of a widget with the setStylePrimaryName(String) method. To illustrate, let's say we have a Label widget. In our CSS file, we have the following rules defined −
.MyText {
color: blue;
}
.BigText {
font-size: large;
}
.LoudText {
font-weight: bold;
}
Let's suppose we want a particular label widget to always display blue text, and in some cases, use a larger, bold font for added emphasis.
We could do something like this −
// set up our primary style
Label someText = new Label();
someText.setStylePrimaryName("MyText");
...
// later on, to really grab the user's attention
someText.addStyleName("BigText");
someText.addStyleName("LoudText");
...
// after the crisis is over
someText.removeStyleName("BigText");
someText.removeStyleName("LoudText");
Associating CSS Files
There are multiple approaches for associating CSS files with your module. Modern GWT applications typically use a combination of CssResource and UiBinder. We are using only first approach in our examples.
Using a <link> tag in the host HTML page.
Using the <stylesheet> element in the module XML file.
Using a CssResource contained within a ClientBundle.
Using an inline <ui:style> element in a UiBinder template.
GWT CSS Example
This example will take you through simple steps to apply different CSS rules on your GWT widgest. Let us have working Eclipse IDE along with GWT plug in place and follow the following steps to create a GWT application −
Step | Description |
---|---|
1 | Create a project with a name HelloWorld under a package com.tutorialspoint as explained in the GWT - Create Application chapter. |
2 | Modify HelloWorld.gwt.xml, HelloWorld.css, HelloWorld.html and HelloWorld.java as explained below. Keep rest of the files unchanged. |
3 | Compile and run the application to verify the result of the implemented logic. |
Following is the content of the modified module descriptor 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'/>
<!-- 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>
Following is the content of the modified Style Sheet file 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;
}
.gwt-Button {
font-size: 150%;
font-weight: bold;
width:100px;
height:100px;
}
.gwt-Big-Text {
font-size:150%;
}
.gwt-Small-Text {
font-size:75%;
}
Following is the content of the modified HTML host file war/HelloWorld.html to accomodate two buttons.
<html>
<head>
<title>Hello World</title>
<link rel = "stylesheet" href = "HelloWorld.css"/>
<script language = "javascript" src = "helloworld/helloworld.nocache.js">
</script>
</head>
<body>
<div id = "mytext"><h1>Hello, World!</h1></div>
<div id = "gwtGreenButton"></div>
<div id = "gwtRedButton"></div>
</body>
</html>
Let us have following content of Java file src/com.tutorialspoint/HelloWorld.java which will take care of adding two buttons in HTML and will apply custom CSS style.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootPanel;
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
// add button to change font to big when clicked.
Button Btn1 = new Button("Big Text");
Btn1.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
RootPanel.get("mytext").setStyleName("gwt-Big-Text");
}
});
// add button to change font to small when clicked.
Button Btn2 = new Button("Small Text");
Btn2.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
RootPanel.get("mytext").setStyleName("gwt-Small-Text");
}
});
RootPanel.get("gwtGreenButton").add(Btn1);
RootPanel.get("gwtRedButton").add(Btn2);
}
}
Once you are ready with all the changes done, let us compile and run the application in development mode as we did in GWT - Create Application chapter. If everything is fine with your application, this will produce following result −
Now try clicking on the two buttons displayed and observe "Hello, World!" text which keeps changing its font upon clicking on the two buttons.
Every user interface considers the following three main aspects −
UI elements − Thes are the core visual elements the user eventually sees and interacts with. GWT provides a huge list of widely used and common elements varying from basic to complex which we will cover in this tutorial.
Layouts − They define how UI elements should be organized on the screen and provide a final look and feel to the GUI (Graphical User Interface). This part will be covered in Layout chapter.
Behavior − These are events which occur when the user interacts with UI elements. This part will be covered in Event Handling chapter.
GWT UI Elements
The GWT library provides classes in a well-defined class hierarchy to create complex web-based user interfaces. All classes in this component hierarchy has been derived from the UIObject base class as shown below −
Every Basic UI widget inherits properties from Widget class which in turn inherits properties from UIObject. Tree and Menu will be covered in complex widgets tutorial.
Sr.No. | Widget & Description |
---|---|
1 | GWT UIObject Class This widget contains text, not interpreted as HTML using a <div>element, causing it to be displayed with block layout. |
2 | GWT Widget Class This widget can contain HTML text and displays the html content using a <div> element, causing it to be displayed with block layout. |
Basic Widgets
Following are few important Basic Widgets −
Sr.No. | Widget & Description |
---|---|
1 | Label This widget contains text, not interpreted as HTML using a <div>element, causing it to be displayed with block layout. |
2 | HTML This widget can contain HTML text and displays the html content using a <div> element, causing it to be displayed with block layout. |
3 | Image This widget displays an image at a given URL. |
4 | Anchor This widget represents a simple <a> element. |
Form widgets allows users to input data and provides them interaction capability with the application. Every Form widget inherits properties from Widget class which in turn inherits properties from UIObject and Wigdet classes.
Sr.No. | Widget & Description |
---|---|
1 | GWT UIObject Class This widget contains text, not interpreted as HTML using a <div>element, causing it to be displayed with block layout. |
2 | GWT Widget Class This widget can contain HTML text and displays the html content using a <div> element, causing it to be displayed with block layout. |
Form Widgets
Following are few important Form Widgets −
Sr.No. | Widget & Description |
---|---|
1 | Button This widget represents a standard push button. |
2 | PushButton This widget represents a normal push button with custom styling. |
3 | ToggleButton This widget represents a stylish stateful button which allows the user to toggle between up and down states. |
4 | CheckBox This widget represents a standard check box widget. This class also serves as a base class for RadioButton. |
5 | RadioButton This widget represents a mutually-exclusive selection radio button widget. |
6 | ListBox This widget represents a list of choices to the user, either as a list box or as a drop-down list. |
7 | SuggestBox This widget represents a text box or text area which displays a pre-configured set of selections that match the user's input. Each SuggestBox is associated with a single SuggestOracle. The SuggestOracle is used to provide a set of selections given a specific query string. |
8 | TextBox This widget represents a single line text box. |
9 | PasswordTextBox This widget represents a text box that visually masks its input to prevent eavesdropping.. |
10 | TextArea This widget represents a text box that allows multiple lines of text to be entered. |
11 | RichTextArea This widget represents a rich text editor that allows complex styling and formatting. |
12 | FileUpload This widget wraps the HTML <input type='file'> element. |
13 | Hidden This widget represets a hidden field in an HTML form. |
"Complex widgets" allows users to advanced interaction capability with the application. Every Complex widget inherits properties from Widget class which in turn inherits properties from UIObject.
Sr.No. | Widget & Description |
---|---|
1 | GWT UIObject Class This widget contains text, not interpreted as HTML using a <div>element, causing it to be displayed with block layout. |
2 | GWT Widget Class This widget can contain HTML text and displays the html content using a <div> element, causing it to be displayed with block layout. |
Complex Widgets
Following are few important Complex Widgets −
Sr.No. | Widget & Description |
---|---|
1 | Tree This widget represents a standard hierarchical tree widget. The tree contains a hierarchy of TreeItems that the user can open, close, and select. |
2 | MenuBar This widget represents a standard menu bar widget. A menu bar can contain any number of menu items, each of which can either fire a Command or open a cascaded menu bar. |
3 | DatePicker This widget represents a standard GWT date picker. |
4 | CellTree This widget represents a view of a tree. This widget will only work in standards mode, which requires that the HTML page in which it is run have an explicit <!DOCTYPE> declaration. |
5 | CellList This widget represents a single column list of cells. |
6 | CellTable This widget represents a tabular view that supports paging and columns. |
7 | CellBrowser This widget represents a browsable view of a tree in which only a single node per level may be open at one time. This widget will only work in standards mode, which requires that the HTML page in which it is run have an explicit <!DOCTYPE> declaration. |
Layout Panels can contain other widgets. These panels controls the way widgets to be shown on User Interface. Every Panel widget inherits properties from Panel class which in turn inherits properties from Widget class and which in turn inherits properties from UIObject class.
Sr.No. | Widget & Description |
---|---|
1 | GWT UIObject Class This widget contains text, not interpreted as HTML using a <div>element, causing it to be displayed with block layout. |
2 | GWT Widget Class This widget can contain HTML text and displays the html content using a <div> element, causing it to be displayed with block layout. |
3 | GWT Panel Class This is an is the abstract base class for all panels, which are widgets that can contain other widgets. |
Panel Tata Letak
Berikut adalah beberapa Panel Tata Letak penting -
Sr.No. | Widget & Deskripsi |
---|---|
1 | FlowPanel Widget ini mewakili panel yang memformat widget turunannya menggunakan perilaku tata letak HTML default. |
2 | HorizontalPanel Widget ini mewakili panel yang meletakkan semua widgetnya dalam satu kolom horizontal. |
3 | VerticalPanel Widget ini mewakili panel yang meletakkan semua widgetnya dalam satu kolom vertikal. |
4 | HorizontalSplitPanel Widget ini mewakili panel yang mengatur dua widget dalam satu baris horizontal dan memungkinkan pengguna untuk secara interaktif mengubah proporsi lebar yang didedikasikan untuk masing-masing dari dua widget. Widget yang terdapat dalam HorizontalSplitPanel akan secara otomatis didekorasi dengan scrollbar jika diperlukan. |
5 | VerticalSplitPanel Widget ini mewakili panel A yang mengatur dua widget dalam satu kolom vertikal dan memungkinkan pengguna untuk secara interaktif mengubah proporsi ketinggian yang didedikasikan untuk masing-masing dari dua widget. Widget yang terdapat dalam VertialSplitPanel akan secara otomatis didekorasi dengan scrollbar jika diperlukan. |
6 | FlexTable Widget ini mewakili tabel fleksibel yang membuat sel sesuai permintaan. Ini dapat bergerigi (yaitu, setiap baris dapat berisi jumlah sel yang berbeda) dan sel individu dapat diatur untuk menjangkau beberapa baris atau kolom. |
7 | Kotak Widget ini mewakili kisi persegi panjang yang dapat berisi teks, html, atau Widget turunan di dalam selnya. Ini harus diubah ukurannya secara eksplisit ke jumlah baris dan kolom yang diinginkan. |
8 | DeckPanel panel yang menampilkan semua widget turunannya dalam 'dek', di mana hanya satu yang dapat terlihat dalam satu waktu. Ini digunakan oleh TabPanel. |
9 | DockPanel Widget ini mewakili panel yang meletakkan widget turunannya "berlabuh" di tepi luarnya, dan memungkinkan widget terakhirnya mengambil ruang yang tersisa di tengahnya. |
10 | HTMLPanel Widget ini mewakili panel yang berisi HTML, dan yang dapat melampirkan widget turunan ke elemen yang diidentifikasi dalam HTML itu. |
11 | TabPanel Widget ini mewakili panel yang mewakili sekumpulan halaman bertab, yang masing-masing berisi widget lain. Widget turunannya ditampilkan saat pengguna memilih berbagai tab yang terkait dengannya. Tab dapat berisi HTML sembarang. |
12 | Gabungan Widget ini mewakili jenis widget yang dapat membungkus widget lain, menyembunyikan metode widget yang dibungkus. Saat ditambahkan ke panel, komposit berperilaku persis seperti jika widget yang dibungkusnya telah ditambahkan. |
13 | SimplePanel Widget ini mewakili kelas Base untuk panel yang hanya berisi satu widget. |
14 | ScrollPanel Widget ini mewakili panel sederhana yang membungkus isinya di area yang dapat digulir |
15 | FocusPanel Widget ini mewakili panel sederhana yang membuat kontennya dapat difokuskan, dan menambahkan kemampuan untuk menangkap peristiwa mouse dan keyboard. |
16 | FormPanel Widget ini mewakili panel yang membungkus isinya dalam elemen <FORM> HTML. |
17 | PopupPanel Widget ini mewakili panel yang bisa pop updi atas widget lain. Ini melapisi area klien browser (dan sembulan yang dibuat sebelumnya). |
18 | Kotak dialog Widget ini merepresentasikan bentuk popup yang memiliki caption area di bagian atas dan dapat di-drag oleh pengguna. Tidak seperti PopupPanel, panggilan ke PopupPanel.setWidth (String) dan PopupPanel.setHeight (String) akan menyetel lebar dan tinggi dari kotak dialog itu sendiri, meskipun widget belum ditambahkan. |
GWT menyediakan model penanganan peristiwa yang mirip dengan kerangka kerja Antarmuka Pengguna AWT atau SWING Java.
Antarmuka pendengar menentukan satu atau beberapa metode yang dipanggil widget untuk mengumumkan suatu peristiwa. GWT menyediakan daftar antarmuka yang sesuai dengan berbagai kemungkinan kejadian.
Sebuah kelas yang ingin menerima kejadian dari jenis tertentu mengimplementasikan antarmuka penangan terkait dan kemudian meneruskan referensi ke widget itu sendiri untuk berlangganan sekumpulan kejadian.
Misalnya, file Button kelas menerbitkan click eventssehingga Anda akan harus menulis kelas untuk melaksanakan ClickHandler untuk menanganiclick peristiwa.
Antarmuka Penangan Peristiwa
Semua penangan peristiwa GWT telah diperluas dari antarmuka EventHandler dan setiap penangan hanya memiliki satu metode dengan satu argumen. Argumen ini selalu merupakan objek dari tipe kejadian terkait. Setiapeventobjek memiliki sejumlah metode untuk memanipulasi objek acara yang dilewatkan. Misalnya untuk acara klik Anda harus menulis penangan Anda sebagai berikut -
/**
* create a custom click handler which will call
* onClick method when button is clicked.
*/
public class MyClickHandler implements ClickHandler {
@Override
public void onClick(ClickEvent event) {
Window.alert("Hello World!");
}
}
Sekarang setiap kelas yang ingin menerima peristiwa klik akan menelepon addClickHandler() untuk mendaftarkan event handler sebagai berikut -
/**
* create button and attach click handler
*/
Button button = new Button("Click Me!");
button.addClickHandler(new MyClickHandler());
Setiap widget yang mendukung tipe event akan memiliki metode dari bentuk penambahan HandlerRegistrationFooPenangan (FooAcara) di mana Foo adalah kejadian sebenarnya seperti Klik, Kesalahan, KeyPress, dll.
Berikut adalah daftar penangan peristiwa GWT penting dan peristiwa terkait serta metode pendaftaran penangan -
Sr.No. | Antarmuka Acara | Metode & Deskripsi Acara |
---|---|---|
1 | Sebelum Penangan Pemilihan <I> | void on Before Selection (Before Selection Event<I> event); Dipanggil saat BeforeSelectionEvent diaktifkan. |
2 | BlurHandler | void on Blur(Blur Event event); Dipanggil saat Blur Event diaktifkan. |
3 | ChangeHandler | void on Change(ChangeEvent event); Dipanggil saat peristiwa perubahan diaktifkan. |
4 | ClickHandler | void on Click(ClickEvent event); Dipanggil saat peristiwa klik asli diaktifkan. |
5 | CloseHandler <T> | void on Close(CloseEvent<T> event); Dipanggil saat CloseEvent diaktifkan. |
6 | Penangan Menu Konteks | void on Context Menu(Context Menu Event event); Dipanggil saat peristiwa menu konteks asli diaktifkan. |
7 | Double Click Handler | void on Double Click(Double Click Event event); Dipanggil saat Peristiwa Klik Ganda diaktifkan. |
8 | Penangan Kesalahan | void on Error(Error Event event); Dipanggil saat Peristiwa Kesalahan diaktifkan. |
9 | Penangan Fokus | void on Focus(Focus Event event); Dipanggil saat Focus Event diaktifkan. |
10 | Panel Formulir. Kirim Penangan Lengkap | void on Submit Complete(Form Panel.Submit Complete Event event); Diaktifkan ketika formulir telah berhasil dikirim. |
11 | FormPanel.SubmitHandler | void on Submit(Form Panel.Submit Event event); Dipecat saat formulir dikirimkan. |
12 | Penangan Key Down | void on Key Down(Key Down Event event); Dipanggil saat KeyDownEvent diaktifkan. |
13 | KeyPressHandler | void on KeyPress(KeyPressEvent event); Dipanggil saat KeyPressEvent diaktifkan. |
14 | KeyUpHandler | void on KeyUp(KeyUpEvent event); Dipanggil saat KeyUpEvent diaktifkan. |
15 | LoadHandler | void on Load(LoadEvent event); Dipanggil saat LoadEvent diaktifkan. |
16 | MouseDownHandler | void on MouseDown(MouseDownEvent event); Dipanggil saat MouseDown ditembakkan. |
17 | MouseMoveHandler | void on MouseMove(MouseMoveEvent event); Dipanggil saat MouseMoveEvent diaktifkan. |
18 | MouseOutHandler | void on MouseOut(MouseOutEvent event); Dipanggil saat MouseOutEvent diaktifkan. |
19 | MouseOverHandler | void on MouseOver(MouseOverEvent event); Dipanggil saat MouseOverEvent diaktifkan. |
20 | MouseUpHandler | void on MouseUp(MouseUpEvent event); Dipanggil saat MouseUpEvent diaktifkan. |
21 | MouseWheelHandler | void on MouseWheel(MouseWheelEvent event); Dipanggil saat MouseWheelEvent diaktifkan. |
22 | ResizeHandler | void on Resize(ResizeEvent event); Diaktifkan saat widget diubah ukurannya. |
23 | ScrollHandler | void on Scroll(ScrollEvent event); Dipanggil saat ScrollEvent diaktifkan. |
24 | SelectionHandler <I> | void on Selection(SelectionEvent<I> event); Dipanggil saat SelectionEvent diaktifkan. |
25 | ValueChangeHandler <I> | void on ValueChange(ValueChangeEvent<I> event); Dipanggil saat ValueChangeEvent diaktifkan. |
26 | Window.ClosingHandler | void on WindowClosing(Window.ClosingEvent event); Diaktifkan tepat sebelum jendela browser menutup atau menavigasi ke situs lain. |
27 | Window.ScrollHandler | void on WindowScroll(Window.ScrollEvent event); Diaktifkan saat jendela browser di-scroll. |
Metode Acara
Seperti disebutkan sebelumnya, setiap penangan memiliki satu metode dengan satu argumen yang menampung objek peristiwa, misalnya void onClick (peristiwa ClickEvent) atau void onKeyDown (peristiwa KeyDownEvent) . Objek acara seperti ClickEvent dan KeyDownEvent memiliki beberapa metode umum yang tercantum di bawah ini -
Sr.No. | Metode & Deskripsi |
---|---|
1 | protected void dispatch(ClickHandler handler) Metode ini seharusnya hanya dipanggil oleh HandlerManager |
2 | DomEvent.Type <FooHandler> getAssociatedType() Metode ini mengembalikan tipe yang digunakan untuk mendaftar Foo peristiwa. |
3 | static DomEvent.Type<FooHandler> getType() Metode ini mendapatkan jenis acara yang terkait dengan Foo acara. |
4 | public java.lang.Object getSource() Metode ini mengembalikan sumber yang terakhir kali mengaktifkan peristiwa ini. |
5 | protected final boolean isLive() Metode ini mengembalikan apakah acara ditayangkan. |
6 | protected void kill() Metode ini mematikan acara tersebut |
Contoh
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk menunjukkan penggunaan file Click Acara dan KeyDownPenanganan acara di GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>Event Handling Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java yang akan mendemonstrasikan penggunaan Penanganan Peristiwa di GWT.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
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.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.user.client.Window;
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.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
/**
* create textbox and attach key down handler
*/
TextBox textBox = new TextBox();
textBox.addKeyDownHandler(new MyKeyDownHandler());
/*
* create button and attach click handler
*/
Button button = new Button("Click Me!");
button.addClickHandler(new MyClickHandler());
VerticalPanel panel = new VerticalPanel();
panel.setSpacing(10);
panel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
panel.setSize("300", "100");
panel.add(textBox);
panel.add(button);
DecoratorPanel decoratorPanel = new DecoratorPanel();
decoratorPanel.add(panel);
RootPanel.get("gwtContainer").add(decoratorPanel);
}
/**
* create a custom click handler which will call
* onClick method when button is clicked.
*/
private class MyClickHandler implements ClickHandler {
@Override
public void onClick(ClickEvent event) {
Window.alert("Hello World!");
}
}
/**
* create a custom key down handler which will call
* onKeyDown method when a key is down in textbox.
*/
private class MyKeyDownHandler implements KeyDownHandler {
@Override
public void onKeyDown(KeyDownEvent event) {
if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER){
Window.alert(((TextBox)event.getSource()).getValue());
}
}
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
GWT menyediakan tiga cara untuk membuat elemen antarmuka pengguna khusus. Ada tiga strategi umum untuk diikuti -
Create a widget by extending Composite Class- Ini adalah cara paling umum dan termudah untuk membuat widget khusus. Di sini Anda dapat menggunakan widget yang ada untuk membuat tampilan komposit dengan properti kustom.
Create a widget using GWT DOM API in JAVA- Widget dasar GWT dibuat dengan cara ini. Masih merupakan cara yang sangat rumit untuk membuat widget khusus dan harus digunakan dengan hati-hati.
Use JavaScript and wrap it in a widget using JSNI- Ini biasanya hanya dilakukan sebagai upaya terakhir. Mempertimbangkan implikasi lintas browser dari metode asli, ini menjadi sangat rumit dan juga menjadi lebih sulit untuk di-debug.
Buat Widget Kustom dengan Kelas Komposit
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk menampilkan pembuatan Widget Khusus di GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Widget Dasar -
Di sini kita akan membuat widget khusus dengan memperluas kelas Composite, yang merupakan cara termudah untuk membuat widget khusus.
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>Custom Widget Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java yang akan mendemonstrasikan pembuatan widget Kustom.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
public class HelloWorld implements EntryPoint {
/**
* A composite of a TextBox and a CheckBox that optionally enables it.
*/
private static class OptionalTextBox extends Composite implements
ClickHandler {
private TextBox textBox = new TextBox();
private CheckBox checkBox = new CheckBox();
private boolean enabled = true;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
/**
* Style this widget using .optionalTextWidget CSS class.<br/>
* Style textbox using .optionalTextBox CSS class.<br/>
* Style checkbox using .optionalCheckBox CSS class.<br/>
* Constructs an OptionalTextBox with the given caption
* on the check.
* @param caption the caption to be displayed with the check box
*/
public OptionalTextBox(String caption) {
// place the check above the text box using a vertical panel.
HorizontalPanel panel = new HorizontalPanel();
// panel.setBorderWidth(1);
panel.setSpacing(10);
panel.add(checkBox);
panel.add(textBox);
// all composites must call initWidget() in their constructors.
initWidget(panel);
//set style name for entire widget
setStyleName("optionalTextWidget");
//set style name for text box
textBox.setStyleName("optionalTextBox");
//set style name for check box
checkBox.setStyleName("optionalCheckBox");
textBox.setWidth("200");
// Set the check box's caption, and check it by default.
checkBox.setText(caption);
checkBox.setValue(enabled);
checkBox.addClickHandler(this);
enableTextBox(enabled,checkBox.getValue());
}
public void onClick(ClickEvent event) {
if (event.getSource() == checkBox) {
// When the check box is clicked,
//update the text box's enabled state.
enableTextBox(enabled,checkBox.getValue());
}
}
private void enableTextBox(boolean enable,boolean isChecked){
enable = (enable && isChecked) || (!enable && !isChecked);
textBox.setStyleDependentName("disabled", !enable);
textBox.setEnabled(enable);
}
}
public void onModuleLoad() {
// Create an optional text box and add it to the root panel.
OptionalTextBox otb = new OptionalTextBox(
"Want to explain the solution?");
otb.setEnabled(true);
RootPanel.get().add(otb);
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
You can notice following points
Pembuatan Widget Khusus dengan memperluas widget Komposit cukup mudah.
Kami telah membuat widget dengan widget bawaan GWT, TextBox, dan CheckBox menggunakan konsep dapat digunakan kembali.
TextBox dinonaktifkan / diaktifkan tergantung pada status kotak centang. Kami telah menyediakan API untuk mengaktifkan / menonaktifkan kontrol.
Kami telah mengekspos gaya widget internal melalui gaya CSS yang didokumentasikan.
pengantar
UiBinder adalah kerangka kerja yang dirancang untuk memisahkan Fungsionalitas dan Tampilan Antarmuka Pengguna.
Kerangka kerja UiBinder memungkinkan pengembang untuk membangun aplikasi gwt sebagai halaman HTML dengan widget GWT yang dikonfigurasi di dalamnya.
Kerangka kerja UiBinder membuat kolaborasi lebih mudah dengan desainer UI yang lebih nyaman dengan XML, HTML dan CSS daripada kode sumber Java
UIBinder menyediakan cara deklaratif untuk mendefinisikan Antarmuka Pengguna.
UIBinder memisahkan logika program dari UI.
UIBinder mirip dengan JSP untuk Servlets.
Alur Kerja UiBinder
Langkah 1 - Buat File XML Deklarasi UI
Buat file deklarasi Antarmuka Pengguna berbasis XML / HTML. Kami telah membuatLogin.ui.xml mengajukan dalam contoh kami.
<ui:UiBinder xmlns:ui = 'urn:ui:com.google.gwt.uibinder'
xmlns:gwt = 'urn:import:com.google.gwt.user.client.ui'
xmlns:res = 'urn:with:com.tutorialspoint.client.LoginResources'>
<ui:with type = "com.tutorialspoint.client.LoginResources" field = "res">
</ui:with>
<gwt:HTMLPanel>
...
</gwt:HTMLPanel>
</ui:UiBinder>
Langkah 2 - Gunakan bidang ui: untuk Pengikatan Nanti
Gunakan atribut ui: field dalam elemen XML / HTML untuk menghubungkan bidang UI di XML dengan bidang UI di file JAVA untuk pengikatan nanti.
<gwt:Label ui:field = "completionLabel1" />
<gwt:Label ui:field = "completionLabel2" />
Langkah 3 - Buat mitra Java dari XML UI
Buat pasangan berbasis Java dari tata letak berbasis XML dengan memperluas widget Komposit. Kami telah membuatLogin.java mengajukan dalam contoh kami.
package com.tutorialspoint.client;
...
public class Login extends Composite {
...
}
Langkah 4 - Ikat bidang UI Java dengan anotasi UiField
gunakan anotasi @UiField di Login.java untuk menunjuk anggota kelas mitra untuk mengikat ke bidang berbasis XML di Login.ui.xml
public class Login extends Composite {
...
@UiField
Label completionLabel1;
@UiField
Label completionLabel2;
...
}
Langkah 5 - Ikat UI Java dengan XML UI dengan anotasi UiTemplate
Perintahkan GWT untuk mengikat komponen berbasis java Login.java dan tata letak berbasis XML Login.ui.xml menggunakan anotasi @UiTemplate
public class Login extends Composite {
private static LoginUiBinder uiBinder = GWT.create(LoginUiBinder.class);
/*
* @UiTemplate is not mandatory but allows multiple XML templates
* to be used for the same widget.
* Default file loaded will be <class-name>.ui.xml
*/
@UiTemplate("Login.ui.xml")
interface LoginUiBinder extends UiBinder<Widget, Login> {
}
...
}
Langkah 6 - Buat File CSS
Buat file CSS eksternalLogin.css dan Sumber Daya berbasis Java LoginResources.java file yang setara dengan gaya css
.blackText {
font-family: Arial, Sans-serif;
color: #000000;
font-size: 11px;
text-align: left;
}
...
Langkah 7 - Buat File Sumber Daya berbasis Java untuk File CSS
package com.tutorialspoint.client;
...
public interface LoginResources extends ClientBundle {
public interface MyCss extends CssResource {
String blackText();
...
}
@Source("Login.css")
MyCss style();
}
Langkah 8 - Lampirkan sumber daya CSS di file Java UI Code.
Lampirkan file CSS eksternalLogin.css menggunakan kontruktor kelas widget berbasis Java Login.java
public Login() {
this.res = GWT.create(LoginResources.class);
res.style().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
}
Contoh Lengkap UIBinder
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk menunjukkan penggunaan UIBinder di GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>UiBinder Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Sekarang buat template UiBinder baru dan kelas pemilik (File → New → UiBinder).
Pilih paket klien untuk proyek tersebut dan beri nama Login. Biarkan semua default lainnya. Klik tombol Selesai dan plugin akan membuat template UiBinder baru dan kelas pemilik.
Sekarang buat file Login.css di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
.blackText {
font-family: Arial, Sans-serif;
color: #000000;
font-size: 11px;
text-align: left;
}
.redText {
font-family: Arial, Sans-serif;
color: #ff0000;
font-size: 11px;
text-align: left;
}
.loginButton {
border: 1px solid #3399DD;
color: #FFFFFF;
background: #555555;
font-size: 11px;
font-weight: bold;
margin: 0 5px 0 0;
padding: 4px 10px 5px;
text-shadow: 0 -1px 0 #3399DD;
}
.box {
border: 1px solid #AACCEE;
display: block;
font-size: 12px;
margin: 0 0 5px;
padding: 3px;
width: 203px;
}
.background {
background-color: #999999;
border: 1px none transparent;
color: #000000;
font-size: 11px;
margin-left: -8px;
margin-top: 5px;
padding: 6px;
}
Sekarang buat file LoginResources.java di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
package com.tutorialspoint.client;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
public interface LoginResources extends ClientBundle {
/**
* Sample CssResource.
*/
public interface MyCss extends CssResource {
String blackText();
String redText();
String loginButton();
String box();
String background();
}
@Source("Login.css")
MyCss style();
}
Ganti konten Login.ui.xml di src/com.tutorialspoint/client paket dengan berikut ini
<ui:UiBinder xmlns:ui = 'urn:ui:com.google.gwt.uibinder'
xmlns:gwt = 'urn:import:com.google.gwt.user.client.ui'
xmlns:res = 'urn:with:com.tutorialspoint.client.LoginResources'>
<ui:with type = "com.tutorialspoint.client.LoginResources" field = "res">
</ui:with>
<gwt:HTMLPanel>
<div align = "center">
<gwt:VerticalPanel res:styleName = "style.background">
<gwt:Label text = "Login" res:styleName = "style.blackText" />
<gwt:TextBox ui:field="loginBox" res:styleName = "style.box" />
<gwt:Label text = "Password" res:styleName = "style.blackText" />
<gwt:PasswordTextBox ui:field = "passwordBox" res:styleName = "style.box" />
<gwt:HorizontalPanel verticalAlignment = "middle">
<gwt:Button ui:field = "buttonSubmit" text="Submit"
res:styleName = "style.loginButton" />
<gwt:CheckBox ui:field = "myCheckBox" />
<gwt:Label ui:field = "myLabel" text = "Remember me"
res:styleName = "style.blackText" />
</gwt:HorizontalPanel>
<gwt:Label ui:field = "completionLabel1" res:styleName = "style.blackText" />
<gwt:Label ui:field = "completionLabel2" res:styleName = "style.blackText" />
</gwt:VerticalPanel>
</div>
</gwt:HTMLPanel>
</ui:UiBinder>
Ganti konten Login.java di src/com.tutorialspoint/client paket dengan berikut ini
package com.tutorialspoint.client;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.uibinder.client.UiTemplate;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
public class Login extends Composite {
private static LoginUiBinder uiBinder = GWT.create(LoginUiBinder.class);
/*
* @UiTemplate is not mandatory but allows multiple XML templates
* to be used for the same widget.
* Default file loaded will be <class-name>.ui.xml
*/
@UiTemplate("Login.ui.xml")
interface LoginUiBinder extends UiBinder<Widget, Login> {
}
@UiField(provided = true)
final LoginResources res;
public Login() {
this.res = GWT.create(LoginResources.class);
res.style().ensureInjected();
initWidget(uiBinder.createAndBindUi(this));
}
@UiField
TextBox loginBox;
@UiField
TextBox passwordBox;
@UiField
Label completionLabel1;
@UiField
Label completionLabel2;
private Boolean tooShort = false;
/*
* Method name is not relevant, the binding is done according to the class
* of the parameter.
*/
@UiHandler("buttonSubmit")
void doClickSubmit(ClickEvent event) {
if (!tooShort) {
Window.alert("Login Successful!");
} else {
Window.alert("Login or Password is too short!");
}
}
@UiHandler("loginBox")
void handleLoginChange(ValueChangeEvent<String> event) {
if (event.getValue().length() < 6) {
completionLabel1.setText("Login too short (Size must be > 6)");
tooShort = true;
} else {
tooShort = false;
completionLabel1.setText("");
}
}
@UiHandler("passwordBox")
void handlePasswordChange(ValueChangeEvent<String> event) {
if (event.getValue().length() < 6) {
tooShort = true;
completionLabel2.setText("Password too short (Size must be > 6)");
} else {
tooShort = false;
completionLabel2.setText("");
}
}
}
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java yang akan mendemonstrasikan penggunaan UiBinder.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
public class HelloWorld implements EntryPoint {
public void onModuleLoad() {
RootPanel.get().add(new Login());
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Aplikasi berbasis GWT umumnya terdiri dari modul sisi klien dan modul sisi server. Kode sisi klien berjalan di browser dan kode sisi server berjalan di server web. Kode sisi klien harus membuat permintaan HTTP di seluruh jaringan untuk mengakses data sisi server.
RPC, Panggilan Prosedur Jarak Jauh adalah mekanisme yang digunakan oleh GWT di mana kode klien dapat langsung menjalankan metode sisi server.
GWT RPC berbasis servlet.
GWT RPC asinkron dan klien tidak pernah diblokir selama komunikasi.
Menggunakan objek Java GWT RPC dapat dikirim langsung antara klien dan server (yang secara otomatis diserialkan oleh framework GWT).
Servlet sisi server disebut sebagai service.
Panggilan prosedur jarak jauh yang memanggil metode servlet sisi server dari kode sisi klien disebut sebagai invoking a service.
Komponen RPC GWT
Berikut adalah tiga komponen yang digunakan dalam mekanisme komunikasi RPC GWT
- Layanan jarak jauh (servlet sisi server) yang berjalan di server.
- Kode klien untuk menjalankan layanan itu.
- Objek data Java yang akan diteruskan antara klien dan server.
Klien dan server GWT membuat serial dan deserialisasi data secara otomatis sehingga pengembang tidak perlu membuat serial / deserialisasi objek dan objek data dapat berjalan melalui HTTP.
Diagram berikut menunjukkan Arsitektur RPC.
Untuk mulai menggunakan RPC, kita diharuskan untuk mengikuti konvensi GWT.
Alur Kerja Komunikasi RPC
Langkah 1 - Buat Kelas Model Serializable
Tentukan objek model java di sisi klien yang harus dapat diserialkan.
public class Message implements Serializable {
...
private String message;
public Message(){};
public void setMessage(String message) {
this.message = message;
}
...
}
Langkah 2 - Buat Antarmuka Layanan
Tentukan antarmuka untuk layanan di sisi klien yang memperluas RemoteService yang mencantumkan semua metode layanan.
Gunakan anotasi @RemoteServiceRelativePath untuk memetakan layanan dengan jalur default servlet jarak jauh yang relatif ke URL dasar modul.
@RemoteServiceRelativePath("message")
public interface MessageService extends RemoteService {
Message getMessage(String input);
}
Langkah 3 - Buat Antarmuka Layanan Async
Tentukan antarmuka asinkron ke layanan di sisi klien (di lokasi yang sama dengan layanan yang disebutkan di atas) yang akan digunakan dalam kode klien GWT.
public interface MessageServiceAsync {
void getMessage(String input, AsyncCallback<Message> callback);
}
Langkah 4 - Buat kelas Servlet Implementasi Layanan
Menerapkan antarmuka di sisi server dan kelas itu harus memperluas kelas RemoteServiceServlet.
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;
}
}
Langkah 5 - Perbarui Web.xml untuk menyertakan deklarasi Servlet
Edit deskriptor penerapan aplikasi web (web.xml) untuk menyertakan deklarasi MessageServiceImpl Servlet.
<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>
Langkah 6 - Lakukan panggilan prosedur jarak jauh dalam Kode Aplikasi
Buat kelas proxy layanan.
MessageServiceAsync messageService = GWT.create(MessageService.class);
Buat AsyncCallback Handler untuk menangani callback RPC di mana server mengembalikan Pesan kembali ke klien
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());
}
}
Panggil layanan Jarak Jauh saat pengguna berinteraksi dengan UI
public class HelloWorld implements EntryPoint {
...
public void onModuleLoad() {
...
buttonMessage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
messageService.getMessage(txtName.getValue(),
new MessageCallBack());
}
});
...
}
}
Contoh Komunikasi RPC Lengkap
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk menampilkan contoh Komunikasi RPC di GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>
Sekarang buat file Message.java di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
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;
}
}
Sekarang buat file MessageService.java di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
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);
}
Sekarang buat file MessageServiceAsync.java di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
package com.tutorialspoint.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
public interface MessageServiceAsync {
void getMessage(String input, AsyncCallback<Message> callback);
}
Sekarang buat file MessageServiceImpl.java di src/com.tutorialspoint/server paket dan tempatkan konten berikut di dalamnya
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;
}
}
Perbarui konten deskriptor penerapan aplikasi web yang dimodifikasi war/WEB-INF/web.xml untuk menyertakan deklarasi MessageServiceImpl Servlet.
<?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>
Ganti konten HelloWorld.java di src/com.tutorialspoint/client paket dengan berikut ini
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);
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
GWT memberikan dukungan yang sangat baik untuk pengujian otomatis kode sisi klien menggunakan kerangka kerja pengujian JUnit. Pada artikel ini kami akan mendemonstrasikan integrasi GWT dan JUNIT.
Unduh arsip Junit
Situs Resmi JUnit - https://www.junit.org
Unduh Junit-4.10.jar
OS | Nama arsip |
---|---|
Windows | junit4.10.jar |
Linux | junit4.10.jar |
Mac | junit4.10.jar |
Simpan file jar yang diunduh ke beberapa lokasi di komputer Anda. Kami telah menyimpannya diC:/ > JUNIT
Temukan folder instalasi GWT
OS | Folder instalasi GWT |
---|---|
Windows | C: \ GWT \ gwt-2.1.0 |
Linux | /usr/local/GWT/gwt-2.1.0 |
Mac | /Library/GWT/gwt-2.1.0 |
Kelas GWTTestCase
GWT menyediakan GWTTestCasekelas dasar yang menyediakan integrasi JUnit. Menjalankan kelas terkompilasi yang memperluas GWTTestCase di bawah JUnit meluncurkan browser HtmlUnit yang berfungsi untuk meniru perilaku aplikasi Anda selama eksekusi pengujian.
GWTTestCase adalah kelas turunan dari JUnit's TestCase dan dapat dijalankan menggunakan JUnit TestRunner.
Menggunakan webAppCreator
GWT menyediakan alat baris perintah khusus webAppCreator yang dapat menghasilkan kasus uji pemula untuk kami, ditambah target semut dan konfigurasi peluncuran gerhana untuk pengujian dalam mode pengembangan dan mode produksi.
Buka command prompt dan pergi ke C:\ > GWT_WORKSPACE > di mana Anda ingin membuat proyek baru dengan dukungan tes. Jalankan perintah berikut
C:\GWT_WORKSPACE>C:\GWT\gwt-2.1.0\webAppCreator
-out HelloWorld
-junit C:\JUNIT\junit-4.10.jar
com.tutorialspoint.HelloWorld
Poin Penting
- Kami sedang menjalankan utilitas baris perintah webAppCreator.
- HelloWorld adalah nama proyek yang akan dibuat
- Opsi -junit menginstruksikan webAppCreator untuk menambahkan dukungan junit ke proyek
- com.tutorialspoint.HelloWorld adalah nama modulnya
Verifikasi hasilnya.
Created directory HelloWorld\src
Created directory HelloWorld\war
Created directory HelloWorld\war\WEB-INF
Created directory HelloWorld\war\WEB-INF\lib
Created directory HelloWorld\src\com\tutorialspoint
Created directory HelloWorld\src\com\tutorialspoint\client
Created directory HelloWorld\src\com\tutorialspoint\server
Created directory HelloWorld\src\com\tutorialspoint\shared
Created directory HelloWorld\test\com\tutorialspoint
Created directory HelloWorld\test\com\tutorialspoint\client
Created file HelloWorld\src\com\tutorialspoint\HelloWorld.gwt.xml
Created file HelloWorld\war\HelloWorld.html
Created file HelloWorld\war\HelloWorld.css
Created file HelloWorld\war\WEB-INF\web.xml
Created file HelloWorld\src\com\tutorialspoint\client\HelloWorld.java
Created file
HelloWorld\src\com\tutorialspoint\client\GreetingService.java
Created file
HelloWorld\src\com\tutorialspoint\client\GreetingServiceAsync.java
Created file
HelloWorld\src\com\tutorialspoint\server\GreetingServiceImpl.java
Created file HelloWorld\src\com\tutorialspoint\shared\FieldVerifier.java
Created file HelloWorld\build.xml
Created file HelloWorld\README.txt
Created file HelloWorld\test\com\tutorialspoint\HelloWorldJUnit.gwt.xml
Created file HelloWorld\test\com\tutorialspoint\client\HelloWorldTest.java
Created file HelloWorld\.project
Created file HelloWorld\.classpath
Created file HelloWorld\HelloWorld.launch
Created file HelloWorld\HelloWorldTest-dev.launch
Created file HelloWorld\HelloWorldTest-prod.launch
Memahami kelas pengujian: HelloWorldTest.java
package com.tutorialspoint.client;
import com.tutorialspoint.shared.FieldVerifier;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
/**
* GWT JUnit tests must extend GWTTestCase.
*/
public class HelloWorldTest extends GWTTestCase {
/**
* must refer to a valid module that sources this class.
*/
public String getModuleName() {
return "com.tutorialspoint.HelloWorldJUnit";
}
/**
* tests the FieldVerifier.
*/
public void testFieldVerifier() {
assertFalse(FieldVerifier.isValidName(null));
assertFalse(FieldVerifier.isValidName(""));
assertFalse(FieldVerifier.isValidName("a"));
assertFalse(FieldVerifier.isValidName("ab"));
assertFalse(FieldVerifier.isValidName("abc"));
assertTrue(FieldVerifier.isValidName("abcd"));
}
/**
* this test will send a request to the server using the greetServer
* method in GreetingService and verify the response.
*/
public void testGreetingService() {
/* create the service that we will test. */
GreetingServiceAsync greetingService =
GWT.create(GreetingService.class);
ServiceDefTarget target = (ServiceDefTarget) greetingService;
target.setServiceEntryPoint(GWT.getModuleBaseURL()
+ "helloworld/greet");
/* since RPC calls are asynchronous, we will need to wait
for a response after this test method returns. This line
tells the test runner to wait up to 10 seconds
before timing out. */
delayTestFinish(10000);
/* send a request to the server. */
greetingService.greetServer("GWT User",
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
/* The request resulted in an unexpected error. */
fail("Request failure: " + caught.getMessage());
}
public void onSuccess(String result) {
/* verify that the response is correct. */
assertTrue(result.startsWith("Hello, GWT User!"));
/* now that we have received a response, we need to
tell the test runner that the test is complete.
You must call finishTest() after an asynchronous test
finishes successfully, or the test will time out.*/
finishTest();
}
});
}
}
Poin Penting
Sr.No. | Catatan |
---|---|
1 | Kelas HelloWorldTest dibuat dalam paket com.tutorialspoint.client di bawah direktori HelloWorld / test. |
2 | Kelas HelloWorldTest akan berisi kasus uji unit untuk HelloWorld. |
3 | Kelas HelloWorldTest memperluas kelas GWTTestCase dalam paket com.google.gwt.junit.client. |
4 | Kelas HelloWorldTest memiliki metode abstrak (getModuleName) yang harus mengembalikan nama modul GWT. Untuk HelloWorld, ini adalah com.tutorialspoint.HelloWorldJUnit. |
5 | Kelas HelloWorldTest dibuat dengan dua contoh kasus uji testFieldVerifier, testSimple. Kami telah menambahkan testGreetingService. |
6 | Metode ini menggunakan salah satu dari banyak fungsi assert * yang diwarisi dari kelas JUnit Assert, yang merupakan leluhur GWTTestCase. |
7 | Fungsi assertTrue (boolean) menegaskan bahwa argumen boolean yang diteruskan mengevaluasi ke true. Jika tidak, pengujian akan gagal saat dijalankan di JUnit. |
GWT - Contoh Integrasi JUnit Lengkap
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk menunjukkan contoh JUnit Integration di GWT.
Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di atas -
Langkah | Deskripsi |
---|---|
1 | Impor proyek dengan nama HelloWorld in eclipse menggunakan import project wizard yang ada (File → Impor → Umum → Proyek yang Ada ke dalam ruang kerja). |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah struktur proyek dalam gerhana.
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>JUnit Integration Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Ganti konten HelloWorld.java di src/com.tutorialspoint/client paket dengan berikut ini
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 {
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){
Window.alert(getGreeting(txtName.getValue()));
}
}
});
Label lblName = new Label("Enter your name: ");
Button buttonMessage = new Button("Click Me!");
buttonMessage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert(getGreeting(txtName.getValue()));
}
});
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);
}
public String getGreeting(String name){
return "Hello "+name+"!";
}
}
Ganti konten HelloWorldTest.java di test/com.tutorialspoint/client paket dengan berikut ini
package com.tutorialspoint.client;
import com.tutorialspoint.shared.FieldVerifier;
import com.google.gwt.core.client.GWT;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
/**
* GWT JUnit tests must extend GWTTestCase.
*/
public class HelloWorldTest extends GWTTestCase {
/**
* must refer to a valid module that sources this class.
*/
public String getModuleName() {
return "com.tutorialspoint.HelloWorldJUnit";
}
/**
* tests the FieldVerifier.
*/
public void testFieldVerifier() {
assertFalse(FieldVerifier.isValidName(null));
assertFalse(FieldVerifier.isValidName(""));
assertFalse(FieldVerifier.isValidName("a"));
assertFalse(FieldVerifier.isValidName("ab"));
assertFalse(FieldVerifier.isValidName("abc"));
assertTrue(FieldVerifier.isValidName("abcd"));
}
/**
* this test will send a request to the server using the greetServer
* method in GreetingService and verify the response.
*/
public void testGreetingService() {
/* create the service that we will test. */
GreetingServiceAsync greetingService =
GWT.create(GreetingService.class);
ServiceDefTarget target = (ServiceDefTarget) greetingService;
target.setServiceEntryPoint(GWT.getModuleBaseURL()
+ "helloworld/greet");
/* since RPC calls are asynchronous, we will need to wait
for a response after this test method returns. This line
tells the test runner to wait up to 10 seconds
before timing out. */
delayTestFinish(10000);
/* send a request to the server. */
greetingService.greetServer("GWT User",
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
/* The request resulted in an unexpected error. */
fail("Request failure: " + caught.getMessage());
}
public void onSuccess(String result) {
/* verify that the response is correct. */
assertTrue(result.startsWith("Hello, GWT User!"));
/* now that we have received a response, we need to
tell the test runner that the test is complete.
You must call finishTest() after an asynchronous test
finishes successfully, or the test will time out.*/
finishTest();
}
});
/**
* tests the getGreeting method.
*/
public void testGetGreeting() {
HelloWorld helloWorld = new HelloWorld();
String name = "Robert";
String expectedGreeting = "Hello "+name+"!";
assertEquals(expectedGreeting,helloWorld.getGreeting(name));
}
}
}
Jalankan kasus uji di Eclipse menggunakan konfigurasi peluncuran yang dihasilkan
Kami akan menjalankan pengujian unit di Eclipse menggunakan konfigurasi peluncuran yang dihasilkan oleh webAppCreator untuk mode pengembangan dan mode produksi.
Jalankan pengujian JUnit dalam mode pengembangan
- Dari bilah menu Eclipse, pilih Run → Run Configurations ...
- Di bawah bagian JUnit, pilih HelloWorldTest-dev
- Untuk menyimpan perubahan pada Argumen, tekan Apply
- Untuk menjalankan pengujian, tekan Jalankan
Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Jalankan pengujian JUnit dalam mode produksi
- Dari bilah menu Eclipse, pilih Run → Run Configurations ...
- Di bawah bagian JUnit, pilih HelloWorldTest-prod
- Untuk menyimpan perubahan pada Argumen, tekan Apply
- Untuk menjalankan pengujian, tekan Jalankan
Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
GWT memberikan kemampuan yang sangat baik untuk men-debug sisi klien serta kode sisi server.
Selama mode pengembangan, Aplikasi GWT berbasis kode Java dan tidak diterjemahkan ke JavaScript.
Saat aplikasi berjalan dalam mode pengembangan, Java Virtual Machine (JVM) sebenarnya menjalankan kode aplikasi sebagai bytecode Java yang dikompilasi, menggunakan kemampuan GWT untuk menyambung ke jendela browser.
GWT menggunakan plugin berbasis browser untuk terhubung ke JVM.
Jadi, pengembang bebas menggunakan IDE berbasis Java apa pun untuk men-debug Kode GWT sisi klien serta kode sisi server.
Dalam artikel ini, kami akan mendemonstrasikan penggunaan debugging kode Klien GWT menggunakan Eclipse. Kami akan melakukan tugas-tugas berikut -
- Tetapkan break point dalam kode dan lihat di BreakPoint Explorer.
- Langkah melalui kode baris demi baris selama debugging.
- Lihat nilai variabel.
- Periksa nilai semua variabel.
- Periksa nilai ekspresi.
- Tampilkan bingkai tumpukan untuk benang yang ditangguhkan.
Contoh Debugging
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk mendemonstrasikan debugging aplikasi GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
.gwt-Label{
font-size: 150%;
font-weight: bold;
color:red;
padding:5px;
margin:5px;
}
Berikut adalah konten dari file host HTML yang dimodifikasi war/HelloWorld.html untuk mengakomodasi dua tombol.
<html>
<head>
<title>Hello World</title>
<link rel = "stylesheet" href = "HelloWorld.css"/>
<script language = "javascript" src = "helloworld/helloworld.nocache.js">
</script>
</head>
<body>
<h1>Debugging Application Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java yang dengannya kami akan mendemonstrasikan kemampuan debugging Kode GWT.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
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.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 {
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){
Window.alert(getGreeting(txtName.getValue()));
}
}
});
Label lblName = new Label("Enter your name: ");
Button buttonMessage = new Button("Click Me!");
buttonMessage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert(getGreeting(txtName.getValue()));
}});
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);
}
public String getGreeting(String name){
return "Hello "+name+"!";
}
}
Langkah 1 - Tempatkan BreakPoints
Tempatkan breakpoint di baris pertama onModuleLoad() dari HelloWorld.java
Langkah 2 - Aplikasi Debug
Sekarang klik
Jika semuanya baik-baik saja, Anda harus melihat Mode Pengembangan GWT aktif di Eclipse yang berisi URL seperti yang ditunjukkan di bawah ini. Klik dua kali URL untuk membuka aplikasi GWT.
Segera setelah Aplikasi diluncurkan, Anda akan melihat fokus pada titik putus Eclipse karena kami telah menempatkan titik putus pada baris pertama metode titik masuk.
Anda dapat melihat stacktrace untuk utas yang ditangguhkan.
Anda dapat melihat nilai ekspresi.
Anda dapat melihat daftar breakpoints ditempatkan.
Sekarang terus tekan F6 hingga Anda mencapai baris terakhir metode onModuleLoad (). Sebagai referensi untuk tombol fungsi, F6 memeriksa kode baris demi baris, F5 melangkah lebih jauh dan F8 akan melanjutkan aplikasi. Sekarang Anda dapat melihat daftar nilai semua variabel metode onModuleLoad ().
Kode klien GWT dapat di-debug dengan cara yang sama seperti Aplikasi Java dapat di-debug. Tempatkan breakpoint ke baris mana pun dan mainkan dengan kemampuan debugging GWT.
GWT menyediakan tiga cara untuk menginternasionalkan aplikasi GWT, Kami akan mendemonstrasikan penggunaan Internasionalisasi String Statis yang paling umum digunakan di antara proyek.
Sr.No. | Teknik & Deskripsi |
---|---|
1 | Static String Internationalization Teknik ini paling umum dan memerlukan sedikit biaya tambahan saat runtime; adalah teknik yang sangat efisien untuk menerjemahkan string konstan dan berparameter; paling sederhana untuk diterapkan. Internasionalisasi string statis menggunakan file properti Java standar untuk menyimpan string yang diterjemahkan dan pesan berparameter, dan antarmuka Java yang diketik dengan kuat dibuat untuk mengambil nilainya. |
2 | Dynamic String Internationalization Teknik ini sangat fleksibel tetapi lebih lambat dari internasionalisasi string statis. Halaman host berisi string yang dilokalkan oleh karena itu, aplikasi tidak perlu dikompilasi ulang saat kita menambahkan lokal baru. Jika aplikasi GWT akan diintegrasikan dengan sistem lokalisasi sisi server yang ada, maka teknik ini akan digunakan. |
3 | Localizable Interface Teknik ini adalah yang paling kuat di antara ketiga teknik tersebut. Menerapkan Localizable memungkinkan kita membuat versi jenis kustom yang dilokalkan. Ini adalah teknik internasionalisasi tingkat lanjut. |
Alur Kerja Internasionalisasi Aplikasi GWT
Langkah 1 - Buat file properti
Buat file properti yang berisi pesan untuk digunakan dalam aplikasi. Kami telah membuatHelloWorldMessages.properties mengajukan dalam contoh kami.
enterName = Enter your name
clickMe = Click Me
applicationTitle = Application Internationalization Demonstration
greeting = Hello {0}
Buat file properti yang berisi nilai terjemahan khusus untuk lokal. Kami telah membuatHelloWorldMessages_de.propertiesmengajukan dalam contoh kami. File ini berisi terjemahan dalam bahasa jerman. _de menentukan lokal jerman dan kami akan mendukung bahasa jerman di aplikasi kami.
Jika Anda membuat file properti menggunakan Eclipse, ubah encoding file menjadi UTF-8. Pilih file, lalu klik kanan di dalamnya untuk membuka jendela propertinya, lalu pilih Text file encoding as Other UTF-8. Terapkan dan Simpan perubahan.
enterName = Geben Sie Ihren Namen
clickMe = Klick mich
applicationTitle = Anwendung Internationalisierung Demonstration
greeting = Hallo {0}
Langkah 2 - Tambahkan modul i18n ke File XML Descriptor Modul
Perbarui file modul HelloWorld.gwt.xml untuk menyertakan dukungan untuk bahasa Jerman
<?xml version = "1.0" encoding = "UTF-8"?>
<module rename-to = 'helloworld'>
...
<extend-property name = "locale" values="de" />
...
</module>
Langkah 3 - Buat Antarmuka yang setara dengan file properti
Buat antarmuka HelloWorldMessages.java dengan memperluas antarmuka Pesan dari GWT untuk menyertakan dukungan untuk internalisasi. Ini harus berisi nama metode yang sama seperti kunci dalam file properti. Placeholder akan diganti dengan argumen String.
public interface HelloWorldMessages extends Messages {
@DefaultMessage("Enter your name")
String enterName();
@DefaultMessage("Click Me")
String clickMe();
@DefaultMessage("Application Internalization Demonstration")
String applicationTitle();
@DefaultMessage("Hello {0}")
String greeting(String name);
}
Langkah 4 - Gunakan Antarmuka Pesan di komponen UI.
Gunakan objek HelloWorldMessages di HelloWorld untuk mendapatkan pesannya.
public class HelloWorld implements EntryPoint {
/* create an object of HelloWorldMessages interface
using GWT.create() method */
private HelloWorldMessages messages =
GWT.create(HelloWorldMessages.class);
public void onModuleLoad() {
...
Label titleLabel = new Label(messages.applicationTitle());
//Add title to the application
RootPanel.get("gwtAppTitle").add(titleLabel);
...
}
}
Internasionalisasi - Contoh Lengkap
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk mendemonstrasikan kemampuan Internasionalisasi aplikasi GWT.
Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- Specify the app entry point class. -->
<entry-point class = 'com.tutorialspoint.client.HelloWorld'/>
<extend-property name = "locale" values="de" />
<!-- Specify the paths for translatable code -->
<source path = 'client'/>
<source path = 'shared'/>
</module>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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 id = "gwtAppTitle"></h1>
<div id = "gwtContainer"></div>
</body>
</html>
Sekarang buat file HelloWorldMessages.properties di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
enterName = Enter your name
clickMe = Click Me
applicationTitle = Application Internationalization Demonstration
greeting = Hello {0}
Sekarang buat file HelloWorldMessages_de.properties di src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
enterName = Geben Sie Ihren Namen
clickMe = Klick mich
applicationTitle = Anwendung Internationalisierung Demonstration
greeting = Hallo {0}
Sekarang buat kelas HelloWorldMessages.java di file src/com.tutorialspoint/client paket dan tempatkan konten berikut di dalamnya
package com.tutorialspoint.client;
import com.google.gwt.i18n.client.Messages;
public interface HelloWorldMessages extends Messages {
@DefaultMessage("Enter your name")
String enterName();
@DefaultMessage("Click Me")
String clickMe();
@DefaultMessage("Application Internationalization Demonstration")
String applicationTitle();
@DefaultMessage("Hello {0}")
String greeting(String name);
}
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java menggunakan yang kami akan menunjukkan kemampuan Internasionalisasi Kode GWT.
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.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 {
/* create an object of HelloWorldMessages interface
using GWT.create() method */
private HelloWorldMessages messages =
GWT.create(HelloWorldMessages.class);
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){
Window.alert(getGreeting(txtName.getValue()));
}
}
});
Label lblName = new Label(messages.enterName() + ": ");
Button buttonMessage = new Button(messages.clickMe() + "!");
buttonMessage.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert(getGreeting(txtName.getValue()));
}
});
HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(lblName);
hPanel.add(txtName);
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);
Label titleLabel = new Label(messages.applicationTitle());
//Add title to the application
RootPanel.get("gwtAppTitle").add(titleLabel);
// Add widgets to the root panel.
RootPanel.get("gwtContainer").add(panel);
}
public String getGreeting(String name){
return messages.greeting(name + "!");
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Sekarang perbarui URL untuk memuat URL locale = de.Set - http://127.0.0.1:8888/HelloWorld.html?gwt.codesvr=127.0.0.1:9997&locale=de. Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Aplikasi GWT biasanya merupakan aplikasi satu halaman yang menjalankan JavaScripts dan tidak berisi banyak halaman sehingga browser tidak melacak interaksi pengguna dengan Aplikasi. Untuk menggunakan fungsi riwayat browser, aplikasi harus menghasilkan fragmen URL unik untuk setiap halaman yang dapat dinavigasi.
GWT menyediakan History Mechanism untuk menangani situasi ini.
GWT menggunakan istilah tokenyang hanya berupa string yang dapat diurai oleh aplikasi untuk kembali ke status tertentu. Aplikasi akan menyimpan token ini dalam riwayat browser sebagai fragmen URL.
Misalnya, token riwayat bernama "pageIndex1" akan ditambahkan ke URL sebagai berikut -
http://www.tutorialspoint.com/HelloWorld.html#pageIndex0
Alur Kerja Manajemen Sejarah
Langkah 1 - Aktifkan dukungan Sejarah
Untuk menggunakan dukungan Riwayat GWT, pertama-tama kita harus menyematkan iframe berikut ke halaman HTML host kita.
<iframe src = "javascript:''"
id = "__gwt_historyFrame"
style = "width:0;height:0;border:0"></iframe>
Langkah 2 - Tambahkan token ke Riwayat
Berikut contoh statistik bagaimana menambahkan token ke riwayat browser
int index = 0;
History.newItem("pageIndex" + index);
Langkah 3 - Ambil token dari History
Saat pengguna menggunakan tombol kembali / maju di browser, kami akan mengambil token dan memperbarui status aplikasi kami.
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
String historyToken = event.getValue();
/* parse the history token */
try {
if (historyToken.substring(0, 9).equals("pageIndex")) {
String tabIndexToken = historyToken.substring(9, 10);
int tabIndex = Integer.parseInt(tabIndexToken);
/* select the specified tab panel */
tabPanel.selectTab(tabIndex);
} else {
tabPanel.selectTab(0);
}
} catch (IndexOutOfBoundsException e) {
tabPanel.selectTab(0);
}
}
});
Sekarang mari kita lihat Kelas Sejarah beraksi.
Kelas Sejarah - Contoh Lengkap
Contoh ini akan memandu Anda melalui langkah-langkah sederhana untuk mendemonstrasikan Manajemen Riwayat aplikasi GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>
<iframe src = "javascript:''"id = "__gwt_historyFrame"
style = "width:0;height:0;border:0"></iframe>
<h1> History Class Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java menggunakan mana kami akan menunjukkan Manajemen Sejarah dalam GWT Code.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
public class HelloWorld implements EntryPoint {
/**
* This is the entry point method.
*/
public void onModuleLoad() {
/* create a tab panel to carry multiple pages */
final TabPanel tabPanel = new TabPanel();
/* create pages */
HTML firstPage = new HTML("<h1>We are on first Page.</h1>");
HTML secondPage = new HTML("<h1>We are on second Page.</h1>");
HTML thirdPage = new HTML("<h1>We are on third Page.</h1>");
String firstPageTitle = "First Page";
String secondPageTitle = "Second Page";
String thirdPageTitle = "Third Page";
tabPanel.setWidth("400");
/* add pages to tabPanel*/
tabPanel.add(firstPage, firstPageTitle);
tabPanel.add(secondPage,secondPageTitle);
tabPanel.add(thirdPage, thirdPageTitle);
/* add tab selection handler */
tabPanel.addSelectionHandler(new SelectionHandler<Integer>() {
@Override
public void onSelection(SelectionEvent<Integer> event) {
/* add a token to history containing pageIndex
History class will change the URL of application
by appending the token to it.
*/
History.newItem("pageIndex" + event.getSelectedItem());
}
});
/* add value change handler to History
this method will be called, when browser's
Back button or Forward button are clicked
and URL of application changes.
*/
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
String historyToken = event.getValue();
/* parse the history token */
try {
if (historyToken.substring(0, 9).equals("pageIndex")) {
String tabIndexToken = historyToken.substring(9, 10);
int tabIndex = Integer.parseInt(tabIndexToken);
/* select the specified tab panel */
tabPanel.selectTab(tabIndex);
} else {
tabPanel.selectTab(0);
}
} catch (IndexOutOfBoundsException e) {
tabPanel.selectTab(0);
}
}
});
/* select the first tab by default */
tabPanel.selectTab(0);
/* add controls to RootPanel */
RootPanel.get().add(tabPanel);
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Sekarang klik pada setiap tab untuk memilih halaman yang berbeda.
Anda harus memperhatikan, ketika setiap tab dipilih, url aplikasi berubah dan #pageIndex ditambahkan ke url.
Anda juga dapat melihat bahwa tombol kembali dan maju browser diaktifkan sekarang.
Gunakan tombol kembali dan maju dari browser dan Anda akan melihat tab yang berbeda dipilih sesuai.
GWT mendukung manajemen riwayat browser menggunakan kelas Sejarah yang dapat Anda rujuk ke GWT - bab Kelas Sejarah .
GWT menggunakan istilah tokenyang hanya berupa string yang dapat diurai oleh aplikasi untuk kembali ke status tertentu. Aplikasi akan menyimpan token ini dalam riwayat browser sebagai fragmen URL.
Di GWT - bab History Class , kami menangani pembuatan token dan pengaturan di history dengan menulis kode.
Pada artikel ini, kita akan membahas widget khusus Hyperlink yang melakukan pembuatan token dan manajemen riwayat untuk kita secara otomatis dan memberikan kemampuan aplikasi untuk bookmark.
Contoh Bookmarking
Contoh ini akan membawa Anda melalui langkah-langkah sederhana untuk mendemonstrasikan Bookmarking dari aplikasi GWT.
Berikut langkah-langkah untuk mengupdate aplikasi GWT yang kita buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<!-- 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>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>
<iframe src = "javascript:''"id = "__gwt_historyFrame"
style = "width:0;height:0;border:0"></iframe>
<h1> Bookmarking Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java menggunakan mana kami akan mendemonstrasikan Bookmarking dalam GWT Code.
package com.tutorialspoint.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
public class HelloWorld implements EntryPoint {
private TabPanel tabPanel;
private void selectTab(String historyToken){
/* parse the history token */
try {
if (historyToken.substring(0, 9).equals("pageIndex")) {
String tabIndexToken = historyToken.substring(9, 10);
int tabIndex = Integer.parseInt(tabIndexToken);
/* Select the specified tab panel */
tabPanel.selectTab(tabIndex);
} else {
tabPanel.selectTab(0);
}
} catch (IndexOutOfBoundsException e) {
tabPanel.selectTab(0);
}
}
/**
* This is the entry point method.
*/
public void onModuleLoad() {
/* create a tab panel to carry multiple pages */
tabPanel = new TabPanel();
/* create pages */
HTML firstPage = new HTML("<h1>We are on first Page.</h1>");
HTML secondPage = new HTML("<h1>We are on second Page.</h1>");
HTML thirdPage = new HTML("<h1>We are on third Page.</h1>");
String firstPageTitle = "First Page";
String secondPageTitle = "Second Page";
String thirdPageTitle = "Third Page";
Hyperlink firstPageLink = new Hyperlink("1", "pageIndex0");
Hyperlink secondPageLink = new Hyperlink("2", "pageIndex1");
Hyperlink thirdPageLink = new Hyperlink("3", "pageIndex2");
HorizontalPanel linksHPanel = new HorizontalPanel();
linksHPanel.setSpacing(10);
linksHPanel.add(firstPageLink);
linksHPanel.add(secondPageLink);
linksHPanel.add(thirdPageLink);
/* If the application starts with no history token,
redirect to a pageIndex0 */
String initToken = History.getToken();
if (initToken.length() == 0) {
History.newItem("pageIndex0");
initToken = "pageIndex0";
}
tabPanel.setWidth("400");
/* add pages to tabPanel*/
tabPanel.add(firstPage, firstPageTitle);
tabPanel.add(secondPage,secondPageTitle);
tabPanel.add(thirdPage, thirdPageTitle);
/* add value change handler to History
* this method will be called, when browser's Back button
* or Forward button are clicked.
* and URL of application changes.
* */
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
selectTab(event.getValue());
}
});
selectTab(initToken);
VerticalPanel vPanel = new VerticalPanel();
vPanel.setSpacing(10);
vPanel.add(tabPanel);
vPanel.add(linksHPanel);
/* add controls to RootPanel */
RootPanel.get().add(vPanel);
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Sekarang klik 1, 2 atau 3. Anda dapat melihat bahwa tab berubah dengan indeks.
Anda harus memperhatikan, ketika Anda mengklik 1,2 atau 3, url aplikasi berubah dan #pageIndex ditambahkan ke url
Anda juga dapat melihat bahwa tombol kembali dan maju browser diaktifkan sekarang.
Gunakan tombol kembali dan maju dari browser dan Anda akan melihat tab yang berbeda dipilih sesuai.
Klik Kanan pada 1, 2 atau 3. Anda dapat melihat opsi seperti buka, buka di jendela baru, buka di tab baru, tambahkan ke favorit, dll.
Klik kanan pada 3. Pilih tambahkan ke favorit. Simpan bookmark sebagai halaman 3.
Buka favorit dan pilih halaman 3. Anda akan melihat tab ketiga dipilih.
Kerangka kerja logging mengemulasi java.util.logging, sehingga menggunakan sintaks yang sama dan memiliki perilaku yang sama seperti kode logging sisi server
GWT logging dikonfigurasi menggunakan file .gwt.xml.
Kami dapat mengkonfigurasi logging untuk diaktifkan / dinonaktifkan; kita dapat mengaktifkan / menonaktifkan penangan tertentu, dan mengubah tingkat pencatatan default.
Jenis Logger
Penebang diatur dalam struktur pohon, dengan Penebang Akar di akar pohon.
Nama logger menentukan hubungan Induk / Anak menggunakan . untuk memisahkan bagian dari nama.
Sebagai contoh jika kita memiliki dua pembalak Hospital.room1 dan Hospital.room2, maka mereka bersaudara, dengan orang tua pembalak bernama Hospital. Logger Rumah Sakit (dan setiap logger dengan nama yang tidak mengandung titik ".") Memiliki Root Logger sebagai induk.
private static Logger room1Logger = Logger.getLogger("Hospital.room1");
private static Logger room2Logger = Logger.getLogger("Hospital.room2");
private static Logger hospitalLogger = Logger.getLogger("Hospital");
private static Logger rootLogger = Logger.getLogger("");
Penangan Log
GWT menyediakan penangan default yang akan menampilkan entri log yang dibuat menggunakan penebang.
Penangan | Masuk ke | Deskripsi |
---|---|---|
SystemLogHandler | stdout | Pesan ini hanya dapat dilihat dalam Mode Pengembangan di jendela DevMode. |
DevelopmentModeLogHandler | Jendela DevMode | Log dengan memanggil metode GWT.log. Pesan ini hanya dapat dilihat dalam Mode Pengembangan di jendela DevMode. |
ConsoleLogHandler | konsol javascript | Log ke konsol javascript, yang digunakan oleh Firebug Lite (untuk IE), Safari, dan Chrome. |
FirebugLogHandler | Pembakar | Log ke konsol firebug. |
PopupLogHandler | muncul | Log ke munculan yang berada di sudut kiri atas aplikasi saat penangan ini diaktifkan. |
SimpleRemoteLogHandler | server | Penangan ini mengirimkan pesan log ke server, di mana pesan tersebut akan dicatat menggunakan mekanisme logging sisi server. |
Konfigurasi Logging di Aplikasi GWT
File HelloWorld.gwt.xml harus dikonfigurasi untuk mengaktifkan pencatatan GWT sebagai berikut -
# add logging module
<inherits name = "com.google.gwt.logging.Logging"/>
# To change the default logLevel
<set-property name = "gwt.logging.logLevel" value = "SEVERE"/>
# To enable logging
<set-property name = "gwt.logging.enabled" value = "TRUE"/>
# To disable a popup Handler
<set-property name = "gwt.logging.popupHandler" value = "DISABLED" />
Gunakan pencatat untuk mencatat tindakan pengguna
/* Create Root Logger */
private static Logger rootLogger = Logger.getLogger("");
...
rootLogger.log(Level.SEVERE, "pageIndex selected: " + event.getValue());
...
Contoh Kerangka Kerja Logging
Contoh ini akan membawa Anda melalui langkah-langkah sederhana untuk mendemonstrasikan Kemampuan Logging dari aplikasi GWT. Ikuti langkah-langkah berikut untuk memperbarui aplikasi GWT yang kami buat di GWT - bab Membuat Aplikasi -
Langkah | Deskripsi |
---|---|
1 | Buat proyek dengan nama HelloWorld di bawah paket com.tutorialspoint seperti yang dijelaskan di bab GWT - Membuat Aplikasi . |
2 | Modifikasi HelloWorld.gwt.xml , HelloWorld.css , HelloWorld.html dan HelloWorld.java seperti yang dijelaskan di bawah ini. Jaga file lainnya tidak berubah. |
3 | Kompilasi dan jalankan aplikasi untuk memverifikasi hasil dari logika yang diimplementasikan. |
Berikut adalah isi dari deskriptor modul yang dimodifikasi 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'/>
<inherits name = "com.google.gwt.logging.Logging"/>
<!-- 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'/>
<set-property name = "gwt.logging.logLevel" value="SEVERE"/>
<set-property name = "gwt.logging.enabled" value = "TRUE"/>
<set-property name = "gwt.logging.popupHandler" value= "DISABLED" />
</module>
Berikut ini adalah konten file Style Sheet yang dimodifikasi 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;
}
Berikut adalah konten dari file host HTML yang dimodifikasi 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>
<iframe src = "javascript:''"id = "__gwt_historyFrame"
style = "width:0;height:0;border:0"></iframe>
<h1> Logging Demonstration</h1>
<div id = "gwtContainer"></div>
</body>
</html>
Mari kita ikuti konten file Java berikut src/com.tutorialspoint/HelloWorld.java menggunakan mana kami akan mendemonstrasikan Bookmarking dalam GWT Code.
package com.tutorialspoint.client;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.logging.client.HasWidgetsLogHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Hyperlink;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
public class HelloWorld implements EntryPoint {
private TabPanel tabPanel;
/* Create Root Logger */
private static Logger rootLogger = Logger.getLogger("");
private VerticalPanel customLogArea;
private void selectTab(String historyToken){
/* parse the history token */
try {
if (historyToken.substring(0, 9).equals("pageIndex")) {
String tabIndexToken = historyToken.substring(9, 10);
int tabIndex = Integer.parseInt(tabIndexToken);
/* Select the specified tab panel */
tabPanel.selectTab(tabIndex);
} else {
tabPanel.selectTab(0);
}
} catch (IndexOutOfBoundsException e) {
tabPanel.selectTab(0);
}
}
/**
* This is the entry point method.
*/
public void onModuleLoad() {
/* create a tab panel to carry multiple pages */
tabPanel = new TabPanel();
/* create pages */
HTML firstPage = new HTML("<h1>We are on first Page.</h1>");
HTML secondPage = new HTML("<h1>We are on second Page.</h1>");
HTML thirdPage = new HTML("<h1>We are on third Page.</h1>");
String firstPageTitle = "First Page";
String secondPageTitle = "Second Page";
String thirdPageTitle = "Third Page";
Hyperlink firstPageLink = new Hyperlink("1", "pageIndex0");
Hyperlink secondPageLink = new Hyperlink("2", "pageIndex1");
Hyperlink thirdPageLink = new Hyperlink("3", "pageIndex2");
HorizontalPanel linksHPanel = new HorizontalPanel();
linksHPanel.setSpacing(10);
linksHPanel.add(firstPageLink);
linksHPanel.add(secondPageLink);
linksHPanel.add(thirdPageLink);
/* If the application starts with no history token,
redirect to a pageIndex0 */
String initToken = History.getToken();
if (initToken.length() == 0) {
History.newItem("pageIndex0");
initToken = "pageIndex0";
}
tabPanel.setWidth("400");
/* add pages to tabPanel*/
tabPanel.add(firstPage, firstPageTitle);
tabPanel.add(secondPage,secondPageTitle);
tabPanel.add(thirdPage, thirdPageTitle);
/* add value change handler to History
* this method will be called, when browser's Back button
* or Forward button are clicked.
* and URL of application changes.
* */
History.addValueChangeHandler(new ValueChangeHandler<String>() {
@Override
public void onValueChange(ValueChangeEvent<String> event) {
selectTab(event.getValue());
rootLogger.log(Level.SEVERE, "pageIndex selected: "
+ event.getValue());
}
});
selectTab(initToken);
VerticalPanel vPanel = new VerticalPanel();
vPanel.setSpacing(10);
vPanel.add(tabPanel);
vPanel.add(linksHPanel);
customLogArea = new VerticalPanel();
vPanel.add(customLogArea);
/* an example of using own custom logging area. */
rootLogger.addHandler(new HasWidgetsLogHandler(customLogArea));
/* add controls to RootPanel */
RootPanel.get().add(vPanel);
}
}
Setelah Anda siap dengan semua perubahan yang dilakukan, mari kita kompilasi dan jalankan aplikasi dalam mode pengembangan seperti yang kita lakukan di bab GWT - Membuat Aplikasi . Jika semuanya baik-baik saja dengan aplikasi Anda, ini akan menghasilkan hasil sebagai berikut -
Sekarang klik 1, 2 atau 3. Anda dapat melihat, ketika Anda mengklik 1,2 atau 3, Anda dapat melihat log sedang dicetak menampilkan pageIndex. Periksa output Konsol di Eclipse. Anda juga dapat melihat log dicetak di konsol Eclipse.
Fri Aug 31 11:42:35 IST 2012
SEVERE: pageIndex selected: pageIndex0
Fri Aug 31 11:42:37 IST 2012
SEVERE: pageIndex selected: pageIndex1
Fri Aug 31 11:42:38 IST 2012
SEVERE: pageIndex selected: pageIndex2
Fri Aug 31 11:42:40 IST 2012
SEVERE: pageIndex selected: pageIndex0
Fri Aug 31 11:42:41 IST 2012
SEVERE: pageIndex selected: pageIndex1
Fri Aug 31 11:42:41 IST 2012
SEVERE: pageIndex selected: pageIndex2
Sekarang perbarui deskriptor modul src/com.tutorialspoint/HelloWorld.gwt.xml untuk mengaktifkan popupHandler.
<?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'/>
<inherits name = "com.google.gwt.logging.Logging"/>
<!-- 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'/>
<set-property name = "gwt.logging.logLevel" value = "SEVERE"/>
<set-property name = "gwt.logging.enabled" value = "TRUE"/>
<set-property name="gwt.logging.popupHandler" value = "ENABLED" />
</module>
Setelah Anda siap dengan semua perubahan yang dilakukan, muat ulang aplikasi dengan menyegarkan jendela browser (tekan F5 / tombol muat ulang browser). Perhatikan jendela popup sekarang di sudut kiri atas aplikasi.
Sekarang klik 1, 2 atau 3. Anda dapat melihat, ketika Anda mengklik 1,2 atau 3, Anda dapat melihat log sedang dicetak menampilkan pageIndex di jendela popup.