Pembaca yang budiman, setelah artikel sebelumnya kita sudah belajar bagaimana membuat sebuah aplikasi web dengan melibatkan GORM (Grails Object Relational Mapping), saya berharap para pembaca bisa mengerti secara konseptual kemudahan-kemudahan yang ditawarkan oleh Grails Framework. Dan saya yakin pasti akan begitu banyak pertanyaan-pertanyaan yang terbesit dalam benak pembaca semua. Bahkan mungkin ada yang ingin sekali mendebatkan beberapa point dalam tulisan-tulisan saya sebelumnya tentang Grails tersebut. Yang mungkin bisa saya katakan adalah kreatifitas yang mungkin muncul atas dasar sebuah tulisan dengan bentuk ingin bertanya, ingin mendebatkan, adalah sebuah hal yang positif, kreatifitas tersebut menandakan bahwa pembaca adalah orang yang kritis.
Untuk kali ini tulisan saya akan mencoba meraba kira-kira pertanyaan-pertanyaan yang terbesit dalam benak pembaca dan saya akan mencoba menjawab pertanyaan tersebut dengan segala pengalaman apa yang pernah saya lakukan dengan Grails Framework ini. Dan untuk rencana pembahasan Grails Framework selanjutnya berdasarkan urutan yang ada pada tulisan ini, kita belakangin aja dulu okay?
1. Bagaimana jika web aplikasi dengan Grails tersebut menggunakan MySQL sebagai databasenya.
Ya, mungkin ini adalah pertanyaan paling banyak yang muncul jika saja saya membuat sesi pertanyaan pada tulisan-tulisan saya tentang Grails Framework sebelumnya. Seperti yang sama-sama kita ketahui bahwa distribusi Grails Framework datang dengan dilengkapi oleh fitur “in memory database” yang bertujuan supaya para developer aplikasi web yang menggunakan Grails Framework bisa langsung melakukan kegiatan coding tanpa harus setup ini dan itu. Fitur “in memory database” pada Grails Framework sebetulnya seperti ini, Grails menggunakan Database H2 yang ter-setting dengan memanfaatkan memory dalam operating system untuk menyimpan data-data web aplikasi yang digunakan, tentu saja metode jenis ini tidak bisa di implementasikan dalam live production aplikasi web tersebut.
Biasanya kita menggunakan database seperti Oracle, MySQL, PostgreSQL dan lain-lain dalam live production sebuah aplikasi web. Untuk membuat supaya aplikasi web dengan Grails Framework yang kita buat pada tulisan lalu dapat menggunakan database MySQL, silahkan ikuti cara yang saya paparkan dibawah ini.
Pada project grails-book-catalog yang sudah kita buat sebelumnya, silahkan buka file DataSource.groovy yang ada pada folder grails-app/conf, kemudian edit file tersebut menjadi seperti code-code berikut ini:
dataSource {
pooled = true
driverClassName = "com.mysql.jdbc.Driver"
username = "root"
password = "root"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop"
url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
}
}
test {
dataSource {
dbCreate = "update"
url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:mysql://localhost:3306/grails_book_catalog?autoReconnect=true"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
Perhatikan source code diatas, kita coba mengunakan database MySQL pada konfigurasi tersebut dengan detail nama database-nya adalah “grails_book_catalog”, username “root” dan password “root”, driver database yang kita gunakan adalah “com.mysql.jdbc.Driver”, terkecuali driver database, silahkan sesuaikan sendiri dengan setting-an MySQL database yang ingin anda pakai.
Oleh karena kita menggunakan driver database yang berbeda dengan apa yang di generate secara otomatis oleh Grails, maka langkah selanjutnya adalah memasukkan library database MySQL tersebut ke dalam project aplikasi web kita. Silahkan buka file “BuildConfig.groovy” dan cari baris di bawah ini:
Oleh karena kita menggunakan driver database yang berbeda dengan apa yang di generate secara otomatis oleh Grails, maka langkah selanjutnya adalah memasukkan library database MySQL tersebut ke dalam project aplikasi web kita. Silahkan buka file “BuildConfig.groovy” dan cari baris di bawah ini:
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.22'
}
Kemudian hapus tanda baca “//” sehingga menjadi seperti dibawah ini:
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
runtime 'mysql:mysql-connector-java:5.1.22'
}
Dengan cara seperti ini, kita sudah memasukkan driver MySQL database ke dalam project aplikasi web kita. Sebelum kita menjalankan project aplikasi web kita ini, mari kita buat dulu database "grails_book_catalog" dalam database MySQL kita, seperti gambar beriikut ini:
Setelah database tersebut sudah kita buat, sekarang jalankan project aplikasi web kita lagi dengan cara mengetik grails command “grails run-app”, dan setelah aplikasi web tersebut berjalan, silahkan periksa lagi database MySQL kita tadi untuk memastikan apakah benar table-table tersebut telah terbuat secara otomatis. Saya memeriksannya dengan cara seperti gambar berikut ini:
Setelah database tersebut sudah kita buat, sekarang jalankan project aplikasi web kita lagi dengan cara mengetik grails command “grails run-app”, dan setelah aplikasi web tersebut berjalan, silahkan periksa lagi database MySQL kita tadi untuk memastikan apakah benar table-table tersebut telah terbuat secara otomatis. Saya memeriksannya dengan cara seperti gambar berikut ini:
Yes, sekarang aplikasi web saya sudah menggunakan database MySQL, bagaimana dengan aplikasi web anda?
2. Bagaimana jika ada initial data dalam database?
Dalam sebuah pembuatan sebuah aplikasi, sudah merupakan suatu hal yang lazim jika sebelumnya ada data-data pada database tanpa melibatkan user yang mengisi database melalui aplikasi tersebut. Grails Framework memungkinkan kita membuat inisialisasi data sebelum aplikasi tersebut digunakan. Katakanlah seperti ini, project grails-book-catalog kita kemarin memiliki data-data Author sebagai sebuah data awal.
Untuk membuat aplikasi web tersebut memiliki data-data Author tanpa melibatkan user, silahkan ikuti langkah-langkah berikut ini. Bukalah file “Bootstrap.groovy” pada folder “grails-app/conf” dan edit file tersebut sehingga menjadi seperti ini:
import org.learn.grails.Author
class BootStrap {
def init = { servletContext ->
if(Author.count == 0){
def authorMojo = new Author(authorName: "Mojo", age: 18, address: "Jakarta").save(failOnError:true )
def authorJosescalia = new Author(authorName: "Josescalia", age: 29, address: "Medan").save(failOnError:true )
def authorJagoanNeon = new Author(authorName: "Jagoan Neon", age: 19, address: "Bandung").save(failOnError:true )
}
}
def destroy = {
}
}
File Bootstrap.groovy ini adalah file yang akan dieksekusi pertama kali oleh aplikasi web kita, tepat setelah aplikasi web kita ini kita jalankan, dalam baris tersebut kita melihat bahwa jika jumlah Author sama dengan nol (0) maka akan dibuat 3 buah object Author yang masing-masing object tersebut akan disimpan ke dalam database dengan statement “.save(failOnError:true)”.Kemudian stop aplikasi web kita tadi dengan menggunakan grails command “grails stop-app” dan kemudian jalankan kembali dengan menggunakan grails command “grails run-app”, dan ketika aplikasi web tersebut sudah berjalan, silahkan periksa apakah benar data tersebut sudah ada dengan cara membuka URL berikut ini pada browser anda “http://localhost:8080/grails-book-catalog/author/list” seperti gambar berikut ini:
3. Wah, ternyata benar bisa otomatis ada, tapi kan itu list ya, paging-nya gimana?
Ya, setelah melihat hasil di atas, akan timbul pertanyaan baru, bagaimana dengan paging-nya?. Grails Framework melengkapi fitur pada tampilan data list dengan paging, jumlah data setiap halaman pada list views secara default adalah 10 data setiap satu halaman. Silahkan anda tambahkan object Author pada file Bootstrap.groovy tadi menjadi lebih dari 10 buah data dan buktikan sendiri.
Tapi jika anda malas melakukannya, mari kita buktikan dengan cara seperti langkah-langkah berikut ini. Bukalah file “AuthorController.groovy” pada folder “grails-app/controller/”, kemudian pada action “list” edit-lah baris code menjadi seperti berikut ini:
def list(Integer max) {
params.max = Math.min(max ?: 2, 100)
[authorInstanceList: Author.list(params), authorInstanceTotal: Author.count()]
}
Pada code diatas kita merubah maksimal data yang ditampilkan pada setiap halaman dari 10 menjadi 2. Kemudian tunggu console grails anda supaya grails secara otomatis men-compile sendiri source code tersebut tanpa harus me-restart aplikasi web tersebut seperti gambar dibawah ini:
Kemudian refresh kembali browser anda tadi sehingga secara otomatis halaman tersebut akan berubah menjadi seperti gambar di bawah ini:
Ya, Grails mendukung pagination dan secara otomatis membuatkannya untuk kita.
4. Kok halaman Create Book pada form saya jadi aneh?
Ya, jika anda membuka alamat URL “http://localhost:8080/grails-book-catalog/book/create”, akan tampil seperti gambar berikut ini:
Daftar Author pada form tersebut tidak sempurna tampil dalam halaman tersebut, untuk memperbaiki tampilan tersebut langkah-langkah yang bisa kita lakukan adalah dengan cara menambahkan baris berikut ini pada file Author.groovy.
@Override
public String toString() {
return authorName
}
Meski cara tersebut bisa dilakukan, namun cara tersebut memerlukan restart aplikasi web, sebab setiap kali class domain dirubah, maka Grails Framework akan menghapus data yang sudah kita buat pada file Bootstrap.groovy. Sementara cara lain yang bisa dilakukan tanpa me-restart aplikasi web tersebut adalah seperti berikut ini, bukalah file _form.gsp pada folder “grails-app/views/book/”, kemudian pada sekitar 15 dari baris paling atas file tersebut edit menjadi seperti dibawah ini :
<%@ page import="org.learn.grails.Author; org.learn.grails.Book" %>
<div class="fieldcontain ${hasErrors(bean: bookInstance, field: 'author', 'error')} required">
<label for="author">
<g:message code="book.author.label" default="Author" />
<span class="required-indicator">*</span>
</label>
<select id="author" name="author.id">
<g:each in="${Author.list()}" var="author">
<option value="${author.id}">${author.authorName}</option>
</g:each>
</select>
</div>
Ya, saya menghapus baris “Buka file “list.gsp” pada folder “grails-app/views/book/” dan cari baris code dibawah ini:
<g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "author")}</g:link>
dan edit menjadi seperti dibawah ini:<g:link action="show" id="${bookInstance.id}">${fieldValue(bean: bookInstance, field: "author.authorName")}</g:link>
Kemudian file “show.gsp” pada folder “grails-app/views/book/” dan cari baris code dibawah ini:
<span class="property-value" aria-labelledby="author-label"><g:link controller="author" action="show" id="${bookInstance?.author?.id}">${bookInstance?.author?.encodeAsHTML()}</g:link></span>
Dan edit menjadi seperti ini:<span class="property-value" aria-labelledby="author-label"><g:link controller="author" action="show" id="${bookInstance?.author?.id}">${bookInstance?.author?.authorName?.encodeAsHTML()}</g:link></span>
Silahkan anda lihat sendiri hasil source code yang kita modifikasi, apakah sudah sepenuhnya berubah dan sesuai dengan yang kita inginkan.Untuk sementara mungkin hanya itu dulu penglaman yang bisa saya share kepada para pembaca yang budiman sebelum kita meneruskan pembahasan sesuai rencana pada tulisan yang pertama, dan saya yakin masih akan ada banyak pertanyaan lain yang akan muncul, silahkan mencari jawaban dari pertanyaan-pertanyaan lainnya yang muncul dan tidak ada salahnya kali ini pembaca semua yang berbagi pengalaman tersebut dengan saya bukan? :D
Salam dan Semoga bermanfaat
Menteng, 15 Februari 2014.
Josescalia
2 comments:
mas josescalia, mau tanya grails paging klo untuk case yang bukan initial data tapi menggunakan executequery dari 3 table join itu gimana caranya bisa menghasilkan list beserta paging jika waktu submit query dari periode tgl 30-06-2016 s/d 30-06-2016 ?
bisa di bantu mas saya ada case tugas di kantor
Bisa dilihat basic cara-caranya disini:
http://grails.asia/grails-hql-join-examples
Yang harus diperhatikan adalah
1. Pastikan dulu Entity yang mau kita display informasinya, nah Entity ini jadi pegangan kita untuk menyandarkan eksekusi querynya, Contoh : Misal Book adalah entity yang mau kita display datanya maka jadi Book.executeQuery("HQL Join Query disini")
2. Pagination diterapkan hanya dengan menambahkan paramater [max: 10, offset: 20] pada method execute query. lihat disini http://gorm.grails.org/6.0.x/hibernate/manual/index.html#hql
Post a Comment