GWT - คู่มือฉบับย่อ

GWT คืออะไร?

Google Web Toolkit (GWT) เป็นชุดเครื่องมือสำหรับการพัฒนาเพื่อสร้าง RICH Internet Applications (RIA). นี่คือคุณสมบัติเด่นบางประการ -

  • GWT ให้ตัวเลือกนักพัฒนาในการเขียนแอปพลิเคชันฝั่งไคลเอ็นต์ใน JAVA

  • GWT รวบรวมโค้ดที่เขียนด้วย JAVA เป็นโค้ด JavaScript

  • แอปพลิเคชันที่เขียนด้วย GWT เป็นไปตามข้อกำหนดข้ามเบราว์เซอร์ GWT จะสร้างโค้ดจาวาสคริปต์ที่เหมาะสมกับแต่ละเบราว์เซอร์โดยอัตโนมัติ

  • GWT เป็นโอเพนซอร์สฟรีและใช้งานโดยนักพัฒนาหลายพันคนทั่วโลก ได้รับอนุญาตภายใต้ Apache License เวอร์ชัน 2.0

โดยรวมแล้ว GWT คือไฟล์ framework เพื่อสร้างแอปพลิเคชั่นเว็บขนาดใหญ่และมีประสิทธิภาพสูงในขณะที่ดูแลรักษาง่าย

ทำไมต้องใช้ GWT?

เมื่อใช้ Java คุณสามารถใช้ JAVA IDE เช่น Eclipse เพื่อพัฒนาแอปพลิเคชัน GWT

นักพัฒนาสามารถใช้การเติมโค้ดอัตโนมัติ / การปรับโครงสร้าง / การนำทาง / การจัดการโครงการและคุณสมบัติทั้งหมดของ IDEs GWT ซึ่งให้ความสามารถในการดีบักเต็มรูปแบบ นักพัฒนาสามารถดีบักแอปพลิเคชันฝั่งไคลเอ็นต์ได้เช่นเดียวกับ Java Application

  • GWT ให้การทำงานร่วมกับ Junit และ Maven อย่างง่ายดาย

  • อีกครั้งที่ใช้ Java GWT มีช่วงการเรียนรู้ต่ำสำหรับ Java Developers

  • GWT สร้างโค้ดจาวาสคริปต์ที่ปรับให้เหมาะสมสร้างโค้ดจาวาสคริปต์เฉพาะของเบราว์เซอร์ด้วยตัวเอง

  • GWT มีไลบรารีวิดเจ็ตให้งานส่วนใหญ่ที่จำเป็นในแอปพลิเคชัน

  • GWT สามารถขยายได้และสามารถสร้างวิดเจ็ตแบบกำหนดเองเพื่อตอบสนองความต้องการของแอปพลิเคชัน

เหนือสิ่งอื่นใดแอปพลิเคชัน GWT สามารถทำงานบนเบราว์เซอร์และสมาร์ทโฟนหลัก ๆ ทั้งหมดรวมถึงโทรศัพท์ / แท็บเล็ตที่ใช้ Android และ iOS

ข้อเสียของ GWT

แม้ว่า GWT จะมีข้อดีมากมาย แต่ก็มีข้อเสียดังต่อไปนี้ -

  • Not Indexable - หน้าเว็บที่สร้างโดย GWT จะไม่ถูกสร้างดัชนีโดยเครื่องมือค้นหาเนื่องจากแอปพลิเคชันเหล่านี้สร้างขึ้นแบบไดนามิก

  • Not Degradable - หากผู้ใช้แอปพลิเคชันของคุณปิดการใช้งาน Javascript ผู้ใช้จะเห็นหน้าพื้นฐานและไม่มีอะไรเพิ่มเติม

  • Not Designer's Friendly - GWT ไม่เหมาะสำหรับนักออกแบบเว็บที่ชอบใช้ HTML ธรรมดากับตัวยึดตำแหน่งเพื่อแทรกเนื้อหาแบบไดนามิกในเวลาต่อมา

ส่วนประกอบ GWT

กรอบงาน GWT สามารถแบ่งออกเป็นสามส่วนใหญ่ ๆ ดังต่อไปนี้ -

  • GWT Java to JavaScript compiler- นี่เป็นส่วนที่สำคัญที่สุดของ GWT ซึ่งทำให้เป็นเครื่องมือที่มีประสิทธิภาพในการสร้าง RIA คอมไพเลอร์ GWT ใช้ในการแปลโค้ดแอปพลิเคชันทั้งหมดที่เขียนใน Java เป็น JavaScript

  • JRE Emulation library- Google Web Toolkit มีไลบรารีที่เลียนแบบไลบรารีรันไทม์ Java ส่วนย่อย รายการประกอบด้วย java.lang, java.lang.annotation, java.math, java.io, java.sql, java.util และ java.util.logging

  • GWT UI building library - ส่วนนี้ของ GWT ประกอบด้วยส่วนย่อยมากมายซึ่งรวมถึงส่วนประกอบ UI จริงการรองรับ RPC การจัดการประวัติและอื่น ๆ อีกมากมาย

GWT ยังมีเว็บเบราว์เซอร์ที่โฮสต์ GWT ซึ่งช่วยให้คุณสามารถเรียกใช้และดำเนินการแอปพลิเคชัน GWT ของคุณในโหมดโฮสต์โดยที่โค้ดของคุณจะทำงานเป็น Java ใน Java Virtual Machine โดยไม่ต้องคอมไพล์เป็น JavaScript

บทช่วยสอนนี้จะแนะนำคุณเกี่ยวกับวิธีการเตรียมสภาพแวดล้อมการพัฒนาเพื่อเริ่มงานกับ GWT Framework บทช่วยสอนนี้จะสอนวิธีตั้งค่า JDK, Tomcat และ Eclipse บนเครื่องของคุณก่อนที่คุณจะติดตั้ง GWT Framework -

ความต้องการของระบบ

GWT ต้องการ JDK 1.6 หรือสูงกว่าดังนั้นข้อกำหนดแรกสุดคือต้องติดตั้ง JDK ในเครื่องของคุณ

JDK 1.6 ขึ้นไป
หน่วยความจำ ไม่มีข้อกำหนดขั้นต่ำ
พื้นที่ดิสก์ ไม่มีข้อกำหนดขั้นต่ำ
ระบบปฏิบัติการ ไม่มีข้อกำหนดขั้นต่ำ

ทำตามขั้นตอนที่กำหนดเพื่อตั้งค่าสภาพแวดล้อมของคุณเพื่อเริ่มการพัฒนาแอปพลิเคชัน GWT

ขั้นตอนที่ 1 - ตรวจสอบการติดตั้ง Java บนเครื่องของคุณ

ตอนนี้เปิดคอนโซลและดำเนินการคำสั่ง java ต่อไปนี้

ระบบปฏิบัติการ งาน คำสั่ง
Windows เปิด Command Console c: \> java - เวอร์ชัน
Linux เปิด Command Terminal $ java - รุ่น
Mac เปิด Terminal เครื่อง: ~ joseph $ java -version

มาตรวจสอบผลลัพธ์ของระบบปฏิบัติการทั้งหมดกัน

ซีเนียร์ OS และเอาต์พุตที่สร้างขึ้น
1

Windows

เวอร์ชัน java "1.6.0_21"

Java (TM) SE Runtime Environment (สร้าง 1.6.0_21-b07)

Java HotSpot (TM) Client VM (build 17.0-b17, โหมดผสม, การแชร์)

2

Linux

เวอร์ชัน java "1.6.0_21"

Java (TM) SE Runtime Environment (สร้าง 1.6.0_21-b07)

ava HotSpot (TM) Client VM (build 17.0-b17, โหมดผสม, การแชร์)

3

Mac

เวอร์ชัน java "1.6.0_21"

Java (TM) SE Runtime Environment (สร้าง 1.6.0_21-b07)

Java HotSpot (TM) 64-Bit Server VM (build 17.0-b17, โหมดผสม, การแชร์)

ขั้นตอนที่ 2 - ตั้งค่า Java Development Kit (JDK)

หากคุณไม่ได้มีการติดตั้ง Java แล้วคุณสามารถติดตั้งซอฟท์แว Java Development Kit (SDK) จากเว็บไซต์ Java ของออราเคิล: Java SE ดาวน์โหลด คุณจะพบคำแนะนำในการติดตั้ง JDK ในไฟล์ที่ดาวน์โหลดทำตามคำแนะนำที่กำหนดเพื่อติดตั้งและกำหนดค่าการตั้งค่า สุดท้ายตั้งค่าตัวแปรสภาพแวดล้อม PATH และ JAVA_HOME เพื่ออ้างถึงไดเร็กทอรีที่มี java และ javac โดยทั่วไปคือ java_install_dir / bin และ java_install_dir ตามลำดับ

ตั้งค่า JAVA_HOMEตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานที่ติดตั้ง Java บนเครื่องของคุณ ตัวอย่างเช่น

ซีเนียร์ ระบบปฏิบัติการและเอาต์พุต
1

Windows

ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_HOME เป็น C: \ Program Files \ Java \ jdk1.6.0_21

2

Linux

ส่งออก JAVA_HOME = / usr / local / java-current

3

Mac

ส่งออก JAVA_HOME = / Library / Java / Home

ผนวกตำแหน่งคอมไพเลอร์ Java เข้ากับ System Path

ซีเนียร์ ระบบปฏิบัติการและเอาต์พุต
1

Windows

ต่อท้ายสตริง% JAVA_HOME% \ bin ต่อท้ายตัวแปรระบบ Path

2

Linux

ส่งออก PATH =$PATH:$JAVA_HOME / bin /

3

Mac

ไม่จำเป็นต้องใช้

หรืออีกวิธีหนึ่งถ้าคุณใช้ Integrated Development Environment (IDE) เช่น Borland JBuilder, Eclipse, IntelliJ IDEA หรือ Sun ONE Studio ให้คอมไพล์และรันโปรแกรมง่ายๆเพื่อยืนยันว่า IDE รู้ตำแหน่งที่คุณติดตั้ง Java หรือทำการตั้งค่าที่เหมาะสมตามเอกสารที่กำหนด ของ IDE

ขั้นตอนที่ 3 - ตั้งค่า Eclipse IDE

ตัวอย่างทั้งหมดในบทช่วยสอนนี้เขียนขึ้นโดยใช้ Eclipse IDE ดังนั้นฉันขอแนะนำให้คุณติดตั้ง Eclipse เวอร์ชันล่าสุดในเครื่องของคุณตามระบบปฏิบัติการของคุณ

ในการติดตั้ง Eclipse IDE ให้ดาวน์โหลดไบนารี Eclipse ล่าสุดจาก https://www.eclipse.org. เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการแจกแจงไบนารีในตำแหน่งที่สะดวก ตัวอย่างเช่นใน C: \ eclipse บน windows หรือ / usr / local / eclipse บน Linux / Unix และสุดท้ายตั้งค่าตัวแปร PATH ให้เหมาะสม

Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง windows หรือคุณสามารถดับเบิลคลิกที่ eclipse.exe

%C:\eclipse\eclipse.exe

Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -

$/usr/local/eclipse/eclipse

หลังจากเริ่มต้นสำเร็จหากทุกอย่างเรียบร้อยดีแล้วควรแสดงผลลัพธ์ดังนี้ -

ขั้นตอนที่ 4 - ติดตั้ง GWT SDK & Plugin สำหรับ Eclipse

ทำตามคำแนะนำที่ให้ไว้ที่ลิงค์Plugin for Eclipse (รวม SDKs)เพื่อติดตั้ง GWT SDK & Plugin for Eclipse เวอร์ชันที่ติดตั้งบนเครื่องของคุณ

หลังจากตั้งค่าปลั๊กอิน GWT สำเร็จแล้วหากทุกอย่างเรียบร้อยดีควรแสดงหน้าจอต่อไปนี้ด้วย Google icon ทำเครื่องหมายด้วยสี่เหลี่ยมผืนผ้าสีแดงดังแสดงด้านล่าง -

ขั้นตอนที่ 5: ตั้งค่า Apache Tomcat

คุณสามารถดาวน์โหลด Tomcat เวอร์ชันล่าสุดได้จาก https://tomcat.apache.org/. เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการแจกแจงไบนารีในตำแหน่งที่สะดวก ตัวอย่างเช่นใน C: \ apache-tomcat-6.0.33 บน windows หรือ /usr/local/apache-tomcat-6.0.33 บน Linux / Unix และตั้งค่าตัวแปรสภาพแวดล้อม CATALINA_HOME ที่ชี้ไปยังตำแหน่งการติดตั้ง

Tomcat สามารถเริ่มต้นได้โดยดำเนินการตามคำสั่งต่อไปนี้บนเครื่อง windows หรือคุณสามารถดับเบิลคลิกที่ startup.bat

%CATALINA_HOME%\bin\startup.bat
or 
/usr/local/apache-tomcat-6.0.33/bin/startup.sh

หลังจากเริ่มต้นสำเร็จเว็บแอปพลิเคชันเริ่มต้นที่มาพร้อมกับ Tomcat จะพร้อมใช้งานโดยไปที่ http://localhost:8080/. หากทุกอย่างเรียบร้อยดีควรแสดงผลลัพธ์ดังนี้ -

ข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่าและการเรียกใช้ Tomcat สามารถพบได้ในเอกสารที่รวมอยู่ที่นี่เช่นเดียวกับในเว็บไซต์ Tomcat - https://tomcat.apache.org/

Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง windows -

