วันพุธที่ 16 กรกฎาคม พ.ศ. 2557

Grails  คือ Rapid Web Framework ที่ใช้ภาษา Groovy ในการพัฒนา  ได้แรงบันดาลใจจาก Ruby on Rails  นั่นคือใช้แนวคิด MVC โดยแต่ละส่วนมีรายละเอียดดังนี้

M = Model สำหรับ Grails จะเรียกว่า Domain Class ซึ่ง Grails ได้เตรียม Persistence Framework ชื่อ GORM ซึ่งใช้ ActiveRecord Pattern โดยมีลักษณะเป็น Rich Model คือส่วน data และส่วน operation อยู่ใน class เดียวกัน  Business Logic และ Business Rule ต่างๆ จะอยู่ใน Domain Class เลย    โดยมีความสามารถต่างๆ มากมาย  เช่น การค้นหาข้อมูลซึ่งมีการใช้ dynamic method  ทำให้ค้นข้อมูลได้ง่ายและยืดหยุ่น   ซึ่งเราระบุชื่อฟิลด์ที่เป็นเงื่อนไขการค้นลงใจชื่อ method ได้เลย  เช่น
def user = User.findByUsernameAndPassword('user1', 'password')


V = View คือส่วนแสดงผลลัพธ์และส่วนรับข้อมูลเพื่อนำไปใช้หรือประมวลผล  code จะเป็น HTML ผสมกับ tag library ของ Grails เอง  จะมีเฉพาะ code กำหนดรูปแบบการแสดงผล  หรือ logic เฉพาะส่วนแสดงผลเท่านั้น  ตัวอย่างดังนี้
§  ${topic.title}


C = Controller เป็นที่ซึ่งมี logic สำหรับควบคุม flow ของเพจ  ในแต่ละ Controller จะเก็บ Action ต่างๆ  ซึ่งเรา define ไว้ด้วย Closure  ในการเรียกแต่ละเพจจะเป็นการระบุ Action ที่ต้องการกระทำ  ไม่ว่าจะเป็นเพื่อแสดงผล  หรือประมวลผลใดๆ ก็ตาม  มีรูปแบบดังนี้
โดยที่ controller คือชื่อ class Controller และ action คือชื่อ Closure
ในระบบเล็กๆ  เราสามารถใส่ code ส่วนเรียกใช้ Domain Class ใน Action ได้เลย  แต่หากเป็นระบบใหญ่ควรจะใส่ไว้ที่ Service จะดีกว่า
Data Binding มีการ bind ค่าจาก html form มายัง Model ด้วยการส่งตัวแปร params เข้าไปใน constructor ของ Domain Class ดังนี้
def user = new User(params)

Domain Relationship  Domain Class มีความสัมพันธ์ได้ดังนี้
§  one to one
§  one to many
§  many to many
โดยที่ความสัมพันธ์ต่างๆ จะถูกกำหนดไว้ที่ Domain Class เลย
สำหรับส่วนสุดท้ายผมไม่รู้จะจัดหัวข้ออย่างไรดีจึงจะเหมาะ  เพราะมันเป็นแค่ประโยคสั้นๆ เป็นเหมือน tip&trick หรือข้อควรจำเท่านั้น   ผมจึงของ list ไว้ตรงนี้เลยแล้วกันครับ  (อาจะมีเพิ่มได้ภายหลัง)
1.    Grails เริ่มต้นด้วย grails command
2.    เริ่มต้นใช้ grails ต้องต่อ Internet
3.    เมื่อสั่ง grails run-app สามารถเรียก app ผ่าน IE ได้เลยเพราะ grails จะทำการ compile และ start jetty ให้แล้ว
4.    ขณะ run-app อยู่นั้น  หากเราแก้ไข code ส่วนใดก็ตามและทำการบันทึกเท่านั้น grails จะ re-compile code นั้นให้เราเลย
5.    topic?.id หมายความว่าหาก object topic ไม่เป็น null ให้อ้างค่า id
6.    flash.message ได้แนวคิดจาก Rails เป็น session variable ที่มี life time = current request to next request
7.    ฟิลด์ที่สร้างใน Domain Class จะถูกนำไปสร้างเป็น table field ในฐานข้อมูล   นอกจากฟิลด์ที่มีชื่ออยู่ใน list ของ static transients
8.    ตารางที่ได้จาก Domain Class จะมีฟิลด์ ID ซึ่งเป็น identity และ version ไว้สำหรับทำ Optimistic Locking
9.    ในหน้าจอ add หรือ edit ของ scaffold นั้น ฟิลด์ต่างๆ จะแสดงและเรียงตามที่เราระบุในส่วน constrain ของ Domain Class
10. เราสามารถเก็บฟิลด์ CreatedDate ใน Domain Class ได้  และ assign ค่าให้เลยก็ได้หากไม่ต้องการให้ผู้ใช้กรอก
11. default ของ GORM ใช้ Optimistic Locking