%CATALINA_HOME%\bin\shutdown
or
C:\apache-tomcat-5.5.29\bin\shutdown

Tomcat สามารถหยุดได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -

$CATALINA_HOME/bin/shutdown.sh
or
/usr/local/apache-tomcat-5.5.29/bin/shutdown.sh

ก่อนที่เราจะเริ่มสร้างแอปพลิเคชัน "HelloWorld" จริงโดยใช้ GWT ให้เราดูว่าแอปพลิเคชัน GWT มีอะไรบ้าง -

แอปพลิเคชัน GWT ประกอบด้วยส่วนที่สำคัญสี่ส่วนต่อไปนี้ซึ่งส่วนสุดท้ายเป็นทางเลือก แต่จำเป็นต้องมีสามส่วนแรก

  • ตัวบอกโมดูล
  • ทรัพยากรสาธารณะ
  • รหัสฝั่งไคลเอ็นต์
  • รหัสฝั่งเซิร์ฟเวอร์

ตำแหน่งตัวอย่างของส่วนต่างๆของแอปพลิเคชัน gwt ทั่วไป HelloWord จะเป็นดังภาพด้านล่าง -

ชื่อ สถานที่
รากโครงการ สวัสดีชาวโลก/
ตัวบอกโมดูล src / com / tutorialspoint / HelloWorld.gwt.xml
ทรัพยากรสาธารณะ src / com / tutorialspoint / สงคราม /
รหัสฝั่งไคลเอ็นต์ src / com / tutorialspoint / ลูกค้า /
รหัสฝั่งเซิร์ฟเวอร์ src / com / tutorialspoint / เซิร์ฟเวอร์ /

ตัวบอกโมดูล

ตัวบอกโมดูลคือไฟล์คอนฟิกูเรชันในรูปแบบของ XML ซึ่งใช้เพื่อกำหนดค่าแอปพลิเคชัน GWT

นามสกุลไฟล์ตัวอธิบายโมดูลคือ * .gwt.xml โดยที่ * คือชื่อของแอปพลิเคชันและไฟล์นี้ควรอยู่ในรูทของโปรเจ็กต์

ต่อไปนี้จะเป็นตัวบอกโมดูลเริ่มต้น HelloWorld.gwt.xml สำหรับแอปพลิเคชัน HelloWorld -

<?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>

ต่อไปนี้เป็นรายละเอียดโดยย่อเกี่ยวกับส่วนต่างๆที่ใช้ในตัวอธิบายโมดูล

ซีเนียร์ โหนดและคำอธิบาย
1

<module rename-to = "helloworld">

ชื่อนี้ระบุชื่อแอปพลิเคชัน

2

<inherits name = "logical-module-name" />

สิ่งนี้จะเพิ่มโมดูล gwt อื่น ๆ ในแอปพลิเคชันเช่นเดียวกับการนำเข้าในแอปพลิเคชัน java สามารถสืบทอดโมดูลจำนวนเท่าใดก็ได้ในลักษณะนี้

3

<entry-point class = "classname" />

ระบุชื่อคลาสที่จะเริ่มโหลดแอปพลิเคชัน GWT สามารถเพิ่มคลาส entry-point จำนวนเท่าใดก็ได้และจะเรียกตามลำดับตามลำดับที่ปรากฏในไฟล์โมดูล ดังนั้นเมื่อ onModuleLoad () ของจุดเริ่มต้นแรกของคุณเสร็จสิ้นจุดเริ่มต้นถัดไปจะถูกเรียกทันที

4

<source path = "path" />

สิ่งนี้ระบุชื่อของโฟลเดอร์ซอร์สซึ่งคอมไพเลอร์ GWT จะค้นหาการคอมไพล์ซอร์ส

5

<public path = "path" />

เส้นทางสาธารณะคือสถานที่ในโปรเจ็กต์ของคุณซึ่งมีการจัดเก็บทรัพยากรแบบคงที่ที่อ้างอิงโดยโมดูล GWT ของคุณเช่น CSS หรือรูปภาพ พา ธ สาธารณะดีฟอลต์คือไดเร็กทอรีย่อยสาธารณะที่อยู่ด้านล่างซึ่งเก็บไฟล์ Module XML

6

<script src="js-url" />

ฉีดไฟล์ JavaScript ภายนอกที่อยู่ในตำแหน่งที่ระบุโดย src โดยอัตโนมัติ

7

<stylesheet src="css-url" />

ฉีดไฟล์ CSS ภายนอกที่อยู่ในตำแหน่งที่ระบุโดย src โดยอัตโนมัติ

ทรัพยากรสาธารณะ

นี่คือไฟล์ทั้งหมดที่อ้างอิงโดยโมดูล GWT ของคุณเช่นหน้าโฮสต์ HTML, CSS หรือรูปภาพ

ตำแหน่งของทรัพยากรเหล่านี้สามารถกำหนดค่าได้โดยใช้องค์ประกอบ <public path = "path" /> ในไฟล์คอนฟิกูเรชันโมดูล โดยดีฟอลต์เป็นไดเร็กทอรีย่อยสาธารณะที่อยู่ด้านล่างที่เก็บไฟล์ Module XML

เมื่อคุณคอมไพล์แอปพลิเคชันของคุณเป็น JavaScript ไฟล์ทั้งหมดที่สามารถพบได้บนพา ธ สาธารณะของคุณจะถูกคัดลอกไปยังไดเร็กทอรีเอาต์พุตของโมดูล

ทรัพยากรสาธารณะที่สำคัญที่สุดคือหน้าโฮสต์ซึ่งใช้เพื่อเรียกใช้แอปพลิเคชัน GWT จริง หน้าโฮสต์ HTML ทั่วไปสำหรับแอปพลิเคชันอาจไม่มีเนื้อหาเนื้อหา HTML ที่มองเห็นได้เลย แต่ควรรวมแอปพลิเคชัน GWT ผ่านแท็ก <script ... /> ดังนี้

<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>

ต่อไปนี้เป็นสไตล์ชีตตัวอย่างที่เราได้รวมไว้ในหน้าโฮสต์ของเรา -

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;
}

รหัสฝั่งไคลเอ็นต์

นี่คือโค้ด Java จริงที่เขียนขึ้นโดยใช้ตรรกะทางธุรกิจของแอปพลิเคชันและคอมไพเลอร์ GWT แปลเป็น JavaScript ซึ่งจะทำงานในเบราว์เซอร์ในที่สุด ตำแหน่งของรีซอร์สเหล่านี้สามารถกำหนดค่าได้โดยใช้อิลิเมนต์ <source path = "path" /> ในไฟล์คอนฟิกูเรชันโมดูล

ตัวอย่างเช่น Entry Point รหัสจะถูกใช้เป็นรหัสฝั่งไคลเอ็นต์และตำแหน่งจะถูกระบุโดยใช้ <source path = "path" />

โมดูล entry-point คือชั้นเรียนใด ๆ ที่สามารถกำหนดให้ EntryPointและสามารถสร้างได้โดยไม่มีพารามิเตอร์ เมื่อโหลดโมดูลทุกคลาสของจุดเข้าใช้งานจะถูกสร้างอินสแตนซ์และEntryPoint.onModuleLoad()เรียกวิธีการ ตัวอย่างคลาส HelloWorld Entry Point จะเป็นดังนี้ -

public class HelloWorld implements EntryPoint {
   public void onModuleLoad() {
      Window.alert("Hello, World!");
   }
}

รหัสฝั่งเซิร์ฟเวอร์

นี่คือส่วนฝั่งเซิร์ฟเวอร์ของแอปพลิเคชันของคุณและเป็นทางเลือกอื่น ๆ หากคุณไม่ได้ทำการประมวลผลแบ็กเอนด์ด้วย - ในแอปพลิเคชันของคุณคุณก็ไม่จำเป็นต้องใช้ส่วนนี้ แต่หากมีการประมวลผลที่จำเป็นที่แบ็กเอนด์และแอปพลิเคชันฝั่งไคลเอ็นต์ของคุณโต้ตอบกับเซิร์ฟเวอร์คุณจะต้องพัฒนาส่วนประกอบเหล่านี้

บทต่อไปจะใช้แนวคิดที่กล่าวถึงข้างต้นทั้งหมดเพื่อสร้างแอปพลิเคชัน HelloWorld โดยใช้ Eclipse IDE

เนื่องจากพลังของ GWT อยู่ใน Write in Java, Run in JavaScriptเราจะใช้ Java IDE Eclipse เพื่อสาธิตตัวอย่างของเรา

เริ่มต้นด้วยแอปพลิเคชันHelloWorldง่ายๆ-

ขั้นตอนที่ 1 - สร้างโครงการ

ขั้นตอนแรกคือการสร้าง Web Application Project อย่างง่ายโดยใช้ Eclipse IDE เรียกใช้ตัวช่วยสร้างโครงการโดยใช้ตัวเลือกGoogle Icon

> New Web Application Project.... ตอนนี้ตั้งชื่อโปรเจ็กต์ของคุณเป็นHelloWorldโดยใช้หน้าต่างวิซาร์ดดังนี้ -

ยกเลิกการเลือก Use Google App Engine เนื่องจากเราไม่ได้ใช้มันในโครงการนี้และปล่อยให้ค่าเริ่มต้นอื่น ๆ (เก็บ Generate Sample project code เลือกตัวเลือก) ดังกล่าวแล้วคลิกปุ่มเสร็จสิ้น

เมื่อสร้างโครงการของคุณสำเร็จคุณจะมีเนื้อหาต่อไปนี้ใน Project Explorer ของคุณ -

นี่คือคำอธิบายสั้น ๆ ของโฟลเดอร์ที่สำคัญทั้งหมด

ซีเนียร์ โฟลเดอร์และที่ตั้ง
1

src

ไฟล์ซอร์สโค้ด (คลาส java)

โฟลเดอร์ไคลเอ็นต์ที่มีคลาส java เฉพาะฝั่งไคลเอ็นต์ที่รับผิดชอบการแสดง UI ของไคลเอ็นต์

โฟลเดอร์เซิร์ฟเวอร์ที่มีคลาส java ฝั่งเซิร์ฟเวอร์ที่รับผิดชอบการประมวลผลฝั่งเซิร์ฟเวอร์

โฟลเดอร์ที่ใช้ร่วมกันที่มีคลาสโมเดล java เพื่อถ่ายโอนข้อมูลจากเซิร์ฟเวอร์ไปยังไคลเอนต์และในทางกลับกัน

HelloWorld.gwt.xml ซึ่งเป็นไฟล์ตัวอธิบายโมดูลที่จำเป็นสำหรับคอมไพเลอร์ GWT เพื่อคอมไพล์โครงการ HelloWorld

2

test

ซอร์สไฟล์รหัสทดสอบ (คลาส java)

โฟลเดอร์ไคลเอนต์ที่มีคลาส java ที่รับผิดชอบในการทดสอบโค้ดฝั่งไคลเอ็นต์ gwt

3

war

นี่เป็นส่วนที่สำคัญที่สุดแสดงถึงเว็บแอปพลิเคชันที่สามารถปรับใช้งานได้จริง

WEB-INF ประกอบด้วยคลาสที่คอมไพล์ไลบรารี gwt ไลบรารี servlet

HelloWorld.css สไตล์ชีตของโครงการ

HelloWorld.html ฮอต HTML ซึ่งจะเรียกใช้ GWT UI Application

ขั้นตอนที่ 2 - แก้ไขตัวบอกโมดูล: HelloWorld.gwt.xml

ปลั๊กอิน GWT จะสร้างไฟล์ตัวอธิบายโมดูลเริ่มต้น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.  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>

ขั้นตอนที่ 3 - แก้ไขสไตล์ชีต: HelloWorld.css

ปลั๊กอิน GWT จะสร้างรูปแบบเริ่มต้นไฟล์แผ่นสงคราม / 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;
}

ขั้นตอนที่ 4 - แก้ไขไฟล์โฮสต์: HelloWorld.html

ปลั๊กอิน GWT จะสร้างเริ่มต้น HTML ไฟล์โฮสต์สงคราม / 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>
      <p>Welcome to first GWT application</p>
   </body>
</html>

คุณสามารถสร้างไฟล์แบบคงที่ได้มากขึ้นเช่น HTML, CSS หรือรูปภาพในไดเร็กทอรีต้นทางเดียวกันหรือคุณสามารถสร้างไดเร็กทอรีย่อยเพิ่มเติมและย้ายไฟล์ในไดเร็กทอรีย่อยเหล่านั้นและกำหนดค่าไดเร็กทอรีย่อยเหล่านั้นในตัวอธิบายโมดูลของแอ็พพลิเคชัน

ขั้นตอนที่ 5 - แก้ไขจุดเข้าใช้งาน: HelloWorld.java

ปลั๊กอิน GWT จะสร้างไฟล์ Java เริ่มต้นsrc / com.tutorialspoint / HelloWorld.javaซึ่งเป็นจุดเริ่มต้นสำหรับแอปพลิเคชัน

ให้เราแก้ไขไฟล์นี้เพื่อแสดง "สวัสดีชาวโลก!"

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!");
   }
}

คุณสามารถสร้างไฟล์ Java เพิ่มเติมในไดเร็กทอรีต้นทางเดียวกันเพื่อกำหนดจุดเข้าใช้งานหรือกำหนดรูทีนตัวช่วย

ขั้นตอนที่ 6 - รวบรวมแอปพลิเคชัน

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดแล้วก็ถึงเวลารวบรวมโครงการ ใช้ตัวเลือกGoogle Icon

> GWT Compile Project... เพื่อเปิดกล่องโต้ตอบ GWT Compile ดังที่แสดงด้านล่าง -

เก็บค่าเริ่มต้นไว้เหมือนเดิมแล้วคลิกปุ่มคอมไพล์ หากทุกอย่างเรียบร้อยดีคุณจะเห็นเอาต์พุตต่อไปนี้ในคอนโซล Eclipse

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

ขั้นตอนที่ 7 - เรียกใช้แอปพลิเคชัน

ตอนนี้คลิกที่

เรียกใช้เมนูแอปพลิเคชันแล้วเลือกHelloWorld แอปพลิเคชันเพื่อเรียกใช้แอปพลิเคชัน

หากทุกอย่างเรียบร้อยดีคุณต้องเห็น GWT Development Mode ที่ใช้งานอยู่ใน Eclipse ที่มี URL ดังที่แสดงด้านล่าง ดับเบิลคลิกที่ URL เพื่อเปิดแอปพลิเคชัน GWT

เนื่องจากคุณกำลังเรียกใช้แอปพลิเคชันของคุณในโหมดการพัฒนาดังนั้นคุณจะต้องติดตั้งปลั๊กอิน GWT สำหรับเบราว์เซอร์ของคุณ เพียงทำตามคำแนะนำบนหน้าจอเพื่อติดตั้งปลั๊กอิน

หากคุณตั้งค่าปลั๊กอิน GWT สำหรับเบราว์เซอร์ของคุณแล้วคุณควรจะเห็นผลลัพธ์ต่อไปนี้

ยินดีด้วย! คุณได้ติดตั้งแอปพลิเคชันแรกของคุณโดยใช้ Google Web Toolkit (GWT)

บทช่วยสอนนี้จะอธิบายวิธีสร้างแอปพลิเคชัน "war" ไฟล์และวิธีปรับใช้ในรูท Apache Tomcat Websever

หากคุณเข้าใจตัวอย่างง่ายๆนี้คุณจะสามารถปรับใช้แอปพลิเคชัน GWT ที่ซับซ้อนได้โดยทำตามขั้นตอนเดียวกัน

ให้เรามี Eclipse IDE ที่ใช้งานได้พร้อมกับปลั๊ก GWT และทำตามขั้นตอนต่อไปนี้เพื่อสร้างแอปพลิเคชัน GWT -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อให้แน่ใจว่าตรรกะทางธุรกิจทำงานได้ตามข้อกำหนด
4 สุดท้ายให้บีบอัดเนื้อหาของโฟลเดอร์ war ของแอปพลิเคชันในรูปแบบไฟล์ war และปรับใช้ใน Apache Tomcat Webserver
5 เปิดเว็บแอปพลิเคชันของคุณโดยใช้ URL ที่เหมาะสมตามที่อธิบายไว้ด้านล่างในขั้นตอนสุดท้าย

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ฉันแก้ไข HTML เล็กน้อยจากตัวอย่างก่อนหน้านี้ ที่นี่ฉันสร้างตัวยึดตำแหน่ง <div> ... </div> ซึ่งเราจะแทรกเนื้อหาบางส่วนโดยใช้คลาส java จุดเริ่มต้นของเรา ดังนั้นให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Javasrc/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);
   }
}

ที่นี่เราสร้างบน HTML พื้นฐานที่กว้างที่สุดและเพิ่มไว้ในแท็ก div ที่มี id = "gwtContainer" เราจะศึกษาวิดเจ็ต GWT ต่างๆในบทต่อ ๆ ไป

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

สร้างไฟล์ WAR

ตอนนี้แอปพลิเคชันของเราทำงานได้ดีและเราพร้อมที่จะส่งออกเป็นไฟล์สงคราม

ทำตามขั้นตอนต่อไปนี้ -

  • เข้าไปในโครงการของคุณ war ไดเรกทอรี C:\workspace\HelloWorld\war

  • เลือกไฟล์และโฟลเดอร์ทั้งหมดที่มีอยู่ในไดเร็กทอรี war

  • zip ไฟล์ทั้งหมดที่เลือกและโฟลเดอร์ในไฟล์ที่เรียกว่าHelloWorld.zip

  • เปลี่ยนชื่อHelloWorld.zipเพื่อHelloWorld.war

ปรับใช้ไฟล์ WAR

  • หยุดเซิร์ฟเวอร์ Tomcat

  • คัดลอกไฟล์HelloWorld.warไปที่tomcat installation directory > webapps folder.

  • เริ่มเซิร์ฟเวอร์ Tomcat

  • ดูในไดเรกทอรี webapps ควรมีโฟลเดอร์ helloworld ได้สร้างขึ้น

  • ขณะนี้ HelloWorld.war ถูกปรับใช้ในรูท Tomcat Webserver เรียบร้อยแล้ว

เรียกใช้แอปพลิเคชัน

ป้อน url ในเว็บเบราว์เซอร์: http://localhost:8080/HelloWorld เพื่อเปิดแอปพลิเคชัน

ชื่อเซิร์ฟเวอร์ (localhost) และพอร์ต (8080) อาจแตกต่างกันไปตามการกำหนดค่า tomcat ของคุณ

วิดเจ็ต GWT ใช้สไตล์ชีตแบบเรียงซ้อน (CSS) สำหรับการจัดรูปแบบภาพ โดยค่าเริ่มต้นชื่อคลาสสำหรับแต่ละองค์ประกอบคือgwt-<classname>.

ยกตัวอย่างเช่นปุ่มเครื่องมือที่มีรูปแบบเริ่มต้นของGWT ปุ่มและช่องทางเดียวกัน widgest มีสไตล์เริ่มต้นของGWT-กล่องข้อความ

เพื่อให้ปุ่มและกล่องข้อความทั้งหมดมีแบบอักษรที่ใหญ่ขึ้นคุณสามารถใส่กฎต่อไปนี้ในไฟล์ CSS ของแอปพลิเคชันของคุณ

.gwt-Button  { font-size: 150%; }

.gwt-TextBox { font-size: 150%; }

ตามค่าเริ่มต้นทั้งเบราว์เซอร์และ GWT จะไม่สร้างค่าเริ่มต้น idแอตทริบิวต์สำหรับวิดเจ็ต คุณต้องสร้างรหัสเฉพาะสำหรับองค์ประกอบที่คุณสามารถใช้ใน CSS ได้อย่างชัดเจน เพื่อให้ปุ่มเฉพาะที่มี idmy-button-id แบบอักษรที่ใหญ่ขึ้นคุณสามารถวางกฎต่อไปนี้ในไฟล์ CSS ของแอปพลิเคชันของคุณ -

#my-button-id { font-size: 150%; }

ในการตั้งค่า id สำหรับวิดเจ็ต GWT ให้ดึงข้อมูล DOM Element จากนั้นตั้งค่า id แอตทริบิวต์ดังนี้ -

Button b = new Button();
DOM.setElementAttribute(b.getElement(), "id", "my-button-id")

CSS Styling API

มี API มากมายที่สามารถใช้งานการตั้งค่า CSS สำหรับวิดเจ็ต GWT ใด ๆ ต่อไปนี้เป็น API ที่สำคัญบางส่วนซึ่งจะช่วยคุณในการเขียนโปรแกรมเว็บในแต่ละวันโดยใช้ GWT -

ซีเนียร์ API และคำอธิบาย
1

public void setStyleName(java.lang.String style)

วิธีการนี้จะล้างรูปแบบที่มีอยู่และการตั้งค่ารูปแบบวิดเจ็ชั้น CSS ใหม่ให้ใช้รูปแบบ

2

public void addStyleName(java.lang.String style)

วิธีนี้จะเพิ่มชื่อสไตล์รองหรือขึ้นอยู่กับวิดเจ็ต ชื่อสไตล์รองเป็นชื่อสไตล์เพิ่มเติมนั่นคือดังนั้นหากมีการใช้ชื่อสไตล์ก่อนหน้านี้จะถูกเก็บไว้

3

public void removeStyleName(java.lang.String style)

วิธีนี้จะลบสไตล์ที่กำหนดออกจากวิดเจ็ตและปล่อยให้คนอื่น ๆ เชื่อมโยงกับวิดเจ็ต

4

public java.lang.String getStyleName()

วิธีนี้รับชื่อสไตล์ของอ็อบเจ็กต์ทั้งหมดเป็นรายการที่คั่นด้วยช่องว่าง

5

public void setStylePrimaryName(java.lang.String style)

วิธีนี้ตั้งชื่อสไตล์หลักของอ็อบเจ็กต์และอัพเดตชื่อสไตล์ที่ขึ้นต่อกันทั้งหมด

ตัวอย่างเช่นให้กำหนดรูปแบบใหม่สองแบบซึ่งเราจะนำไปใช้กับข้อความ -

.gwt-Big-Text { 
   font-size:150%;
}

.gwt-Small-Text { 
   font-size:75%;
}

.gwt-Red-Text { 
   color:red;
}

ตอนนี้คุณสามารถใช้setStyleName (สไตล์)เพื่อเปลี่ยนการตั้งค่าเริ่มต้นเป็นการตั้งค่าใหม่ หลังจากใช้กฎด้านล่างแบบอักษรของข้อความจะมีขนาดใหญ่

txtWidget.setStyleName("gwt-Big-Text");

เราสามารถใช้กฎรอง CSS บนวิดเจ็ตเดียวกันเพื่อเปลี่ยนสีได้ดังนี้ -

txtWidget.addStyleName("gwt-Red-Text");

ด้วยวิธีการข้างต้นคุณสามารถเพิ่มสไตล์ได้มากเท่าที่คุณต้องการเพื่อใช้กับวิดเจ็ต หากคุณลบสไตล์แรกออกจากวิดเจ็ตปุ่มสไตล์ที่สองจะยังคงอยู่กับข้อความ

txtWidget.removeStyleName("gwt-Big-Text");

รูปแบบหลักและรอง

ตามค่าเริ่มต้นชื่อสไตล์หลักของวิดเจ็ตจะเป็นชื่อสไตล์ดีฟอลต์สำหรับคลาสวิดเจ็ตเช่นgwt-Buttonสำหรับวิดเจ็ต Button เมื่อเราเพิ่มและลบชื่อสไตล์โดยใช้เมธอด AddStyleName () สไตล์เหล่านั้นเรียกว่าสไตล์รอง

ลักษณะสุดท้ายของวิดเจ็ตจะพิจารณาจากผลรวมของสไตล์รองทั้งหมดที่เพิ่มเข้ามาบวกกับสไตล์หลัก คุณตั้งค่าสไตล์หลักของวิดเจ็ตด้วยเมธอดsetStylePrimaryName (String) เพื่อเป็นตัวอย่างสมมติว่าเรามีวิดเจ็ต Label ในไฟล์ CSS ของเราเราได้กำหนดกฎต่อไปนี้ -

.MyText {
   color: blue;
}

.BigText {
   font-size: large;
}

.LoudText {
   font-weight:  bold;
}

สมมติว่าเราต้องการให้วิดเจ็ตป้ายกำกับเฉพาะแสดงข้อความสีน้ำเงินเสมอและในบางกรณีให้ใช้ฟอนต์ตัวหนาที่ใหญ่กว่าเพื่อเพิ่มความสำคัญ

เราสามารถทำสิ่งนี้ได้ -

// 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");

การเชื่อมโยงไฟล์ CSS

มีหลายวิธีในการเชื่อมโยงไฟล์ CSS กับโมดูลของคุณ โดยทั่วไปแอปพลิเคชัน GWT สมัยใหม่จะใช้ CssResource และ UiBinder ร่วมกัน เราใช้เพียงแนวทางแรกในตัวอย่างของเรา

  • ใช้แท็ก <link> ในหน้าโฮสต์ HTML

  • ใช้อิลิเมนต์ <stylesheet> ในไฟล์ XML ของโมดูล

  • การใช้ไฟล์ CssResource อยู่ภายในไฟล์ ClientBundle.

  • การใช้องค์ประกอบ <ui: style> แบบอินไลน์ในไฟล์ UiBinder แม่แบบ

ตัวอย่าง GWT CSS

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการใช้กฎ CSS ที่แตกต่างกันกับ GWT ที่กว้างที่สุดของคุณ ให้เรามี Eclipse IDE ที่ใช้งานได้พร้อมกับปลั๊ก GWT และทำตามขั้นตอนต่อไปนี้เพื่อสร้างแอปพลิเคชัน GWT -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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%;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>
      <div id = "mytext"><h1>Hello, World!</h1></div>
      <div id = "gwtGreenButton"></div>
      <div id = "gwtRedButton"></div>
   </body>
</html>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งจะดูแลการเพิ่มสองปุ่มใน HTML และจะใช้สไตล์ CSS ที่กำหนดเอง

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);
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

ตอนนี้ลองคลิกที่ปุ่มสองปุ่มที่ปรากฏขึ้นและสังเกต "สวัสดีชาวโลก!" ข้อความที่เปลี่ยนแบบอักษรไปเรื่อย ๆ เมื่อคลิกที่ปุ่มสองปุ่ม