ทดสอบ Hello World with Grails Application

ต่อมาลองสร้าง Grails Application อย่างง่ายกันครับ ดังนี้
1. สร้าง application ด้วยคำสั่ง   
Quote
grails create-app HelloWorld

2. Grails จะสร้าง folder HelloWorld ซึ่งมีโครงสร้างของ folder ดังนี้
Attached Image 

จากรูปอธิบายคร่าวๆ ได้ดังนี้
conf => จะเก็บ configuration ต่างๆ เช่น DataSource, BootStrap, UrlMapping 

----- ส่วนของ MVC framework [ Model-View-Controller ] ------
controllers => เก็บ Controller
domain => Domain หรือ Model ซึ่งเทียบได้กับ Java Bean, Value Object ประมาณนั้น
view => ใน Java คือ JSP  แต่ใน Grails จะชื่อว่า GSP 
โดยใน view จะมี 
ชื่อ folder แยกตาม domain 
ชื่อ file จะแยกตาม method ใน controller

lib => สำหรับ library ต่างๆ ที่ต้องการใช้เช่น JDBC  Driver เป็นต้น

test จะประกอบไปด้วย unit testing และ integration testing ซึ่งจะอธิบายการใช้งานในหัว Part ถัดๆ ไป

3. Start Grails Application โดยจะต้องเข้าไปที่ folder HelloWorld ก่อน แล้วพิมพ์คำสั่งดังนี้
Quote
grails run-app


ให้ทำการ run  URL นี้ใน browser :::  
http://localhost:8080/HelloWorld จะได้ผลดังนี้
Attached Image 



วันนี้มาลองสร้างระบบ User Profile แบบง่ายๆ กันครับ

ผมวางระบบคร่าวๆ ไว้ดังนี้
- Domain class ชื่อ User จะประกอบไปด้วย  username, password, firstname, lastname
- Controller ชื่อ User

มาเริ่มกันเลย
1. สร้าง domain class ด้วยคำสั่ง
Quote
grails create-domain-class User

จากคำสั่งนี้จะสร้าง file User.groovy ใน folder domain ตาม structure ของ Grails Application
ต่อมาให้เปิด file ขึ้นมาแล้ว edit ตามนี้
class User {
        String username;
        String password;
        String firstname;
        String lastname
}

2. สร้าง controller ด้วยคำสั่ง
Quote
grails create-controller User

จากคำสั่งนี้จะสร้าง file UserController.groovy ใน folder controllers ตาม structure ของ Grails Application
ต่อมาให้เปิด file ขึ้นมาแล้ว edit ตามนี้
class UserController {
        def scaffold = User;
        //def index = { }
}



โดย 
Scaffold นั้นเป็นการกำหนดให้ grails ทำการสร้าง views และ Action/Method ต่างๆ ใน controller ตาม create/read/update/delete (CRUD) operation แบบอัตโนมัติ  

3. start grails application ด้วยคำสั่ง grails run-app เหมือนเดิม จะได้ผลดังนี้
Attached Image 

Attached Image 

Attached Image 

จะสังเกตุได้ว่า ผมไม่ต้องไปยุ่งเกี่ยวกับการกำหนด Database เลย เนื่องจาก default database ของ Grails นั้นคือ HSQLDB แต่ถ้าต้องใช้ database ตัวอื่น จะต้องกำหนดใน /conf/DataSource.groovy และนำ JDBC driverมาใส่ไว้ใน /lib/