อินเทอร์เฟซผู้ใช้ทุกคนพิจารณาสามประเด็นหลักดังต่อไปนี้ -

  • UI elements- สิ่งเหล่านี้เป็นองค์ประกอบภาพหลักที่ผู้ใช้เห็นและโต้ตอบในที่สุด GWT มีรายการองค์ประกอบที่ใช้กันอย่างแพร่หลายและองค์ประกอบทั่วไปที่แตกต่างกันไปตั้งแต่พื้นฐานไปจนถึงแบบซับซ้อนซึ่งเราจะกล่าวถึงในบทช่วยสอนนี้

  • Layouts- พวกเขากำหนดวิธีการจัดระเบียบองค์ประกอบ UI บนหน้าจอและให้รูปลักษณ์สุดท้ายของ GUI (อินเทอร์เฟซผู้ใช้แบบกราฟิก) ส่วนนี้จะกล่าวถึงในบทเค้าโครง

  • Behavior- นี่คือเหตุการณ์ที่เกิดขึ้นเมื่อผู้ใช้โต้ตอบกับองค์ประกอบ UI ส่วนนี้จะครอบคลุมในบทการจัดการเหตุการณ์

องค์ประกอบ UI ของ GWT

ไลบรารี GWT จัดเตรียมคลาสในลำดับชั้นของคลาสที่กำหนดไว้อย่างดีเพื่อสร้างอินเทอร์เฟซผู้ใช้บนเว็บที่ซับซ้อน คลาสทั้งหมดในลำดับชั้นของคอมโพเนนต์นี้ได้รับมาจากUIObject คลาสฐานดังแสดงด้านล่าง -

วิดเจ็ต UI พื้นฐานทุกตัวจะสืบทอดคุณสมบัติจากคลาสวิดเจ็ตซึ่งจะสืบทอดคุณสมบัติจาก UIObject ต้นไม้และเมนูจะครอบคลุมในบทช่วยสอนวิดเจ็ตที่ซับซ้อน

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 คลาส GWT UIObject

วิดเจ็ตนี้มีข้อความซึ่งไม่ได้ตีความว่าเป็น HTML โดยใช้องค์ประกอบ <div> ทำให้แสดงพร้อมกับเลย์เอาต์บล็อก

2 คลาสวิดเจ็ต GWT

วิดเจ็ตนี้สามารถมีข้อความ HTML และแสดงเนื้อหา html โดยใช้องค์ประกอบ <div> ทำให้แสดงด้วยรูปแบบบล็อก

วิดเจ็ตพื้นฐาน

ต่อไปนี้เป็นวิดเจ็ตพื้นฐานที่สำคัญบางส่วน-

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 ฉลาก

วิดเจ็ตนี้มีข้อความซึ่งไม่ได้ตีความว่าเป็น HTML โดยใช้องค์ประกอบ <div> ทำให้แสดงพร้อมกับเลย์เอาต์บล็อก

2 HTML

วิดเจ็ตนี้สามารถมีข้อความ HTML และแสดงเนื้อหา html โดยใช้องค์ประกอบ <div> ทำให้แสดงด้วยรูปแบบบล็อก

3 ภาพ

วิดเจ็ตนี้แสดงภาพที่ URL ที่กำหนด

4 สมอ

วิดเจ็ตนี้แสดงถึงองค์ประกอบ <a> ที่เรียบง่าย

วิดเจ็ตแบบฟอร์มอนุญาตให้ผู้ใช้ป้อนข้อมูลและจัดเตรียมความสามารถในการโต้ตอบกับแอ็พพลิเคชัน วิดเจ็ต Form ทุกตัวจะสืบทอดคุณสมบัติจากคลาสวิดเจ็ตซึ่งจะสืบทอดคุณสมบัติจากคลาส UIObject และ Wigdet

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 คลาส GWT UIObject

วิดเจ็ตนี้มีข้อความซึ่งไม่ได้ตีความว่าเป็น HTML โดยใช้องค์ประกอบ <div> ทำให้แสดงพร้อมกับเลย์เอาต์บล็อก

2 คลาสวิดเจ็ต GWT

วิดเจ็ตนี้สามารถมีข้อความ HTML และแสดงเนื้อหา html โดยใช้องค์ประกอบ <div> ทำให้แสดงด้วยรูปแบบบล็อก

แบบฟอร์มวิดเจ็ต

ต่อไปนี้เป็นวิดเจ็ตฟอร์มที่สำคัญบางส่วน-

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 ปุ่ม

วิดเจ็ตนี้แสดงถึงปุ่มกดมาตรฐาน

2 PushButton

วิดเจ็ตนี้แสดงถึงปุ่มกดปกติพร้อมสไตล์ที่กำหนดเอง

3 ToggleButton

วิดเจ็ตนี้แสดงถึงปุ่มที่มีสไตล์ทันสมัยซึ่งช่วยให้ผู้ใช้สามารถสลับระหว่างสถานะขึ้นและลงได้

4 CheckBox

วิดเจ็ตนี้แสดงถึงวิดเจ็ตเช็กบ็อกซ์มาตรฐาน คลาสนี้ยังทำหน้าที่เป็นคลาสพื้นฐานสำหรับ RadioButton

5 RadioButton

วิดเจ็ตนี้แสดงถึงวิดเจ็ตปุ่มตัวเลือกแบบพิเศษร่วมกัน

6 ListBox

วิดเจ็ตนี้แสดงรายการตัวเลือกสำหรับผู้ใช้ไม่ว่าจะเป็นกล่องรายการหรือเป็นรายการแบบหล่นลง

7 SuggestBox

วิดเจ็ตนี้แสดงถึงกล่องข้อความหรือพื้นที่ข้อความซึ่งแสดงชุดการเลือกที่กำหนดไว้ล่วงหน้าซึ่งตรงกับข้อมูลที่ผู้ใช้ป้อน SuggestBox แต่ละรายการเชื่อมโยงกับ SuggestOracle เดียว SuggestOracle ใช้เพื่อจัดเตรียมชุดของการเลือกที่กำหนดสตริงการสืบค้นเฉพาะ

8 กล่องข้อความ

วิดเจ็ตนี้แสดงถึงกล่องข้อความบรรทัดเดียว

9 PasswordTextBox

วิดเจ็ตนี้แสดงถึงกล่องข้อความที่ปิดบังอินพุตเพื่อป้องกันการดักฟัง ..

10 TextArea

วิดเจ็ตนี้แสดงถึงกล่องข้อความที่อนุญาตให้ป้อนข้อความหลายบรรทัด

11 RichTextArea

วิดเจ็ตนี้แสดงถึงโปรแกรมแก้ไข Rich Text ที่ช่วยให้มีสไตล์และการจัดรูปแบบที่ซับซ้อน

12 อัปโหลดไฟล์

วิดเจ็ตนี้รวมองค์ประกอบ HTML <input type = 'file'>

13 ซ่อนอยู่

วิดเจ็ตนี้รีเซ็ตฟิลด์ที่ซ่อนอยู่ในรูปแบบ HTML

"วิดเจ็ตที่ซับซ้อน" ช่วยให้ผู้ใช้สามารถโต้ตอบขั้นสูงกับแอปพลิเคชันได้ วิดเจ็ตที่ซับซ้อนทุกตัวจะสืบทอดคุณสมบัติจากคลาสวิดเจ็ตซึ่งจะสืบทอดคุณสมบัติจาก UIObject

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 คลาส GWT UIObject

วิดเจ็ตนี้มีข้อความซึ่งไม่ได้ตีความว่าเป็น HTML โดยใช้องค์ประกอบ <div> ทำให้แสดงพร้อมกับเลย์เอาต์บล็อก

2 คลาสวิดเจ็ต GWT

วิดเจ็ตนี้สามารถมีข้อความ HTML และแสดงเนื้อหา html โดยใช้องค์ประกอบ <div> ทำให้แสดงด้วยรูปแบบบล็อก

วิดเจ็ตที่ซับซ้อน

ต่อไปนี้เป็นวิดเจ็ตที่ซับซ้อนที่สำคัญบางส่วน -

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 ต้นไม้

วิดเจ็ตนี้แสดงวิดเจ็ตแผนผังลำดับชั้นมาตรฐาน แผนภูมิประกอบด้วยลำดับชั้นของ TreeItems ที่ผู้ใช้สามารถเปิดปิดและเลือกได้

2 แถบเมนู

วิดเจ็ตนี้แสดงถึงวิดเจ็ตแถบเมนูมาตรฐาน แถบเมนูสามารถมีรายการเมนูกี่รายการซึ่งแต่ละรายการสามารถเริ่มคำสั่งหรือเปิดแถบเมนูแบบเรียงซ้อน

3 เลือกวันที่

วิดเจ็ตนี้แสดงถึงเครื่องมือเลือกวันที่ GWT มาตรฐาน

4 CellTree

วิดเจ็ตนี้แสดงถึงมุมมองของต้นไม้ วิดเจ็ตนี้จะทำงานในโหมดมาตรฐานเท่านั้นซึ่งกำหนดให้เพจ HTML ที่รันมีการประกาศ <! DOCTYPE> อย่างชัดเจน

5 CellList

วิดเจ็ตนี้แสดงรายการคอลัมน์เดียวของเซลล์

6 CellTable

วิดเจ็ตนี้แสดงถึงมุมมองแบบตารางที่รองรับการเพจและคอลัมน์

7 CellBrowser

วิดเจ็ตนี้แสดงถึงไฟล์ browsableมุมมองของต้นไม้ที่สามารถเปิดได้เพียงโหนดเดียวต่อระดับในคราวเดียว วิดเจ็ตนี้จะทำงานในโหมดมาตรฐานเท่านั้นซึ่งกำหนดให้เพจ HTML ที่รันมีการประกาศ <! DOCTYPE> อย่างชัดเจน

แผงเค้าโครงสามารถมีวิดเจ็ตอื่น ๆ แผงควบคุมเหล่านี้ควบคุมวิธีแสดงวิดเจ็ตบนอินเทอร์เฟซผู้ใช้ วิดเจ็ต Panel ทุกตัวจะสืบทอดคุณสมบัติจากคลาสพาเนลซึ่งจะสืบทอดคุณสมบัติจากคลาสวิดเจ็ตและซึ่งจะสืบทอดคุณสมบัติจากคลาส UIObject

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 คลาส GWT UIObject

วิดเจ็ตนี้มีข้อความซึ่งไม่ได้ตีความว่าเป็น HTML โดยใช้องค์ประกอบ <div> ทำให้แสดงพร้อมกับเลย์เอาต์บล็อก

2 คลาสวิดเจ็ต GWT

วิดเจ็ตนี้สามารถมีข้อความ HTML และแสดงเนื้อหา html โดยใช้องค์ประกอบ <div> ทำให้แสดงด้วยรูปแบบบล็อก

3 คลาสแผง GWT

นี่คือคลาสพื้นฐานนามธรรมสำหรับพาเนลทั้งหมดซึ่งเป็นวิดเจ็ตที่สามารถมีวิดเจ็ตอื่นได้

แผงเค้าโครง

ต่อไปนี้เป็นแผงเค้าโครงที่สำคัญบางส่วน-

ซีเนียร์ วิดเจ็ตและคำอธิบาย
1 FlowPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่จัดรูปแบบวิดเจ็ตลูกโดยใช้พฤติกรรมการจัดวาง HTML ดีฟอลต์

2 HorizontalPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่วางวิดเจ็ตทั้งหมดในคอลัมน์แนวนอนเดียว

3 VerticalPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่วางวิดเจ็ตทั้งหมดในคอลัมน์แนวตั้งเดียว

4 HorizontalSplitPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่จัดเรียงวิดเจ็ตสองวิดเจ็ตในแถวแนวนอนเดียวและอนุญาตให้ผู้ใช้เปลี่ยนสัดส่วนของความกว้างที่ทุ่มเทให้กับแต่ละวิดเจ็ตจากสองวิดเจ็ต วิดเจ็ตที่อยู่ใน HorizontalSplitPanel จะถูกตกแต่งโดยอัตโนมัติด้วยแถบเลื่อนเมื่อจำเป็น

5 VerticalSplitPanel

วิดเจ็ตนี้แสดงถึงพาเนล A ที่จัดเรียงวิดเจ็ตสองวิดเจ็ตในคอลัมน์แนวตั้งเดียวและอนุญาตให้ผู้ใช้เปลี่ยนสัดส่วนของความสูงที่ทุ่มเทให้กับแต่ละวิดเจ็ต วิดเจ็ตที่อยู่ภายใน VertialSplitPanel จะถูกตกแต่งโดยอัตโนมัติด้วยแถบเลื่อนเมื่อจำเป็น

6 FlexTable

วิดเจ็ตนี้แสดงถึงตารางที่ยืดหยุ่นซึ่งสร้างเซลล์ตามความต้องการ สามารถเป็นแบบหยักได้ (นั่นคือแต่ละแถวสามารถมีจำนวนเซลล์ที่แตกต่างกันได้) และแต่ละเซลล์สามารถกำหนดให้ขยายหลายแถวหรือคอลัมน์ได้

7 กริด

วิดเจ็ตนี้แสดงถึงตารางสี่เหลี่ยมที่สามารถมีข้อความ html หรือวิดเจ็ตลูกภายในเซลล์ได้ ต้องมีการปรับขนาดอย่างชัดเจนเป็นจำนวนแถวและคอลัมน์ที่ต้องการ

8 DeckPanel

แผงควบคุมที่แสดงวิดเจ็ตลูกทั้งหมดใน 'เด็ค' ซึ่งสามารถมองเห็นได้ครั้งละหนึ่งรายการเท่านั้น ใช้โดย TabPanel

9 DockPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่วางวิดเจ็ตลูก "เชื่อมต่อ" ที่ขอบด้านนอกและอนุญาตให้วิดเจ็ตสุดท้ายใช้พื้นที่ที่เหลืออยู่ตรงกลาง

10 HTMLPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่มี HTML และสามารถแนบวิดเจ็ตลูกเข้ากับองค์ประกอบที่ระบุภายใน HTML นั้น

11 TabPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่แสดงถึงชุดเพจแบบแท็บซึ่งแต่ละเพจมีวิดเจ็ตอื่น วิดเจ็ตลูกจะแสดงเมื่อผู้ใช้เลือกแท็บต่างๆที่เกี่ยวข้อง แท็บสามารถมี HTML ที่กำหนดเองได้

12 คอมโพสิต

วิดเจ็ตนี้แสดงถึงวิดเจ็ตประเภทหนึ่งที่สามารถรวมวิดเจ็ตอื่นโดยซ่อนวิธีการของวิดเจ็ตที่ถูกรวมไว้ เมื่อเพิ่มลงในพาเนลคอมโพสิตจะทำงานเหมือนกับว่ามีการเพิ่มวิดเจ็ตที่ห่อไว้

13 SimplePanel

วิดเจ็ตนี้แสดงถึงคลาสฐานสำหรับพาเนลที่มีวิดเจ็ตเดียว

14 ScrollPanel

วิดเจ็ตนี้แสดงถึงพาเนลง่ายๆที่รวมเนื้อหาไว้ในพื้นที่ที่เลื่อนได้

15 FocusPanel

วิดเจ็ตนี้แสดงถึงแผงควบคุมแบบเรียบง่ายที่ทำให้เนื้อหาสามารถโฟกัสได้และเพิ่มความสามารถในการจับเหตุการณ์ของเมาส์และคีย์บอร์ด

16 FormPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่รวมเนื้อหาในองค์ประกอบ HTML <FORM>

17 PopupPanel

วิดเจ็ตนี้แสดงถึงพาเนลที่สามารถ pop upเหนือวิดเจ็ตอื่น ๆ มันซ้อนทับพื้นที่ไคลเอนต์ของเบราว์เซอร์ (และป๊อปอัปที่สร้างไว้ก่อนหน้านี้)

18 DialogBox

วิดเจ็ตนี้แสดงถึงรูปแบบของป๊อปอัปที่มีพื้นที่คำอธิบายภาพอยู่ด้านบนและผู้ใช้สามารถลากได้ ไม่เหมือนกับ PopupPanel การเรียกใช้ PopupPanel.setWidth (String) และ PopupPanel.setHeight (String) จะกำหนดความกว้างและความสูงของกล่องโต้ตอบเองแม้ว่าจะยังไม่ได้เพิ่มวิดเจ็ตก็ตาม

GWT มีโมเดลตัวจัดการเหตุการณ์ที่คล้ายกับ Java AWT หรือ SWING User Interface frameworks

  • อินเทอร์เฟซสำหรับผู้ฟังกำหนดวิธีการอย่างน้อยหนึ่งวิธีที่วิดเจ็ตเรียกใช้เพื่อประกาศเหตุการณ์ GWT แสดงรายการอินเทอร์เฟซที่เกี่ยวข้องกับเหตุการณ์ต่างๆที่เป็นไปได้

  • คลาสที่ต้องการรับเหตุการณ์ประเภทใดประเภทหนึ่งจะใช้อินเทอร์เฟซตัวจัดการที่เกี่ยวข้องจากนั้นส่งการอ้างอิงถึงตัวเองไปยังวิดเจ็ตเพื่อสมัครสมาชิกชุดของเหตุการณ์

ตัวอย่างเช่นไฟล์ Button ชั้นเผยแพร่ click eventsดังนั้นคุณจะต้องเขียนคลาสเพื่อใช้ClickHandlerเพื่อจัดการclick เหตุการณ์.

อินเทอร์เฟซตัวจัดการเหตุการณ์

ตัวจัดการเหตุการณ์ GWT ทั้งหมดได้รับการขยายจากอินเทอร์เฟซEventHandlerและแต่ละตัวจัดการมีเพียงวิธีเดียวที่มีอาร์กิวเมนต์เดียว อาร์กิวเมนต์นี้เป็นวัตถุประเภทเหตุการณ์ที่เกี่ยวข้องเสมอ แต่ละeventวัตถุมีหลายวิธีในการจัดการกับวัตถุเหตุการณ์ที่ส่งผ่าน ตัวอย่างเช่นเหตุการณ์คลิกคุณจะต้องเขียนตัวจัดการของคุณดังนี้ -

/**
 * 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!");
   }
}

ตอนนี้ชั้นเรียนใดต้องการรับเหตุการณ์คลิกจะโทร addClickHandler() เพื่อลงทะเบียนตัวจัดการเหตุการณ์ดังนี้ -

/**
 * create button and attach click handler
 */
Button button = new Button("Click Me!");
button.addClickHandler(new MyClickHandler());

แต่ละวิดเจ็ตที่รองรับประเภทเหตุการณ์จะมีวิธีการเพิ่ม HandlerRegistration แบบฟอร์มFooตัวจัดการ (FooEvent) ที่ไหน Foo คือเหตุการณ์จริงเช่น Click, Error, KeyPress เป็นต้น

ต่อไปนี้เป็นรายชื่อตัวจัดการเหตุการณ์ GWT ที่สำคัญและเหตุการณ์ที่เกี่ยวข้องและวิธีการลงทะเบียนตัวจัดการ -

ซีเนียร์ อินเทอร์เฟซเหตุการณ์ วิธีการและคำอธิบายเหตุการณ์
1 ก่อนตัวจัดการการเลือก <I>

void on Before Selection (Before Selection Event<I> event);

เรียกว่าเมื่อ BeforeSelectionEvent เริ่มทำงาน

2 BlurHandler

void on Blur(Blur Event event);

เรียกว่าเมื่อเกิดเหตุการณ์เบลอ

3 ChangeHandler

void on Change(ChangeEvent event);

เรียกว่าเมื่อเหตุการณ์การเปลี่ยนแปลงเริ่มทำงาน

4 ClickHandler

void on Click(ClickEvent event);

เรียกเมื่อเหตุการณ์คลิกเนทีฟเริ่มทำงาน

5 ปิดตัวจัดการ <T>

void on Close(CloseEvent<T> event);

เรียกเมื่อ CloseEvent เริ่มทำงาน

6 ตัวจัดการเมนูบริบท

void on Context Menu(Context Menu Event event);

เรียกว่าเมื่อเหตุการณ์เมนูบริบทดั้งเดิมเริ่มทำงาน

7 Double Click Handler

void on Double Click(Double Click Event event);

เรียกว่าเมื่อเหตุการณ์ดับเบิลคลิกเริ่มทำงาน

8 ตัวจัดการข้อผิดพลาด

void on Error(Error Event event);

เรียกเมื่อเกิดเหตุการณ์ข้อผิดพลาด

9 ตัวจัดการโฟกัส

void on Focus(Focus Event event);

เรียกว่าเมื่อโฟกัสเหตุการณ์ถูกยิง

10 แผงแบบฟอร์มส่งตัวจัดการที่สมบูรณ์

void on Submit Complete(Form Panel.Submit Complete Event event);

เริ่มทำงานเมื่อส่งแบบฟอร์มสำเร็จ

11 FormPanel.SubmitHandler

void on Submit(Form Panel.Submit Event event);

เริ่มทำงานเมื่อส่งแบบฟอร์ม

12 ตัวจัดการคีย์ลง

void on Key Down(Key Down Event event);

เรียกว่าเมื่อ KeyDownEvent เริ่มทำงาน

13 แป้นกดที่จัดการ

void on KeyPress(KeyPressEvent event);

เรียกว่าเมื่อ KeyPressEvent เริ่มทำงาน

14 KeyUpHandler

void on KeyUp(KeyUpEvent event);

เรียกว่าเมื่อ KeyUpEvent เริ่มทำงาน

15 LoadHandler

void on Load(LoadEvent event);

เรียกว่าเมื่อ LoadEvent เริ่มทำงาน

16 MouseDownHandler

void on MouseDown(MouseDownEvent event);

เรียกว่าเมื่อ MouseDown ถูกไล่ออก

17 MouseMoveHandler

void on MouseMove(MouseMoveEvent event);

เรียกว่าเมื่อ MouseMoveEvent เริ่มทำงาน

18 MouseOutHandler

void on MouseOut(MouseOutEvent event);

เรียกว่าเมื่อ MouseOutEvent เริ่มทำงาน

19 MouseOverHandler

void on MouseOver(MouseOverEvent event);

เรียกว่าเมื่อ MouseOverEvent เริ่มทำงาน

20 MouseUpHandler

void on MouseUp(MouseUpEvent event);

เรียกว่าเมื่อ MouseUpEvent เริ่มทำงาน

21 MouseWheelHandler

void on MouseWheel(MouseWheelEvent event);

เรียกว่าเมื่อ MouseWheelEvent เริ่มทำงาน

22 ปรับขนาดตัวจัดการ

void on Resize(ResizeEvent event);

เริ่มทำงานเมื่อปรับขนาดวิดเจ็ต

23 ScrollHandler

void on Scroll(ScrollEvent event);

เรียกว่าเมื่อ ScrollEvent เริ่มทำงาน

24 SelectionHandler <I>

void on Selection(SelectionEvent<I> event);

เรียกว่าเมื่อ SelectionEvent เริ่มทำงาน

25 ValueChangeHandler <I>

void on ValueChange(ValueChangeEvent<I> event);

เรียกว่าเมื่อ ValueChangeEvent เริ่มทำงาน

26 หน้าต่างการปิดตัวจัดการ

void on WindowClosing(Window.ClosingEvent event);

เริ่มทำงานก่อนที่หน้าต่างเบราว์เซอร์จะปิดหรือไปที่ไซต์อื่น

27 Window.ScrollHandler

void on WindowScroll(Window.ScrollEvent event);

เริ่มทำงานเมื่อหน้าต่างเบราว์เซอร์ถูกเลื่อน

วิธีการจัดงาน

ดังกล่าวก่อนหน้าแต่ละจัดการมีวิธีการเดียวกับอาร์กิวเมนต์เดียวซึ่งถือวัตถุเหตุการณ์เช่นโมฆะ onClick (event ClickEvent)หรือเป็นโมฆะ onkeydown (event KeyDownEvent) ออบเจ็กต์เหตุการณ์เช่นClickEventและKeyDownEventมีวิธีการทั่วไปไม่กี่วิธีซึ่งแสดงไว้ด้านล่าง -

ซีเนียร์ วิธีการและคำอธิบาย
1

protected void dispatch(ClickHandler handler) วิธีนี้ควรเรียกโดย HandlerManager

2

DomEvent.Type <FooHandler> getAssociatedType() วิธีนี้ส่งคืนประเภทที่ใช้ในการลงทะเบียน Foo เหตุการณ์.

3

static DomEvent.Type<FooHandler> getType() วิธีนี้ได้รับประเภทเหตุการณ์ที่เกี่ยวข้องกับ Foo เหตุการณ์

4

public java.lang.Object getSource() วิธีนี้จะส่งคืนแหล่งที่มาที่ทำให้เหตุการณ์นี้เริ่มทำงานครั้งสุดท้าย

5

protected final boolean isLive() วิธีนี้จะคืนค่าว่าเหตุการณ์นั้นเป็นจริงหรือไม่

6

protected void kill() วิธีนี้จะฆ่าเหตุการณ์

ตัวอย่าง

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงการใช้ไฟล์ Click เหตุการณ์และ KeyDownการจัดการเหตุการณ์ใน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งจะสาธิตการใช้ Event Handling ใน 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());
         }
      }
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

GWT มีสามวิธีในการสร้างองค์ประกอบส่วนติดต่อผู้ใช้ที่กำหนดเอง มีสามกลยุทธ์ทั่วไปที่จะปฏิบัติตาม -

  • Create a widget by extending Composite Class- นี่เป็นวิธีทั่วไปและง่ายที่สุดในการสร้างวิดเจ็ตแบบกำหนดเอง ที่นี่คุณสามารถใช้วิดเจ็ตที่มีอยู่เพื่อสร้างมุมมองแบบผสมด้วยคุณสมบัติที่กำหนดเอง

  • Create a widget using GWT DOM API in JAVA- วิดเจ็ตพื้นฐาน GWT ถูกสร้างขึ้นด้วยวิธีนี้ ยังคงเป็นวิธีที่ซับซ้อนมากในการสร้างวิดเจ็ตแบบกำหนดเองและควรใช้อย่างระมัดระวัง

  • Use JavaScript and wrap it in a widget using JSNI- โดยทั่วไปควรทำเป็นทางเลือกสุดท้ายเท่านั้น เมื่อพิจารณาถึงผลกระทบข้ามเบราว์เซอร์ของเมธอดเนทีฟมันจะซับซ้อนมากและยังแก้จุดบกพร่องได้ยากขึ้นด้วย

สร้าง Custom Widget ด้วย Composite Class

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงการสร้าง Custom Widget ใน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT -บทBasic Widgets -

ที่นี่เราจะสร้างวิดเจ็ตแบบกำหนดเองโดยการขยายคลาส Composite ซึ่งเป็นวิธีที่ง่ายที่สุดในการสร้างวิดเจ็ตแบบกำหนดเอง

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งจะสาธิตการสร้างวิดเจ็ตแบบกำหนดเอง

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);
   }    
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

You can notice following points

  • การสร้าง Custom Widget โดยการขยาย Composite widget นั้นค่อนข้างง่าย

  • เราได้สร้างวิดเจ็ตด้วยวิดเจ็ต GWT inbuilt, TextBox และ CheckBox โดยใช้แนวคิดของการใช้ซ้ำ

  • TextBox ถูกปิด / เปิดใช้งานขึ้นอยู่กับสถานะของช่องทำเครื่องหมาย เราได้จัดเตรียม API เพื่อเปิด / ปิดการควบคุม

  • เราได้เปิดเผยรูปแบบวิดเจ็ตภายในผ่านรูปแบบ CSS ที่มีเอกสาร

บทนำ

UiBinder เป็นเฟรมเวิร์กที่ออกแบบมาเพื่อแยกฟังก์ชันการทำงานและมุมมองของอินเทอร์เฟซผู้ใช้

  • เฟรมเวิร์ก UiBinder ช่วยให้นักพัฒนาสร้างแอปพลิเคชัน gwt เป็นเพจ HTML โดยมีวิดเจ็ต GWT ที่กำหนดค่าไว้ตลอด

  • เฟรมเวิร์ก UiBinder ทำให้การทำงานร่วมกันง่ายขึ้นกับนักออกแบบ UI ที่สะดวกสบายกับ XML, HTML และ CSS มากกว่าซอร์สโค้ด Java

  • UIBinder เป็นวิธีที่เปิดเผยในการกำหนด User Interface

  • UIBinder แยกตรรกะของโปรแกรมออกจาก UI

  • UIBinder คล้ายกับที่ JSP ใช้กับ Servlets

เวิร์กโฟลว์ UiBinder

ขั้นตอนที่ 1 - สร้างไฟล์ XML Declaration UI

สร้างไฟล์ประกาศส่วนติดต่อผู้ใช้แบบ XML / HTML เราได้สร้างไฟล์Login.ui.xml ไฟล์ในตัวอย่างของเรา

<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>

ขั้นตอนที่ 2 - ใช้ ui: field สำหรับการผูกภายหลัง

ใช้แอตทริบิวต์ ui: field ในองค์ประกอบ XML / HTML เพื่อเชื่อมโยงฟิลด์ UI ใน XML กับฟิลด์ UI ในไฟล์ JAVA สำหรับการรวมในภายหลัง

<gwt:Label ui:field = "completionLabel1" />
<gwt:Label ui:field = "completionLabel2" />

ขั้นตอนที่ 3 - สร้าง Java คู่ของ UI XML

สร้างรูปแบบตาม XML ที่ใช้ Java โดยการขยายวิดเจ็ตคอมโพสิต เราได้สร้างไฟล์Login.java ไฟล์ในตัวอย่างของเรา

package com.tutorialspoint.client;
   ...
public class Login extends Composite {
   ...
}

ขั้นตอนที่ 4 - ผูกฟิลด์ Java UI ด้วยคำอธิบายประกอบ UiField

ใช้คำอธิบายประกอบ @UiField ใน Login.java เพื่อกำหนดสมาชิกคลาสคู่กันเพื่อผูกกับฟิลด์ที่ใช้ XML ใน Login.ui.xml

public class Login extends Composite {
   ...
   @UiField
   Label completionLabel1;

   @UiField
   Label completionLabel2;  
   ...
}

ขั้นตอนที่ 5 - ผูก Java UI กับ UI XML พร้อมคำอธิบายประกอบ UiTemplate

สั่งให้ GWT ผูกคอมโพเนนต์ที่ใช้ java Login.java และเค้าโครงตาม XML Login.ui.xml ใช้คำอธิบายประกอบ @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> {
   }
   ...
}

ขั้นตอนที่ 6 - สร้างไฟล์ CSS

สร้างไฟล์ CSS ภายนอกLogin.css และทรัพยากรที่ใช้ Java LoginResources.java ไฟล์เทียบเท่ากับสไตล์ css

.blackText {
   font-family: Arial, Sans-serif;
   color: #000000;
   font-size: 11px;
   text-align: left;
}
...

ขั้นตอนที่ 7 - สร้างไฟล์ทรัพยากรบน Java สำหรับไฟล์ CSS

package com.tutorialspoint.client;
...
public interface LoginResources extends ClientBundle {
   public interface MyCss extends CssResource {
      String blackText();

      ...
   }

   @Source("Login.css")
   MyCss style();
}

ขั้นตอนที่ 8 - แนบทรัพยากร CSS ในไฟล์ Java UI Code

แนบไฟล์ CSS ภายนอกLogin.css โดยใช้ Contructor ของคลาสวิดเจ็ตที่ใช้ Java Login.java

public Login() {
   this.res = GWT.create(LoginResources.class);
   res.style().ensureInjected();
   initWidget(uiBinder.createAndBindUi(this));
}

UIBinder ตัวอย่างที่สมบูรณ์

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงการใช้ UIBinder ใน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ตอนนี้สร้างเทมเพลต UiBinder และคลาสเจ้าของใหม่ (ไฟล์→ใหม่→ UiBinder)

เลือกแพ็กเกจไคลเอนต์สำหรับโปรเจ็กต์จากนั้นตั้งชื่อล็อกอิน ปล่อยให้ค่าเริ่มต้นอื่น ๆ ทั้งหมด คลิกปุ่ม Finish จากนั้นปลั๊กอินจะสร้างเทมเพลต UiBinder และคลาสเจ้าของใหม่

ตอนนี้สร้างไฟล์ Login.css ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

.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;
}

ตอนนี้สร้างไฟล์ LoginResources.java ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

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();
}

แทนที่เนื้อหาของ Login.ui.xml ใน src/com.tutorialspoint/client แพคเกจดังต่อไปนี้

<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>

แทนที่เนื้อหาของ Login.java ใน src/com.tutorialspoint/client แพคเกจดังต่อไปนี้

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("");
      }
   }
}

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งจะสาธิตการใช้งาน 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());   
   }    
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

โดยทั่วไปแอปพลิเคชันที่ใช้ GWT ประกอบด้วยโมดูลฝั่งไคลเอ็นต์และโมดูลฝั่งเซิร์ฟเวอร์ โค้ดฝั่งไคลเอ็นต์ทำงานในเบราว์เซอร์และโค้ดฝั่งเซิร์ฟเวอร์ทำงานในเว็บเซิร์ฟเวอร์ โค้ดฝั่งไคลเอ็นต์ต้องทำการร้องขอ HTTP ทั่วทั้งเครือข่ายเพื่อเข้าถึงข้อมูลฝั่งเซิร์ฟเวอร์

RPC, Remote Procedure Call คือกลไกที่ GWT ใช้ซึ่งโค้ดไคลเอ็นต์สามารถเรียกใช้เมธอดฝั่งเซิร์ฟเวอร์ได้โดยตรง

  • GWT RPC ขึ้นอยู่กับ servlet

  • GWT RPC เป็นแบบอะซิงโครนัสและไคลเอนต์จะไม่ถูกบล็อกระหว่างการสื่อสาร

  • การใช้ GWT RPC ออบเจ็กต์ Java สามารถส่งได้โดยตรงระหว่างไคลเอนต์และเซิร์ฟเวอร์ (ซึ่งต่อเนื่องกันโดยอัตโนมัติโดยเฟรมเวิร์ก GWT)

  • servlet ฝั่งเซิร์ฟเวอร์เรียกว่า service.

  • การเรียกโพรซีเดอร์ระยะไกลที่เรียกเมธอดของ servlets ฝั่งเซิร์ฟเวอร์จากโค้ดฝั่งไคลเอ็นต์เรียกว่า invoking a service.

ส่วนประกอบ GWT RPC

ต่อไปนี้เป็นส่วนประกอบสามอย่างที่ใช้ในกลไกการสื่อสาร GWT RPC

  • บริการระยะไกล (servlet ฝั่งเซิร์ฟเวอร์) ที่ทำงานบนเซิร์ฟเวอร์
  • รหัสลูกค้าเพื่อเรียกใช้บริการนั้น
  • วัตถุข้อมูล Java ซึ่งจะถูกส่งผ่านระหว่างไคลเอนต์และเซิร์ฟเวอร์

ไคลเอ็นต์และเซิร์ฟเวอร์ GWT ทั้งซีเรียลไลซ์และดีซีเรียลไลซ์ข้อมูลโดยอัตโนมัติดังนั้นนักพัฒนาจึงไม่จำเป็นต้องซีเรียลไลซ์ / ดีซีเรียลไลซ์อ็อบเจ็กต์และอ็อบเจ็กต์ข้อมูลสามารถเดินทางผ่าน HTTP ได้

แผนภาพต่อไปนี้แสดงสถาปัตยกรรม RPC

ในการเริ่มใช้ RPC เราจำเป็นต้องปฏิบัติตามข้อกำหนด GWT

เวิร์กโฟลว์การสื่อสาร RPC

ขั้นตอนที่ 1 - สร้างคลาสโมเดลต่อเนื่องได้

กำหนดวัตถุโมเดล java ที่ฝั่งไคลเอนต์ซึ่งควรทำให้เป็นอนุกรมได้

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

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

ขั้นตอนที่ 2 - สร้างอินเทอร์เฟซบริการ

กำหนดอินเทอร์เฟซสำหรับบริการบนฝั่งไคลเอ็นต์ที่ขยาย RemoteService แสดงรายการวิธีการบริการทั้งหมด

ใช้คำอธิบายประกอบ @RemoteServiceRelativePath เพื่อแม็พเซอร์วิสกับพา ธ ดีฟอลต์ของรีโมต servlet ที่สัมพันธ์กับ URL ฐานของโมดูล

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

ขั้นตอนที่ 3 - สร้าง Async Service Interface

กำหนดอินเทอร์เฟซแบบอะซิงโครนัสสำหรับบริการบนฝั่งไคลเอ็นต์ (ที่ตำแหน่งเดียวกับบริการที่กล่าวถึงข้างต้น) ซึ่งจะใช้ในโค้ดไคลเอ็นต์ GWT

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

ขั้นตอนที่ 4 - สร้างคลาส Servlet การใช้งานบริการ

ใช้อินเทอร์เฟซที่ฝั่งเซิร์ฟเวอร์และคลาสนั้นควรขยายคลาส 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;
   }
}

ขั้นตอนที่ 5 - อัปเดต Web.xml เพื่อรวมการประกาศ Servlet

แก้ไขตัวอธิบายการปรับใช้เว็บแอ็พพลิเคชัน (web.xml) เพื่อรวมการประกาศ 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>

ขั้นตอนที่ 6 - เรียกโพรซีเดอร์ระยะไกลใน Application Code

สร้างคลาสพร็อกซีบริการ

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

สร้าง AsyncCallback Handler เพื่อจัดการการเรียกกลับ RPC ที่เซิร์ฟเวอร์ส่งคืนข้อความกลับไปยังไคลเอนต์

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()); 
   }	   
}

เรียกใช้บริการระยะไกลเมื่อผู้ใช้โต้ตอบกับ 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());
         }
      });
   ...
   }
}

ตัวอย่างการสื่อสาร RPC ที่สมบูรณ์

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงตัวอย่างของการสื่อสาร RPC ใน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ตอนนี้สร้างไฟล์ Message.java ในรูปแบบ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

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;
   }
}

ตอนนี้สร้างไฟล์ MessageService.java ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

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);
}

ตอนนี้สร้างไฟล์ MessageServiceAsync.java ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

package com.tutorialspoint.client;

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

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

ตอนนี้สร้างไฟล์ MessageServiceImpl.java ในไฟล์ src/com.tutorialspoint/server แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

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;
   }   
}

อัพเดตเนื้อหาของตัวอธิบายการปรับใช้เว็บแอ็พพลิเคชันที่แก้ไข war/WEB-INF/web.xml เพื่อรวมการประกาศ 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>

แทนที่เนื้อหาของ HelloWorld.java ใน src/com.tutorialspoint/client แพคเกจดังต่อไปนี้

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);
   }    
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

GWT ให้การสนับสนุนที่ยอดเยี่ยมสำหรับการทดสอบโค้ดฝั่งไคลเอ็นต์อัตโนมัติโดยใช้กรอบการทดสอบ JUnit ในบทความนี้เราจะสาธิตการรวม GWT และ JUNIT

ดาวน์โหลด Junit archive

เว็บไซต์อย่างเป็นทางการของ JUnit - https://www.junit.org

ดาวน์โหลด Junit-4.10.jar

ระบบปฏิบัติการ ชื่อที่เก็บถาวร
Windows junit4.10.jar
ลินุกซ์ junit4.10.jar
Mac junit4.10.jar

จัดเก็บไฟล์ jar ที่ดาวน์โหลดไว้ในบางตำแหน่งในคอมพิวเตอร์ของคุณ เราเก็บไว้ที่C:/ > JUNIT

ค้นหาโฟลเดอร์การติดตั้ง GWT

ระบบปฏิบัติการ โฟลเดอร์การติดตั้ง GWT
Windows C: \ GWT \ gwt-2.1.0
ลินุกซ์ /usr/local/GWT/gwt-2.1.0
Mac /Library/GWT/gwt-2.1.0

คลาส GWTTestCase

GWT ให้ GWTTestCaseคลาสพื้นฐานที่ให้การรวม JUnit การรันคลาสที่คอมไพล์ซึ่งขยาย GWTTestCase ภายใต้ JUnit เปิดตัวเบราว์เซอร์ HtmlUnit ซึ่งทำหน้าที่เลียนแบบพฤติกรรมแอปพลิเคชันของคุณในระหว่างการดำเนินการทดสอบ

GWTTestCase เป็นคลาสที่ได้รับมาจาก TestCase ของ JUnit และสามารถเรียกใช้โดยใช้ JUnit TestRunner

ใช้ webAppCreator

GWT มีเครื่องมือบรรทัดคำสั่งพิเศษ webAppCreator ซึ่งสามารถสร้างกรณีทดสอบเริ่มต้นสำหรับเรารวมทั้งเป้าหมายมดและการกำหนดค่าการปล่อยคราสสำหรับการทดสอบทั้งในโหมดการพัฒนาและโหมดการผลิต

เปิดพรอมต์คำสั่งแล้วไปที่ C:\ > GWT_WORKSPACE > ที่คุณต้องการสร้างโปรเจ็กต์ใหม่พร้อมการสนับสนุนการทดสอบรันคำสั่งต่อไปนี้

C:\GWT_WORKSPACE>C:\GWT\gwt-2.1.0\webAppCreator 
   -out HelloWorld 
   -junit C:\JUNIT\junit-4.10.jar 
   com.tutorialspoint.HelloWorld

จุดสำคัญ

  • เรากำลังเรียกใช้ยูทิลิตีบรรทัดคำสั่ง webAppCreator
  • HelloWorld เป็นชื่อของโครงการที่จะสร้างขึ้น
  • อ็อพชัน -junit สั่งให้ webAppCreator เพิ่ม junit suppport ในโปรเจ็กต์
  • com.tutorialspoint.HelloWorld คือชื่อของโมดูล

ตรวจสอบผลลัพธ์

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

การทำความเข้าใจคลาสทดสอบ: 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();
         }
      });
   }
}

จุดสำคัญ

ซีเนียร์ บันทึก
1 คลาส HelloWorldTest ถูกสร้างขึ้นในแพ็คเกจ com.tutorialspoint.client ภายใต้ไดเร็กทอรี HelloWorld / test
2 คลาส HelloWorldTest จะมีกรณีทดสอบหน่วยสำหรับ HelloWorld
3 คลาส HelloWorldTest ขยายคลาส GWTTestCase ในแพ็คเกจ com.google.gwt.junit.client
4 คลาส HelloWorldTest มีเมธอดนามธรรม (getModuleName) ที่ต้องส่งคืนชื่อของโมดูล GWT สำหรับ HelloWorld นี่คือ com.tutorialspoint.HelloWorldJUnit
5 คลาส HelloWorldTest ถูกสร้างขึ้นด้วยกรณีทดสอบตัวอย่างสองกรณี testFieldVerifier, testSimple เราได้เพิ่ม testGreetingService
6 วิธีการเหล่านี้ใช้หนึ่งในฟังก์ชัน assert * จำนวนมากที่สืบทอดมาจากคลาส JUnit Assert ซึ่งเป็นบรรพบุรุษของ GWTTestCase
7 ฟังก์ชัน assertTrue (บูลีน) ยืนยันว่าอาร์กิวเมนต์บูลีนที่ส่งผ่านในการประเมินเป็นจริง ไม่เช่นนั้นการทดสอบจะล้มเหลวเมื่อรันใน JUnit

GWT - JUnit Integration Complete Example

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงตัวอย่างของการรวม JUnit ใน GWT

ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างไว้ด้านบน -

ขั้นตอน คำอธิบาย
1 นำเข้าโปรเจ็กต์ด้วยชื่อHelloWorldใน eclipse โดยใช้ตัวช่วยสร้างโปรเจ็กต์ที่มีอยู่ (ไฟล์→นำเข้า→ทั่วไป→โปรเจ็กต์ที่มีอยู่ไปยังพื้นที่ทำงาน)
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้จะเป็นโครงสร้างโครงการในคราส

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

แทนที่เนื้อหาของ HelloWorld.java ใน src/com.tutorialspoint/client แพคเกจดังต่อไปนี้

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+"!";
   }
}

แทนที่เนื้อหาของ HelloWorldTest.java ใน test/com.tutorialspoint/client แพคเกจดังต่อไปนี้

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));
      }
   }
}

รันกรณีทดสอบใน Eclipse โดยใช้คอนฟิกูเรชันการเรียกใช้ที่สร้างขึ้น

เราจะเรียกใช้การทดสอบหน่วยใน Eclipse โดยใช้การกำหนดค่าการเปิดตัวที่สร้างโดย webAppCreator สำหรับทั้งโหมดการพัฒนาและโหมดการผลิต

เรียกใช้การทดสอบ JUnit ในโหมดการพัฒนา

  • จากแถบเมนู Eclipse เลือก Run → Run Configurations ...
  • ภายใต้ส่วน JUnit เลือก HelloWorldTest-dev
  • ในการบันทึกการเปลี่ยนแปลงอาร์กิวเมนต์ให้กดใช้
  • ในการเรียกใช้การทดสอบให้กดเรียกใช้

หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

รันการทดสอบ JUnit ในโหมดการผลิต

  • จากแถบเมนู Eclipse เลือก Run → Run Configurations ...
  • ภายใต้ส่วน JUnit เลือก HelloWorldTest-prod
  • ในการบันทึกการเปลี่ยนแปลงอาร์กิวเมนต์ให้กดใช้
  • ในการเรียกใช้การทดสอบให้กดเรียกใช้

หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

GWT ให้ความสามารถที่ยอดเยี่ยมในการดีบักฝั่งไคลเอ็นต์และโค้ดฝั่งเซิร์ฟเวอร์

ในระหว่างโหมดการพัฒนา GWT Application อยู่ในโค้ด Java และไม่ได้แปลเป็น JavaScript

เมื่อแอปพลิเคชันกำลังทำงานในโหมดการพัฒนา Java Virtual Machine (JVM) จะเรียกใช้โค้ดแอปพลิเคชันเป็น bytecode Java ที่คอมไพล์โดยใช้ความสามารถ GWT เพื่อเชื่อมต่อกับหน้าต่างเบราว์เซอร์

GWT ใช้ปลั๊กอินที่ใช้เบราว์เซอร์เพื่อเชื่อมต่อกับ JVM

ดังนั้นนักพัฒนาจึงมีอิสระที่จะใช้ IDE ที่ใช้ Java เพื่อดีบักทั้งรหัส GWT ฝั่งไคลเอ็นต์และโค้ดฝั่งเซิร์ฟเวอร์

ในบทความนี้เราจะสาธิตการใช้งานการดีบักโค้ดไคลเอ็นต์ GWT โดยใช้ Eclipse เราจะทำงานต่อไปนี้ -

  • กำหนดจุดพักในโค้ดและดูใน BreakPoint Explorer
  • ทำตามขั้นตอนโค้ดทีละบรรทัดระหว่างการดีบัก
  • ดูค่าของตัวแปร
  • ตรวจสอบค่าของตัวแปรทั้งหมด
  • ตรวจสอบค่าของนิพจน์
  • แสดงสแต็กเฟรมสำหรับเธรดที่ถูกระงับ

ตัวอย่างการดีบัก

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการสาธิตการดีบักแอปพลิเคชัน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>Debugging Application Demonstration</h1>
      <div id = "gwtContainer"></div>
   </body>
</html>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งเราจะแสดงให้เห็นถึงความสามารถในการดีบักของ GWT Code

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+"!";
   }
}

ขั้นตอนที่ 1 - วาง BreakPoints

วางเบรกพอยต์ในบรรทัดแรกของ onModuleLoad() ของ HelloWorld.java

ขั้นตอนที่ 2 - ดีบักแอปพลิเคชัน

ตอนนี้คลิกที่

เมนูแอปพลิเคชันแก้ไขข้อบกพร่องแล้วเลือกHelloWorld แอปพลิเคชันเพื่อแก้ไขข้อบกพร่องของแอปพลิเคชัน

หากทุกอย่างเรียบร้อยดีคุณต้องเห็น GWT Development Mode ที่ใช้งานอยู่ใน Eclipse ที่มี URL ดังที่แสดงด้านล่าง ดับเบิลคลิกที่ URL เพื่อเปิดแอปพลิเคชัน GWT

ทันทีที่แอปพลิเคชันเปิดตัวคุณจะเห็นโฟกัสที่เบรกพอยต์ Eclipse เนื่องจากเราได้วางเบรกพอยต์ไว้ในบรรทัดแรกของวิธีจุดเข้า

คุณสามารถดู stacktrace สำหรับเธรดที่ถูกระงับ

คุณสามารถดูค่าสำหรับนิพจน์

คุณสามารถดูรายการจุดพักที่วางไว้

ตอนนี้ให้กด F6 จนกว่าคุณจะถึงบรรทัดสุดท้ายของเมธอด onModuleLoad () ในการอ้างอิงปุ่มฟังก์ชัน F6 จะตรวจสอบโค้ดทีละบรรทัด F5 ขั้นตอนข้างในเพิ่มเติมและ F8 จะกลับมาใช้งานแอปพลิเคชันต่อ ตอนนี้คุณสามารถดูรายการค่าของตัวแปรทั้งหมดของเมธอด onModuleLoad ()

โค้ดไคลเอ็นต์ GWT สามารถดีบักได้ในลักษณะเดียวกับที่สามารถดีบัก Java Application ได้ วางจุดพักไว้ที่บรรทัดใดก็ได้และเล่นกับความสามารถในการดีบักของ GWT

GWT มีสามวิธีในการทำให้แอปพลิเคชัน GWT เป็นสากลเราจะสาธิตการใช้ Static String Internationalization ที่ใช้กันมากที่สุดในโครงการต่างๆ

ซีเนียร์ เทคนิคและคำอธิบาย
1

Static String Internationalization

เทคนิคนี้แพร่หลายมากที่สุดและต้องการค่าใช้จ่ายน้อยมากในรันไทม์ เป็นเทคนิคที่มีประสิทธิภาพมากในการแปลสตริงทั้งค่าคงที่และพารามิเตอร์ที่ง่ายที่สุดในการนำไปใช้

การทำให้เป็นสากลของสตริงแบบคงที่ใช้ไฟล์คุณสมบัติ Java มาตรฐานเพื่อจัดเก็บสตริงที่แปลแล้วและข้อความที่กำหนดพารามิเตอร์และอินเตอร์เฟส Java ที่พิมพ์มากถูกสร้างขึ้นเพื่อดึงค่า

2

Dynamic String Internationalization

เทคนิคนี้มีความยืดหยุ่นมาก แต่ช้ากว่าการทำให้เป็นสากลของสตริงแบบคงที่ หน้าโฮสต์มีสตริงที่แปลเป็นภาษาท้องถิ่นดังนั้นจึงไม่จำเป็นต้องคอมไพล์แอปพลิเคชันใหม่เมื่อเราเพิ่มภาษาใหม่ หากแอปพลิเคชัน GWT จะรวมเข้ากับระบบโลคัลไลเซชันฝั่งเซิร์ฟเวอร์ที่มีอยู่แล้วจะต้องใช้เทคนิคนี้

3

Localizable Interface

เทคนิคนี้มีประสิทธิภาพมากที่สุดในสามเทคนิค การใช้งาน Localizable ทำให้เราสามารถสร้างเวอร์ชันที่กำหนดเองได้ เป็นเทคนิคการทำให้เป็นสากลขั้นสูง

เวิร์กโฟลว์ของการทำให้แอปพลิเคชัน GWT เป็นสากล

ขั้นตอนที่ 1 - สร้างไฟล์คุณสมบัติ

สร้างไฟล์คุณสมบัติที่มีข้อความที่จะใช้ในแอปพลิเคชัน เราได้สร้างไฟล์HelloWorldMessages.properties ไฟล์ในตัวอย่างของเรา

enterName = Enter your name
clickMe = Click Me
applicationTitle = Application Internationalization Demonstration
greeting = Hello {0}

สร้างไฟล์คุณสมบัติที่มีค่าที่แปลเฉพาะสำหรับโลแคล เราได้สร้างไฟล์HelloWorldMessages_de.propertiesไฟล์ในตัวอย่างของเรา ไฟล์นี้มีคำแปลเป็นภาษาเยอรมัน _de ระบุภาษาเยอรมันและเราจะรองรับภาษาเยอรมันในแอปพลิเคชันของเรา

หากคุณกำลังสร้างไฟล์คุณสมบัติโดยใช้ Eclipse ให้เปลี่ยนการเข้ารหัสของไฟล์เป็น UTF-8 เลือกไฟล์จากนั้นคลิกขวาเพื่อเปิดหน้าต่างคุณสมบัติเลือกการเข้ารหัสไฟล์ข้อความเป็น Other UTF-8. ใช้และบันทึกการเปลี่ยนแปลง

enterName = Geben Sie Ihren Namen
clickMe = Klick mich
applicationTitle = Anwendung Internationalisierung Demonstration
greeting = Hallo {0}

ขั้นตอนที่ 2 - เพิ่มโมดูล i18n ไปยังไฟล์ XML Descriptor Module

อัปเดตไฟล์โมดูล HelloWorld.gwt.xml เพื่อรวมการสนับสนุนภาษาเยอรมัน

<?xml version = "1.0" encoding = "UTF-8"?>
<module rename-to = 'helloworld'>
   ...
   <extend-property name = "locale" values="de" />
   ...
</module>

ขั้นตอนที่ 3 - สร้างส่วนต่อประสานที่เทียบเท่ากับไฟล์คุณสมบัติ

สร้างอินเทอร์เฟซ HelloWorldMessages.java โดยการขยายอินเทอร์เฟซ Messages ของ GWT เพื่อรวมการสนับสนุนสำหรับ internalization ควรมีชื่อเมธอดเดียวกันกับคีย์ในไฟล์คุณสมบัติ Place holder จะถูกแทนที่ด้วย 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);
}

ขั้นตอนที่ 4 - ใช้อินเทอร์เฟซข้อความในคอมโพเนนต์ UI

ใช้วัตถุของ HelloWorldMessages ใน HelloWorld เพื่อรับข้อความ

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);
   ...
   }
}

Internationalization - ตัวอย่างที่สมบูรณ์

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการแสดงความสามารถในการทำให้เป็นสากลของแอปพลิเคชัน GWT

ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ตอนนี้สร้างไฟล์ HelloWorldMessages.properties ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

enterName = Enter your name
clickMe = Click Me
applicationTitle = Application Internationalization Demonstration
greeting = Hello {0}

ตอนนี้สร้างไฟล์ HelloWorldMessages_de.properties ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

enterName = Geben Sie Ihren Namen
clickMe = Klick mich
applicationTitle = Anwendung Internationalisierung Demonstration
greeting = Hallo {0}

ตอนนี้สร้างคลาส HelloWorldMessages.java ในไฟล์ src/com.tutorialspoint/client แพคเกจและวางเนื้อหาต่อไปนี้ไว้ในนั้น

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);
}

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งเราจะแสดงให้เห็นถึงความสามารถในการทำให้เป็นสากลของ GWT Code

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 + "!");
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

ตอนนี้อัปเดต URL เพื่อให้มี locale = de.Set URL - http://127.0.0.1:8888/HelloWorld.html?gwt.codesvr=127.0.0.1:9997&locale=de. หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังต่อไปนี้ -

โดยปกติแอปพลิเคชัน GWT เป็นแอปพลิเคชันหน้าเดียวที่ใช้ JavaScript และไม่มีหน้าจำนวนมากดังนั้นเบราว์เซอร์จึงไม่ติดตามการโต้ตอบของผู้ใช้กับแอปพลิเคชัน ในการใช้ฟังก์ชันประวัติของเบราว์เซอร์แอปพลิเคชันควรสร้างส่วนย่อย URL ที่ไม่ซ้ำกันสำหรับแต่ละหน้าที่นำทางได้

GWT ให้ History Mechanism เพื่อรับมือกับสถานการณ์นี้

GWT ใช้คำ tokenซึ่งเป็นเพียงสตริงที่แอปพลิเคชันสามารถแยกวิเคราะห์เพื่อกลับไปยังสถานะเฉพาะ แอปพลิเคชันจะบันทึกโทเค็นนี้ในประวัติของเบราว์เซอร์เป็นส่วนย่อยของ URL

ตัวอย่างเช่นโทเค็นประวัติชื่อ "pageIndex1" จะถูกเพิ่มลงใน URL ดังนี้ -

http://www.tutorialspoint.com/HelloWorld.html#pageIndex0

เวิร์กโฟลว์การจัดการประวัติ

ขั้นตอนที่ 1 - เปิดใช้งานการสนับสนุนประวัติ

ในการใช้การสนับสนุนประวัติ GWT อันดับแรกเราต้องฝัง iframe ต่อไปนี้ลงในหน้าโฮสต์ HTML ของเรา

<iframe src = "javascript:''"
   id = "__gwt_historyFrame"
   style = "width:0;height:0;border:0"></iframe>

ขั้นตอนที่ 2 - เพิ่มโทเค็นในประวัติ

ตัวอย่างต่อไปนี้สถิติวิธีการเพิ่มโทเค็นในประวัติเบราว์เซอร์

int index = 0;
History.newItem("pageIndex" + index);

ขั้นตอนที่ 3 - เรียกคืนโทเค็นจากประวัติ

เมื่อผู้ใช้ใช้ปุ่มย้อนกลับ / ไปข้างหน้าของเบราว์เซอร์เราจะเรียกคืนโทเค็นและอัปเดตสถานะแอปพลิเคชันของเราตามนั้น

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);
      }
   }
});

ตอนนี้เรามาดู History Class ในการดำเนินการ

ชั้นเรียนประวัติศาสตร์ - ตัวอย่างที่สมบูรณ์

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการสาธิตการจัดการประวัติของแอปพลิเคชัน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งเราจะสาธิตการจัดการประวัติในรหัส GWT

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);
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

  • ตอนนี้คลิกที่แต่ละแท็บเพื่อเลือกหน้าต่างๆ

  • คุณควรสังเกตเมื่อเลือกแต่ละแท็บ url ของแอปพลิเคชันจะเปลี่ยนไปและ #pageIndex จะถูกเพิ่มลงใน url

  • นอกจากนี้คุณยังสามารถเห็นว่าปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์เปิดใช้งานอยู่ในขณะนี้

  • ใช้ปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์และคุณจะเห็นแท็บต่างๆที่ได้รับเลือกตามนั้น

GWT รองรับการจัดการประวัติเบราว์เซอร์โดยใช้คลาสประวัติซึ่งคุณสามารถอ้างอิงGWT -บทคลาสประวัติศาสตร์

GWT ใช้คำ tokenซึ่งเป็นเพียงสตริงที่แอปพลิเคชันสามารถแยกวิเคราะห์เพื่อกลับไปยังสถานะเฉพาะ แอปพลิเคชันจะบันทึกโทเค็นนี้ในประวัติของเบราว์เซอร์เป็นส่วนย่อยของ URL

ในGWT -บทคลาสประวัติศาสตร์เราจัดการการสร้างโทเค็นและการตั้งค่าในประวัติโดยการเขียนโค้ด

ในบทความนี้เราจะพูดถึงวิดเจ็ตพิเศษไฮเปอร์ลิงก์ซึ่งสร้างโทเค็นและจัดการประวัติให้เราโดยอัตโนมัติและให้ความสามารถในการบุ๊กมาร์ก

ตัวอย่างการบุ๊กมาร์ก

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการสาธิตการบุ๊กมาร์กของแอปพลิเคชัน GWT

ขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งเราจะสาธิตการทำบุ๊กมาร์กในรหัส GWT

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);
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

  • ตอนนี้คลิกที่ 1, 2 หรือ 3 คุณจะสังเกตได้ว่าแท็บเปลี่ยนไปตามดัชนี

  • คุณควรสังเกตเมื่อคุณคลิกที่ 1,2 หรือ 3 url ของแอปพลิเคชันจะเปลี่ยนไปและ #pageIndex จะถูกเพิ่มลงใน url

  • นอกจากนี้คุณยังสามารถเห็นว่าปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์เปิดใช้งานอยู่ในขณะนี้

  • ใช้ปุ่มย้อนกลับและไปข้างหน้าของเบราว์เซอร์และคุณจะเห็นแท็บต่างๆที่ได้รับเลือกตามนั้น

  • คลิกขวาที่ 1, 2 หรือ 3 คุณจะเห็นตัวเลือกต่างๆเช่นเปิดเปิดในหน้าต่างใหม่เปิดในแท็บใหม่เพิ่มรายการโปรดเป็นต้น

  • คลิกขวาที่ 3 เลือกเพิ่มในรายการโปรด บันทึกบุ๊คมาร์คเป็นหน้า 3

  • เปิดรายการโปรดและเลือกหน้า 3 คุณจะเห็นแท็บที่สามที่เลือก

เฟรมเวิร์กการบันทึกเลียนแบบ java.util.logging ดังนั้นจึงใช้ไวยากรณ์เดียวกันและมีลักษณะการทำงานเหมือนกับรหัสการบันทึกฝั่งเซิร์ฟเวอร์

การบันทึก GWT กำหนดค่าโดยใช้ไฟล์. gwt.xml

เราสามารถกำหนดค่าการบันทึกให้เปิด / ปิดได้ เราสามารถเปิด / ปิดการใช้งานเครื่องจัดการเฉพาะและเปลี่ยนระดับการบันทึกเริ่มต้น

ประเภทของ Logger

คนตัดไม้จัดอยู่ในโครงสร้างแบบต้นไม้โดยมี Root Logger อยู่ที่รากของต้นไม้

ชื่อของคนตัดไม้กำหนดความสัมพันธ์แม่ / ลูกโดยใช้ . เพื่อแยกส่วนของชื่อ

ตัวอย่างเช่นถ้าเรามีคนตัดไม้สองคน Hospital.room1 และ Hospital.room2 พวกเขาก็เป็นพี่น้องกันโดยมีพ่อแม่เป็นคนตัดไม้ชื่อ Hospital คนตัดไม้ในโรงพยาบาล (และคนตัดไม้ที่มีชื่อซึ่งไม่มีจุด ".") มี Root Logger เป็นพาเรนต์

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("");

เครื่องจัดการบันทึก

GWT มีเครื่องจัดการเริ่มต้นซึ่งจะแสดงรายการบันทึกที่สร้างขึ้นโดยใช้เครื่องบันทึก

ตัวจัดการ เข้าสู่ระบบ คำอธิบาย
SystemLogHandler stdout ข้อความเหล่านี้สามารถเห็นได้เฉพาะในโหมดการพัฒนาในหน้าต่าง DevMode
DevelopmentModeLogHandler หน้าต่าง DevMode บันทึกโดยเรียกเมธอด GWT.log ข้อความเหล่านี้สามารถเห็นได้เฉพาะในโหมดการพัฒนาในหน้าต่าง DevMode
ConsoleLogHandler คอนโซล javascript บันทึกไปยังคอนโซล javascript ซึ่งใช้โดย Firebug Lite (สำหรับ IE), Safari และ Chrome
FirebugLogHandler Firebug บันทึกไปที่คอนโซล firebug
PopupLogHandler ป๊อปอัพ บันทึกไปยังป๊อปอัปซึ่งอยู่ที่มุมซ้ายบนของแอปพลิเคชันเมื่อเปิดใช้งานตัวจัดการนี้
SimpleRemoteLogHandler เซิร์ฟเวอร์ ตัวจัดการนี้จะส่งข้อความบันทึกไปยังเซิร์ฟเวอร์ซึ่งจะถูกบันทึกโดยใช้กลไกการบันทึกฝั่งเซิร์ฟเวอร์

กำหนดค่าการบันทึกในแอปพลิเคชัน GWT

ไฟล์ HelloWorld.gwt.xml จะถูกกำหนดค่าให้เปิดใช้งานการบันทึก GWT ดังนี้ -

# 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" />

ใช้คนตัดไม้เพื่อบันทึกการกระทำของผู้ใช้

/* Create Root Logger */
private static Logger rootLogger = Logger.getLogger("");
...
rootLogger.log(Level.SEVERE, "pageIndex selected: " + event.getValue());
...

ตัวอย่างกรอบการบันทึก

ตัวอย่างนี้จะนำคุณผ่านขั้นตอนง่ายๆในการสาธิตความสามารถในการบันทึกของแอปพลิเคชัน GWT ทำตามขั้นตอนต่อไปนี้เพื่ออัปเดตแอปพลิเคชัน GWT ที่เราสร้างในGWT - สร้างบทแอปพลิเคชัน -

ขั้นตอน คำอธิบาย
1 สร้างโครงการที่มีชื่อHelloWorldภายใต้แพคเกจcom.tutorialspointตามที่อธิบายไว้ในGWT - สร้างแอพลิเคชันบท
2 แก้ไขHelloWorld.gwt.xml , HelloWorld.css , HelloWorld.htmlและHelloWorld.javaตามที่อธิบายด้านล่าง เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง
3 คอมไพล์และเรียกใช้แอปพลิเคชันเพื่อตรวจสอบผลลัพธ์ของตรรกะที่ใช้งาน

ต่อไปนี้เป็นเนื้อหาของตัวอธิบายโมดูลที่แก้ไข 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>

ต่อไปนี้เป็นเนื้อหาของไฟล์ Style Sheet ที่แก้ไข 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;
}

ต่อไปนี้เป็นเนื้อหาของไฟล์โฮสต์ HTML ที่แก้ไข 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>

ให้เรามีเนื้อหาต่อไปนี้ของไฟล์ Java src/com.tutorialspoint/HelloWorld.java ซึ่งเราจะสาธิตการทำบุ๊กมาร์กในรหัส GWT

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);
   }
}

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดที่ทำให้เรารวบรวมและเรียกใช้โปรแกรมประยุกต์ในโหมดการพัฒนาในขณะที่เราทำในGWT - สร้างแอพลิเคชันบท หากทุกอย่างเรียบร้อยกับแอปพลิเคชันของคุณสิ่งนี้จะให้ผลลัพธ์ดังนี้ -

ตอนนี้คลิกที่ 1, 2 หรือ 3 คุณสามารถสังเกตได้เมื่อคุณคลิกที่ 1,2 หรือ 3 คุณจะเห็นบันทึกกำลังจะพิมพ์ออกมาโดยแสดง pageIndex ตรวจสอบเอาต์พุตคอนโซลใน Eclipse คุณสามารถดูบันทึกกำลังพิมพ์ในคอนโซล 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

ตอนนี้อัปเดตตัวอธิบายโมดูล src/com.tutorialspoint/HelloWorld.gwt.xml เพื่อเปิดใช้งาน 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>

เมื่อคุณพร้อมกับการเปลี่ยนแปลงทั้งหมดแล้วให้โหลดแอปพลิเคชันใหม่โดยรีเฟรชหน้าต่างเบราว์เซอร์ (กด F5 / ปุ่มโหลดซ้ำของเบราว์เซอร์) สังเกตเห็นหน้าต่างป๊อปอัปปรากฏขึ้นที่มุมซ้ายบนของแอปพลิเคชัน

ตอนนี้คลิกที่ 1, 2 หรือ 3 คุณสามารถสังเกตได้เมื่อคุณคลิกที่ 1,2 หรือ 3 คุณจะเห็นบันทึกกำลังพิมพ์โดยแสดง pageIndex ในหน้าต่างป๊อปอัป