BAB 1 Pengenalan Arsitektur MVC - TIK Web Lanjutan Akses Data

BAB 1 Pengenalan Arsitektur MVC

1.1 Pengenalan Arsitektur Model-View-Controller

Arsitektur Model-View-Controller adalah sebuah pola yang terbukti membangun proyek secara lebih efektif. Hal itu dilakukan dengan memilah komponen antara Model, View dan Controller pada bagian – bagian dalam proyek.

1.1.1 Motivasi

Aplikasi apapun, bagian dalam kode yang sering mengalami perubahan adalah bagian user interface. User interface adalah bagian yang paling terlihat oleh user dan bagaimana ia berinteraksi dengan aplikasi, membuatnya menjadi titik fokus pengubahan berdasar kemudahan penggunaan.

Business-logic yang rumit pada user-interface membuat pengubahan pada user interface menjadi lebih kompleks dan mudah terjadi kesalahan. Perubahan pada satu bagian memiliki potensi keterkaitan dengan keseluruhan aplikasi.

1.1.2 Solusi

Pola MVC menyediakan sebuah solosi terhadap permasalahan tersebut dengan membagi aplikasi menjadi bagian – bagian tersendiri, Model, View dan Controller, memisahkan antar bagian tersebut dan membuat tata interaksi diantaranya.

Pengenalan MVC

Diagram di atas menunjukkan 3 komponen yang terdapat dalam pola MVC dan interaksi yang terjadi.

1.2 MODEL

Pola MVC memiliki layer yang disebut dengan Model yang merepresentasikan data yang digunakan oleh aplikasi sebagaimana proses bisnis yang diasosiasikan terhadapnya. Dengan memilahnya sebagai bagian terpisah, seperti penampungan data, persistence, serta proses manipulasi, terpisah dari bagian lain aplikasi.

Terdapat beberapa kelebihan dalam pendekatan ini. Pertama, membuat detail dari data dan operasinya dapat ditempatkan pada area yang ditentukan (Model) dibanding tersebar dalam keseluruhan lingkup aplikasi. Hal ini memberikan keuntungan dalam proses maintenance aplikasi.

Kedua, dengan pemisahan total antara data dengan implementasi interface, komponen model dapat digunakan kembali oleh aplikasi lain yang memiliki kegunaan yang hampir sama.

1.3 VIEW

Layer ini mengandung keseluruhan detail dari implementasi user interface. Disini, komponen grafis menyediakan representasi proses internal aplikasi dan menuntun alur interaksi user terhadap aplikasi. Tidak ada layer lain yang berinteraksi dengan user, hanya View.

Pengenalan MVC

Penggunaan layer View memiliki beberapa kelebihan : Pertama, memudahkan pengabungan divisi desain dalam development team. Divisi desain dapat berkonsentrasi pada style, look & feel, dan sebagainya, dalam aplikasi tanpa harus memperhatikan lebih pada detail yang lain.

Dan juga, memiliki layer View yang terpisah memungkinkan ketersediaan multiple interface dalam aplikasi. Jika inti dari aplikasi terletak pada bagian lain (dalam Model), multiple interfaces dapat dibuat (Swing, Web, Console), secara keseluruhan memiliki tampilan yang berbeda namun mengeksekusi komponen Model sesuai fungsionalitas yang diharapkan.

1.4 CONTROLLER

Terakhir, arsitektur MVC memiliki layer Controller. Layer ini menyediakan detail alur program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan data yang dimasukkan oleh user.

Kelebihan dalam penggunaan layer Controller secara terpisah : Pertama, dengan menggunakan komponen terpisah untuk menampung detail dari transisi layer, komponen view dapat didesain tanpa harus memperhatikan bagian lain secara berlebih. Hal ini memudahkan team pengembang multiple interface bekerja secara terpisah dari yang lain secara simultan. Interaksi antar komponen View terabstraksi dalam Controller. Kedua, dengan menggunakan layer terpisah yang melakukan update terhadap komponen Model, detail tersebut dihapus dari layer presentasi. Layer presentasi kembali pada fungsi utamanya untuk menampilkan data kepada user. Detail tentang bagaimana data dari user mengubah ketetapan aplikasi disembunyikan oleh Controller. Hal ini memisahkan dengan jelas antara presentation logic dengan business logic.

Tidak dapat disimpulkan bahwa pola MVC hadir dengan kelebihan – kelebihan tanpa ada efek samping. Pembagian aplikasi dalam 3 bagian terpisah meningkatkan kompleksivitas. Pada aplikasi kecil yang tidak membutuhkan loose coupling pada Model, hal ini dapat menjadi blok penghalang dalam penggunaan pola ini. Bagaimanapun, yang terbaik adalah untuk meyakini bahwa sebuah aplikasi umumnya dimulai dari aplikasi sederhana, dan berkembang menjadi sistem yang kompleks., sehingga factor loose coupling harus selalu diutamakan dan diperhatikan.

1.5 Arsitektur MVC Untuk Web : Arsitektur Model 2

Pengenalan MVC

Arstitektur MVC secara sederhana dirancang dan diadaptasi dalam penggunaan dalam Web-Application. Arsitektur yang dihasilkan kemudian disebut dengan Model 2 Architecture.

Aplikasi Model 2 umumnya memiliki : o Servlet Controller yang menyediakan akses tunggal terhadap keseluruhan aplikasi. Controller ini bertanggungjawab menyediakan manajemen terpusat terhadap alur aplikasi dan juga service lain seperti penganganan security dan user management.

o Controller Servlet umumnya menggunakan konfigurasi XML untuk menentukan alur aplikasi dan pemrosesan perintah. Hal itu juga membuat helper components yang berfungsi sebagai Command objects. Hal ini berarti helper components terasosiasikan dengan user actions dan dibuat/dipanggil

untuk menangani actions yang terjadi, memanggil komponen Model sebagaimana diperlukan. Hal ini berfungsi untuk memisahkan untuk memisahkan antara controller servlet dari Model.

1.5.1 Model 2 Diagram

Implementasi sebuah pola dapat dipermudah dengan menggunakan third-party framework. Frameworks tersebut menyediakan detail terkait (request, konfigurasi, dan sebagainya) sehingga kita dapat berkonsentras pada hal lain yang lebih penting. Frameworks tersebut juga menyediakan fungsi - fungsi tambahan.

Pada pembelajaran ini, akan dibatasi pada dua framework yang popular, Struts dab JavaServerFaces (JSF). Struts akan dibahas pada bagian ini, sedangkan JSF pada bagian selanjutnya.

1.5.2 STRUTS

Pengenalan MVC

Struts adalah open-source framework yang dibuat oleh Apache Software Foundation. Dibawah ini menunjukkan bagaimana penanganan Model 2 Architecture oleh Struts.

Perhatikan object yang disediakan oleh framework pada komponen Model, View dan Controller.

1.5.3 CONTROLLER

1.5.3.1 ActionServlet

Pengenalan MVC

Pusat dari implementasi controller pada Struts adalaha ActionServlet. Berfungsi sebagai Front Controller servlet dan menyediakan jalur tunggal untuk mengakses aplikasi. ActionServlet juga mengandung logic dalam penanganan request dari client – terlihat pada HTTP request dari client, kemudian diteruskan menuju sebuah halaman Web atau mengirimkan request tersebut object penerima yang disebut dengan Actions yang kemudian bertanggungjawab untuk menentukan respon yang akan dihasilkan.

ActionServlet memiliki detail – detail sebagai berikut, Action apa yang akan dipanggil untuk menangani request, komponen view mana yang akan dipanggil selanjutnya – dengan membaca konfigurasi XML, yang umunya bernama struts-config.xml.

Servlet ini menyediakan struts framework yang siap digunakan. Secara keseluruhan penting untuk menyertakannya pada aplikasi sebagai konfigurasi pada deployment aplikasi.

Berikut ini adalah potongan dari web.xml yang menunjukkan konfigurasi ActionServlet.

... <servlet> <servlet-name>action</servlet-name>

<servlet-class> org.apache.struts.action.ActionServlet </servlet-class> <init-param> <param-name>application</param-name> <param-value>ApplicationResources</param-value> </init-param> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> </servlet> ... <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>

1.5.3.2 Action

Seperti yang telah disebutkan sebelumnya, beberapa request dari client diteruskan menuju Action yang sesuai oleh front controller servlet. Seluruh action objects mendefinisikan sebuah method yang disebut execute(), dan method inilah yang dipanggil oleh ActionServlet untuk menangani request yang terjadi.

Pengenalan MVC

Aktifitas umum dalam aplikasi web adalah user log-in. Ditunjukkan di bawah ini adalah implementasi dari LoginAction class yang berfungsi untuk menangani request tersebut.

import org.apache.struts.action.* public class LoginAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // casting ActionForm

LoginForm loginForm = (LoginForm)form; // Menampung data dari user.

String loginName = form.getLoginName(); String password = form.getPassword();

// Membuat business object yang akan menangani request UserService service = new UserService(); user = service.login(loginName, password);

// Jika user tidak ada, diteruskan pada error page if (user == null) { return mapping.findForward("failure"); }

// Simpan pada session untuk digunakan pada proses aplikasi selanjutnya HttpSession session = request.getSession(); session.setAttribute(ApplicationConstants.USER_OBJECT, user);

// User telah log-in dengan sukses. return mapping.findForward("success"); }

Perhatikan bahwa implementasi di atas menggunakan sebuah business object yang disebut dengan UserService, untuk menentukan otentifikasi user dan tidak menyediakan implementasi secara langsung pada method eksekusinya. Action instances harus dibuat dengan alur sebagai berikut – fungsi utama harus di teruskan kembali pada business object (yang dapat ditemukan pada bagian Model), tidak diimplementasikan dalam Action itu sendiri. Proses yang akan dijalankan pada Action adalah sebagai berikut :

o Menampung informasi user dari ActionForm bean terkait o Menerjemahkan data dari form menjadi parameter yang diperlukan oleh

business object yang mengimplementasikan fungsionalitasnya o Menampung hasil operasi dari business object dan menentukan View selanjutnya yang akan ditampilkan pada user

Pengenalan MVC Pengenalan MVC

atau request objects untuk digunakan dalam proses aplikasi selanjutnya

Hal lain yang perlu diperhatikan pada saat membuat kode instances dari Action objects adalah bahwa framework hanya akan menginstansiasi satu salinan object dan menggunakannya untuk memfasilitasi seluruh request. Hal ini berarti kita harus selalu membuat kode Action dalam thread-safe, dan memastikan bahwa hanya local variabel yang digunakan, bukan instance variabel.

Action instances berkemampuan untuk menginstruksikan ActionServlet dalam memilih komponen View mana yang akan digunakan dalam merespon dengan mengembalikan instances dari objek ActionForward. Actions memiliki akses terhadap

yang mengenkapsulasi data dari pemetaan logical path pada setiap Action. Pemetaan tersebut dibaca dari file konfigurasi oleh ActionServlet, yang kemudian bertanggungjawab untuk meneruskan ActionMapping pada Action yang sesuai. Sehingga menginstruksikan ActionServlet untuk meneruskan pada logical map dengan hasil “Success”, Action bekerja sesuai pernyataan berikut :

ActionForward

melalui penggunaan

ActionMapping

return mapping.findForward("success");

1.5.3.3 ActionForm

Struts framework menyediakan sebuah class yang disebut dengan ActionForm. Instances dari class ini digunakan untuk memfasilitasi penampungan data yang berasal dari form yang dikumpulkan dari user pada Action instances yang menangani events pada form tersebut.

Pengenalan MVC

Tiap instances dari ActionForm merepresentasikan sebuah form atau rangkaian forms. Instances tersebut mendefinisikan properties dari elemen – elemen form, dan mempublikasikannya dengan menggunakan getters dan setters yang dapat diakses secara public. Action yang memerlukan data dari form kemudian memanggil method getter dari instance ActionForm.

Struts menyertakan definisi class dasar; developer bertanggungjawab penuh atas implementasi buatan mereka sendiri.

Kode dibawah menunjukkan ActionForm yang digunakan pada contoh sebelumnya :

import org.apache.struts.action.*; public class LoginForm extends ActionForm {

private String loginName; private String password;

public String getLoginName() { return loginName; }

public void setLoginName(String loginName) { this.loginName = loginName; }

public String getPassword() { return password; }

public void setPassword(String password) { this.password = password; }

Beberapa hal yang perlu diingat pada saat pengkodean ActionForm : o Mendefinisikan properties (dengan asosiasi terhadap method get dan set) untuk tiap elemen yang akan direpresentasikan pada form o Hindari penempatan business logic pada ActionForm. ActionForm ditujukan untuk mentransfer data antara komponen View dan Controller, dan bukan ditujukan untuk business logic.

o Opsi lain, sertakan sebuah method untuk memvalidasi data sebelum diteruskan pada Action. Validasi akan dibahas lebih mendalam selanjutnya.

<?xml version=”1.0”?> <!DOCTYPE struts-config PUBLIC “-//Apache Software Foundation//DTD Struts

1.5.3.4 Configuration 1.1//EN” “http://jakarta.apache.org/struts/dtds/struts- struts-config.xml

config_1_1.dtd” > File ini berfungsi sebagai file konfigurasi komponen – komponen yang terdapat pada <struts-config> <form-beans>

Struts. Disini, kita dapat mendefinisikan Action mana yang akan dipanggil untuk tiap <form-bean name=”loginForm” type=”login.LoginForm”/> request, form mana yang akan digunakan pada tiap Action, dan memetakan logical </form-beans> names pada actual path, diantara hal – hal lain. Berikut ini adalah potongan dari <action-mappings> struts-config.xml yang digunakan pada contoh di atas : <action name=”loginForm”

path=”/login” scope=”request” type=”login.LoginAction”>

<forward name=”success” path=”/success.jsp”/> <forward name=”failure” path=”/failure.jsp”/>

Pengenalan MVC </action> </action-mappings>

9 </struts-config>

Mari kita bahas tiap elemen tersebut. <!DOCTYPE ...>

Elemen ini mendefinisikan file XML sebagai file konfigurasi dalam penggunaan Struts framework. Terlewat dan kesalahan dalam penulisan kode, akan menghasilkan error pada saat aplikasi dijalankan.

<struts-config> Elemen dasar dalam file konfigurasi. Seluruh elemen lain adalah elemen turunan dari elemen ini.

<form-beans> Elemen ini menandai awal dan akhir definisi dari ActionForm instances. Elemen <form-bean> harus diposisikan sebagai turunan dari elemen ini.

<form-bean> Menjelaskan instance dari ActionForm yang dapat digunakan oleh aplikasi. Elemen ini memiliki dua atribut :

o name – nama logik yang akan diasosiasikan dengan ActionForm class o type – desripsi kualifikasi lengkap nama class dari ActionForm class

<action-mappings> Elemen ini menandai awal dan akhir definisi Action dan pemetaannya. Seluruh elemen <action> harus diposisikan sebagai titik turunan dari elemen ini.

<action> Menjelaskan instance dari Action object yang akan digunakan oleh aplikasi. Secara umum, elemen action akan mengimplementasikan atribut - atribut sebagai berikut :

o path – context relative path yang digunakan oleh Action. Request apapun

pada path ini menghasilkan Action dipanggil

o type – deskripsi lengkap nama class dari Action class

Pengenalan MVC Pengenalan MVC

dimana ActionServlet akan menyimpan instance dari ActionForm

<forward> Elemen ini mendefinisikan pemetaan logik antara sebuah name dan path pada aplikasi.

Elemen ini memiliki atribut sebagai berikut :

o name – nama dari elemen forward yang akan digunakan oleh Action instance o path – path dari komponen View yang akan diasosiasikan pada forward

Hal – hal yang perlu dilakukan pada Controller layer : Untuk sekali pengaturan :

o Mengkonfigurasi ActionServlet pada deployment aplikasi Untuk tiap form handler yang akan ditambahkan pada aplikasi :

o Membuat object ActionForm yang akan menrepresentasikan seluruh data

yang dikumpulkan dari form o Membuat object Action dimana pada method eksekusinya menjelaskan

bagaimana form akan ditangani o Mengkonfigurasi object ActionForm dalam struts-config.xml, pada bagian

<form-beans>

o Mengkonfigurasi object Action dalam struts-config.xml, pada bagian <action-

mappings>

o Mengkonfigurasi seluruh elemen forward yang akan digunakan oleh Action,

dengan menempatkan <forward> pada badan definisi <action>

1.5.4 MODEL

Struts framework secara eksplisit tidak menyediakan komponen apapun dalam elemen Model. Object mana yang akan digunakan sebagai komponen Model ditentukan sepenuhnya oleh developer, umumnya adalah JavaBeans, atau terkadang EJB.

1.5.5 VIEW

Pengenalan MVC

Struts dapat menggunakan teknologi presentation layer apapun, walaupun pada sebagian kasus yang presentation layer yang digunakan adalah JSP dan HTML. Apa saja yang disediakan oleh Struts, adalah serangkaian dari tag libraries yang mengijinkan penggunaan fitur – fitur dari Struts dalam pengumpulan dan validasi form secara otomatis.

1.5.5.1 struts-html

Struts menyertakan sebuah tag-library, disebut dengan struts-html, yang hampir menyerupai keseluruhan fungsionalitas standar HTML, namun ditambahkan dengan beberapa fitur tambahan.

Tag-library ini sering digunakan pada saat membuat form yang akan dipakai oleh aplikasi. Perhatikan contoh dibawah ini :

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html>

<head><title>Login Page</title></head> <body> <h1> Login Page </h1> <br/>

<html:form action="/login">

User Name : <html:text property="loginName"/> <br/> Password : <html:password property="password"/> <br/> <html:submit>

</html:form>

Ini adalah form yang digunakan pada contoh sebelumnya. Perhatikan bagaimana elemen

standar HTML seperti <form>, <input type=“text“>, <input type=“password“>, serta <input type=”submit”> digantikan oleh tag dari library struts-html. Mari kita bahas tags tersebut satu-persatu :

<html:form> Tag <html:form> menerjemahkan sebuah HTML form. Tiap form tag terasosiasi

dengan sebuah action mapping yang didefinisikan oleh atribut action. Value dalam atribut action menspesifikasikan path dari action mapping yang sesuai.

Perhatikan kembali file konfigurasi pada contoh sebelumnya :

... <action name=”loginForm”

path=”/login” scope=”request” type=”login.LoginAction”>

Pengenalan MVC

Dapat kita lihat bahwa value dari atribut path terdefinisi pada file konfigurasi sesuai dengan value atribut action pada tag <html:form>. Hal ini mengindikasikan bahwa dalam form ini, saat diserahkan, akan diteruskan pada LoginAction untuk ditangani.

Salah satu dari persyaratan dari tag html:form yang valid adalah tiap field yang mengandungnya harus tercantum pada ActionForm untuk dipetakan pada action mapping.

Kemungkinan atribut lain :

o method – dapat berupa POST atau GET. Menjelaskan method HTTP yang akan

digunakan pada pengiriman form

<html:text> Tag ini menerjemahkan standar HTML text input field. Property attribute menentukan batasan property dalam ActionForm terkait. Sebagai contoh, value dari property attribute dari contoh di atas adalah “loginName”, text field ini terhubung dengan property loginName pada LoginForm.

Atribut lain yang tersedia pada tag ini :

o size – mendefinisikan ukuran dari text field yang akan ditampilkan o maxlength – menentukan panjang maksimum value yang dapat dimasukkan

oleh user

<html:password> Tag ini menerjemahkan standard HTML password field. Property attribute dari tag ini menjelaskan batasan property dalam ActionForm yang berkaitan. Dalam contoh diatas, field ini dibatasi oleh password property pada LoginForm.

Pada pembahasan sebelumnya tentang html:text dan html:password field, dijelaskan bahwa tag – tag tersebut dibatasi oleh properties pada ActionForm yang terhubung dengan form. Hal ini menjelaskan bahwa pada prakteknya value yang dimasukkan oleh user dalam field ini secara otomatis akan diatur sesuai batasan properties dalam object ActionForm. Terlebih lagi, jika terdapat value sebelumnya dalam ActionForm object (form tersebut telah diakses sebelumnya), field pada form secara otomatis pula akan terisi dengan values dari ActionForm object.

Tag-tag lain yang terdapat pada struts-html tag library : <html:hidden>

Menerjemahkan HTML hidden pada form field. Contoh penggunaan :

<html:hidden property="hiddenField"/>

Pengenalan MVC

<html:radio> Menerjemahkan HTML radio check box.

Contoh penggunaan : <html:radio property="radioField”/>

<html:select>, <html:option> html:select digunakan untuk menerjemahkan sebuah drop-down list box. Pilihan – pilihan yang terdapat pada list box didefinisikan menggunakan tag html:option.

Contoh penggunaan : <html:form action="/sampleFormAction">

<html:select property="selectField" size="5">

<html:option value="0 value">0 Label</html:option> <html:option value="1 value">1 Label</html:option> <html:option value="2 value">2 Label</html:option>

</html:select> </html:form>

Contoh di atas akan membuat sebuah list box dengan 5 item berukuran 5. Perhatikan bahwa body dari html:option tag berperan sebagai label dari item pada list, sedangkan value dari value attribute menentukan value yang akan diberikan pada Action.

<html:checkbox>, <html:area> Digunakan untuk menerjemahkan check box field dan textarea. Seperti yang terlihat pada pembahasan sebelumnya (Advanced JSP), terdapat beberapa hal yang perlu dilakukan sebelum memakai bermacam tag libraries dalam aplikasi.

Pertama, letakkan file JAR implementasi dari fungsionalitas tag dalam direktori WEB- INF/lib dalam aplikasi.

Beberapa hal yang harus dilakukan terhadap layer View : Untuk satu kali pengaturan :

o Konfigurasi tag library yang akan digunakan dalam pengembangan aplikasi o Tempatkan file JAR yang memiliki implementasi tag libraries pada direktori

WEB-INF/lib dalam aplikasi Untuk setiap form yang akan dibuat :

o Buat sebuah direktive taglib pada halaman JSP untuk menggunakan struts-

html tag library

Pengenalan MVC Pengenalan MVC

action attribute dari path Action yang akan menangani form

o Pada posisi peletakan HTML field tags (<input type=”text”>, dan

sebagainya), gunakan tags yang terdapat pada struts-html tag library yang memiliki fungsi yang sama (<html:text>, dan sebagainya).

Pastikan bahwa seluruh input fields yang terdapat pada form terdefinisi sebagai properties pada ActionForm object yang terhubung dengan request. Tidaklah perlu bahwa seluruh properties pada object ditampilkan sebagai field, namun dipersyaratkan bahwa seluruh fields juga terdefinisi sebagai properties.

Menutup tag <html:form>

1.6 MEMANDANG HAL-HAL YANG ADA SECARA KESELURUHAN

Untuk memahami bagaimana Struts framework berfungsi secara menyeluruh, perhatikan scenario yang terdapat pada contoh diatas : user logging.

Sebelum seorang user memasuki situs, ActionServlet mengambil konfigurasi file dan menelusuri detail yang ada. Sehingga, pada saat user mengakses form login, framework telah mengetahui ActionForm terkait yang akan menyimpan detail dan Action yang akan menanganinya.

Saat halaman login dijalankan, struts html tags yang telah digunakan berupaya untuk menerjemahkan HTML fields. Jika ActionForm untuk form ini tidak ada, halaman tersebut tidak akan ditampilkan. Jika terdapat fields dalam form yang melebihi properties pada ActionForm untuk menopangnya, halaman tersebut juga tidak akan ditampilkan. Jika ActionForm tersebut memang telah terdefinisi sebelumnya, tags – tags yang ada akan ditampilkan jika terdapat values sebelumnya yang tersimpan dalam ActionForm, dan juga form fields akan ditampilkan beserta data yang ada. Sebaliknya, form fields akan dibiarkan kosong dan user akan memperoleh tampilan form tanpa isian.

Pengenalan MVC

Pada saat form diserahkan, values pada form fields secara otomatis diatur ke dalam object ActionForm oleh Struts Framework. Object ini kemudian diteruskan menuju Action handler yang sesuai, selama ActionMapping object yang merefleksikan detail pemetaan tercantum pada file konfigurasi.

Action object memerankan penanganannya, kemudian memberi tahu ActionServlet kemana langkah selanjutnya dengan menentukan salah satu elemen forward yang terkonfigurasi pada pemetaan/mapping. ActionServlet kemudian meneruskan user menuju halaman yang ditentukan.

Pengenalan MVC

BAB 2 Advanced MVC

2.1 Pendahuluan

Pada pembahasan sebelumnya, kita telah memahami garis besar dasar dari Struts. Kita telah mempelajari bagaimana cara mengimplementasikan framework Struts pada aplikasi dengan mengkonfigurasi ActionServlet yang disediakan untuk menangani request. Kita juga telah mempelajari cara untuk membuat instance dari Action classes yang berfungsi sebagai action handlers pada penyerahan form dan user request yang lain. Telah diketahui cara pembuatan ActionForm classes yang menyediakan cara mudah transfer data dari form menuju ActionHandlers yang dibuat. Terakhir, telah diketahui pula mengenai penggunaan tag library untuk menggabungkan form HTML dalam halaman JSP pada framework.

Pada bab ini, kita akan membahas beberapa teknik dan fitur terapan dari Struts framework. Pertama, akan kita pelajari mengenai penggunaan DynaActionForms untuk mengurangi jumlah class yang kita gunakan dalam framework. Kemudian, akan kita telusuri bagaimana framework validator berfungsi dalam hal validasi baik pada server-side maupun client-side. Terakhir, akan dikenalkan Tiles framework, yang memiliki fitur presentationlayer yang lebih kompleks, sehingga dapat membuat templating machine terhadap halaman – halaman yang ada pada aplikasi.

2.2 DynaActionForms

Pada aplikasi skala besar utamanya, jumlah class yang perlu untuk dibuat dan dipergunakan dapat begitu tinggi. Struts mendukung classes yang cukup membantu hal ini, terutama dalam hubungannya dengan ActionForms, yang mempersyaratkan solidnya implementasi form keseluruhan pada aplikasi. Banyak dari developer yang terjebak pada batasan ini, utamanya pada saat ActionForms adalah berupa JavaBeans sederhana yang memiliki method get dan set pada tiap form fields pada representasinya.

Strus memiliki penyelesaian atas permasalahan tersebut pada versi 1.1, disebut dengan DynaActionForms. DynaActionForms sangat mirip dengan ActionForms, sehingga sebuah instance darinya dapat diambil dan method dipanggil pada saat ActionHandlers memerlukan data yang ada. Perbedaan utamanya adalah, tiap DynaActionForm tidak terdeklarasi sebagai class terpisah, melainkan terkonfigurasi dalam struts-config.xml.

Advanced MVC

Dibawah ini adalah contoh konfigurasi dan deklarasi DynaActionForms. Kita gunakan sesuai contoh pada bab sebelumnya, disini dibuat sebuah ActionForm yang akan menangani data yang dibutuhkan pada saat log in.

<?xml version=”1.0”?> <!DOCTYPE struts-config PUBLIC “-//Apache Software Foundation//DTD Struts Configuration 1.1//EN” “http://jakarta.apache.org/struts/dtds/struts- config_1_1.dtd” > <struts-config>

<form-beans>

<form-bean

name=”loginForm” type="org.apache.struts.action.DynaActionForm"> <form-property name=”loginName” type=”java.lang.String”/> <form-property name=”password” type=”java.lang.String”/>

</form-bean>

</form-beans> <action-mappings>

<action name=”loginForm”

path=”/login” scope=”request” type=”login.LoginAction”> <forward name=”success” path=”/success.jsp”/> <forward name=”failure” path=”/failure.jsp”/>

</action> </action-mappings> </struts-config>

Seperti yang terlihat, pembuatan DynaActionForm berlangsung dengan amat sederhana, dan pada beberapa kasus, deklarasi DynaActionForm dalam file konfigurasi lebih sederhana dan cepat dibandingkan dengan menuliskan instance ActionForm secara langsung. Kita tidak perlu memperhatikan form properties serta membuat method get dan set pada setiap ActionForm, dengan menggunakan DynaActionForm hanya memerlukan deklarasi property name dan type.

Berikut ini adalah Java types yang didukung oleh DynaActionForm : o java.lang.bigDecimal o java.lang.bigInteger o boolean dan java.lang.Boolean o char dan java.lang.Character o double dan java.lang.Double o float dan java.lang.Float o int dan java.lang.Integer o long dan java.lang.Long o short dan java.lang.Short o java.lang.String o java.lang.Date o java.lant.Time o java.sql.TimeStamp

2.3 Validators

Advanced MVC

Validasi input sangat dibutuhkan dalam aplikasi berbasis web. Dengan menggunakan validasi input, didapatkan koreksi atas format dan isi dari input yang diberikan user. Dalam banyak kasus, seorang user tidak selalu memasukkan input yang benar, huruf dapat dimasukkan dalam field numerik dan sebaliknya; sebuah field yang mempersyaratkan minimal 3 digit hanya diisikan dengan2 digit, dan sebagainya. Adalah tanggung jawab dari aplikasi untuk waspada dan menangani kesalahan input disamping kesalahan hasil dari proses business logic (password tidak cocok dan sebagainya).

Struts meringankan kesulitan yang dihadapi developer dalam menjalankan validasi dengan menyediakan validasi framework yang disebut dengan Validator Framework. Penggunaan framework ini memiliki beberapa kelebihan :

o Framework menyediakan beberapa aturan validasi. Terdapat beberapa rangkaian pemeriksaan umum pada aplikasi seperti pemeriksaan format, panjang karakter dan sebagainya. Framework ini menyediakan komponen –

komponen yang dibutuhkan sehingga developer tidak lagi membuat kode yang akan melakukan proses validasi. Komponen yang disediakan umumnya cukup mewakili proses validasi global, namun proses validasi lain juga dapat dibuat.

o Mengurangi redudansi kode. Framewok memisahkan komponen yang melakukan validasi dengan komponen yang memerlukan validasi. Hal ini juga

membuat developer dalam penggunaan ulang kode dengan lebih mudah : komponen yang memerlukan validasi cukup mendeklarasikan jenis validasi yang diinginkan disamping menambahkan kode validasi pada komponen tersebut.

o Satu titik maintenance. Developer tidak lagi menelusuri aplikasi secara menyeluruh untuk memeriksa aturan validasi yang terdapat pada bermacam komponen. Seluruh aturan dideklarasikan pada file konfigurasi yang diberikan

oleh framework.

Terdapat beberapa langkah yang dibutuhkan dalam menambahkan fungsi – fungsi validator dalam aplikasi Struts :

o Konfigurasi Validator Plug-in o Deklarasi form yang memerlukan validasi, dan tipe validasi yang dibutuhkan o Membuat pesan yang akan ditampilkan jika proses validasi mengalami

kegagalan o Merubah base class dari ActionForms menjadi ValidatorForm pada aplikasi. Dan juga merubah tipe dari DynaActionForms menjadi DynaValidatorForm

2.3.1 Konfigurasi Validator Plug-in

Langkah ini diperlukan untuk membuat Struts framework mengetahui penggunaan Validator framework. Hal yang perlu dilakukan adalah menambahkan beberapa baris kode dalam struts-config.xml. Berikut ini contohnya :

Advanced MVC

... <forward name=”success” path=”/success.jsp”/> <forward name=”failure” path=”/failure.jsp”/> </action>

</action-mappings>

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>

</plug-in>

</struts-config>

Path names property menginformasikan pada framework dimana letak untuk menemukan file konfigurasi yang diperlukan. Terdapat beberapa file konfigurasi : validator-rules.xml dan validator.xml.

2.3.2 validator-rules.xml

File konfigurasi ini mendefinisikan classes yang mengimplementasi kode validasi. Framework menyertakan file ini dengan validator classes yang telah didefinisikan sebelumnya.

Dibawah ini adalah daftar logical names dari validators yang disertakan dalam framework :

o required – properties yang diberi tanda sebagai required harus memiliki minimal satu karakter disamping spasi o mask – properties dengan mask validator harus sesuai dengan format penulisan yang dicantumkan pada validator dengan menggunakan mask variable

o minlength – property tersebut harus memiliki panjang minimal sama atau lebih dari min variable yang diberikan

o maxlength – property tersebut harus memiliki panjang yang sama atau kurang dari max variable yang diberikan

o range – property memiliki panjang dalam area antara max dan min value yang diberikan

o byte, short, integer, long, float, double – property harus sesuai dengan tipe primitive yang diberikan

o date – validasi sukses jika value dari property berupa tanggal yang valid o creditCard – validasi berhasil bila value dari property adalah format nomor

kartu kredit yang valid o email – validasi berhasil jika value dari property tersebut format email yang

benar

2.3.3 validation-xml

Advanced MVC

File konfigurasi ini menginformasikan pada framework form apa saja yang membutuhkan validasi dan aturan validasi apa yang akan diimplementasikan. Framework ini hanya menyediakan struktur dari file. Developer harus mengkonfigurasi sendiri file ini untuk membantu fungsionalitas framework.

2.3.3.1 Menkonfigurasi file validation.xml

Sekali lagi, kita akan mempelajari elemen yang dibutuhkan oleh file konfigurasi pada contoh. Dibawah ini adalah potongan yang akan terlihat dari file jika kita akan mengkonfigurasi form login terlebih dahulu.

<formset> <form name=”loginForm”> <field property=”loginName” depends=”required”>

<arg0 key=”error.loginname.required”/> </field>

<field property=”password” depends=”required,minlength”/>

<arg0 key=”error.password.required”/> <var>

<var-name>min</var-name> <var-value>4</var-value>

</var> </field> </form> </formset>

Berikut adalah macam elemen yang terdapat pada file XML ini. <formset>

Elemen ini berfungsi sebagai container untuk elemen – elemen pada form

<form> Setiap form dalam aplikasi yang memerlukan proses validasi harus memiliki <form> elemen yang berhubungan. Atribut name pada hal ini harus sesuai dengan name dari form-bean yang dikonfigurasi pada struts-config.xml. Elemen ini dapat mengandung satu atau lebih elemen <field>.

<field> Tiap elemen field merepresentasikan sebuah property pada form yang memerlukan validasi. Elemen ini memiliki atribut – atribut sebagai berikut :

o property – nama dari property dalam form yang akan divalidasi o depends – daftar validator yang dipisahkan dengan tanda koma yang

kemudaian akan diaplikasikan pada property. Nama dari validator didefinisikan dalam validator-rules.xml.

<arg0>

Advanced MVC

Mendefinisikan key pada error message yang akan ditampilkan jika property gagal dalam proses validasi. Key dan error message yang akan ditampilkan dapat ditemukan pada resource bundle yang dibuat oleh developer.

<var> Tiap elemen var mendefinisikan sebuah variabel dengan value masing – masing yang akan diteruskan menuju validator. Nama dari variabel didefinisikan dengan elemen turunan <var-name>, sedangkan isi value-nya didefinisikan menggunakan elemen turunan <var-value>.

Telah dijelaskan di atas informasi – informasi tentang bermacam elemen pada file konfigurasi, dapat dikatakan bahwa contoh tersebut mengkonfigurasi form login aplikasi Struts sehingga loginName dan password field harus memiliki value yang dimasukkan. Sebagai tambahan, password field harus memiliki panjang minimal 4 karakter untuk melewati proses validasi.

2.3.3.2 Mendefinisikan resource bundle

Elemen <arg0> di atas mendefinisikan sebuah key yang perlu dicocokkan dengan sebuah entry pada resource bundle. Entry tersebut kemudian digunakan untuk menentukan pesan yang akan ditampilkan pada user. Validator framework menggunakan resource bundle yang juga digunakan oleh Struts framework, dimana pada kondisi default, dapat ditemukan pada direktori WEB-INF/classes dengan nama ApplicationResources.properties. Jika file resource bundle tersebut tidak ditemukan pada aplikasi, maka buatlah sebuah text file dengan nama yang sama.

Entry pada resource bundle adalah pasangan sederhana berupa key=value. Pada konfigurasi file diatas, kita dapatkan isi file sebagai berikut :

error.loginname.required=Masukkan nama anda error.password.required=Anda belum mengisi password atau password kurang dari

4 karakter

Langkah terakhir dalam menggunakan validation framework adalah mengubah <?xml version=”1.0”?> ActionForm dan DynaActionForm classes untuk memakai classes yang disediakan. <!DOCTYPE struts-config PUBLIC “-//Apache Software Foundation//DTD Struts Configuration Gunakan DynaActionForm pada contoh sebelumnya : 1.1//EN” “http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd” >

<struts-config> <form-beans>

<form-bean name=”loginForm” type=" org.apache.struts.validator.DynaValidatorForm"> <form-property name=”loginName” type=”java.lang.String”/> <form-property name=”password” type=”java.lang.String”/>

</form-bean>

</form-beans> <action-mappings>

<action name=”loginForm” path=”/login”

scope=”request” type=”login.LoginAction” validation=”true”>

<forward name=”success” path=”/success.jsp”/> <forward name=”failure” path=”/failure.jsp”/>

Advanced MVC </action> </action-mappings>

</struts-config>

2.4 Tiles

Framework lain yang bekerja dengan Struts adalah Tiles framework. Dengan menggunakan Tiles, kita dapat mendefinisikan templates dan screen instances yang dapat digunakan dalam aplikasi dengan mudah.

Apakah templates itu? Secara ringkas, sebuah halaman template adalah desain layout halaman yang dapat

digunakan kembali oleh halaman apapun pada aplikasi. Penggunaan templates membuat aplikasi terlihat lebih konsisten.

Untuk lebih memahami konsep templates, mari kita perhatikan beberapa halaman dari aplikasi web :

HALAMAN DARI SITUS TERPERCAYA

Seperti terlihat pada halaman – halaman tersebut, terdapat beberapa elemen desain yang dipakai. Secara keseluruhan menggunakan rangkaian navigational links yang sama pada bagian kiri dan rangkaian gambar pada bagian atas, serta bagian yang berubah antara halaman yang berbeda adalah bagian tengah halaman.

Pertimbangkan bagaimana cara kita untuk mengimplementasikan beberapa halaman yang sama. Jika kita implementasikan pada setiap halaman seperti yang terlihat, dalam hal ini tepat satu halaman yang berhubungan dengan halaman-halaman yang terlihat pada gambar, pada nantinya kita akan mengalami kesulitan pada saat melakukan proses maintenance. Hal itu dikarenakan oleh banyaknya duplikasi kode yang akan digunakan, jika pada suatu saat seseorang memutuskan bahwa gambar pada halaman tidak terlihat bagus, ataupun navigational menu pada bagian kiri tidak terlalu menarik, perubahan akan dilakukan terhadap seluruh halaman yang ada.

Seorang programmer mengetahui bahwa pembagian area kode dapat diduplikasikan pada seluruh halaman aplikasi. Konsep ini juga dapat diterapkan pada halaman JSP/HTML : navigational links dapat berupa satu halaman tersendiri, header images sebagai halaman lain, begitu pula dengan footer. Halaman – halaman ini kemudian dapat digunakan pada halaman dengan isi body. Hal ini dapat dilakukan tanpa menggunakan framework apapun, cukup menggunakan <jsp:include> action yang telah dibahas sebelumnya pada bagian dasar JSP.

Advanced MVC

Terdapat penyelesaian yang lebih baik, yaitu dengan membuat bagian body sebagai halaman bagian JSP tersendiri, kemudian membuat sebuah halaman JSP lain yang akan berfungsi sebagai default format dan layout dari halaman halaman yang ada. Seorang developer kemudian akan mengimplementasikannya dengan cara memasukkan halaman yang berisi body content dalam template tersebut.

Terlihat jelas kelebihan dari cara diatas : segala keperluan perubahan hanya akan dilakukan pada satu aspek pada presentation layer, sebagai contoh header, akan diterapkan pada seluruh halaman aplikasi hanya dengan memodifikasi satu halaman. Jika anda ingin mengganti layout dari aplikasi, disamping mengerjakan content dari aplikasi, cukup dilakukan dengan mengubah halaman template yang digunakan sebelumnya.

Berikutnya akan dibahas mengenai implementasi template menggunakan Tiles Framework :

2.4.1 Mempersiapkan Tiles

Sebelum menggunakan Tiles framework, perlu dilakukan beberapa langkah persiapan sebagai berikut :

1. Menambahkan beberapa baris kode berikut pada struts-config.xml sebelum tag penutup </struts-config>

<plug-in className="org.apache.struts.tiles.TilesPlugin" > <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />

</plug-in>

Kode ini menginformasikan pada Struts bahwa aplikasi akan menggunakan TilesFramework dan file konfigurasinya diletakkan pada direktori /WEB-INF dengan nama tiles-defs.xml

2. Langkah berikutnya, salin file struts-tiles.tld dan tiles-config.dtd dari direktori library Struts menuju direktori /WEB-INF. File pertama berisi macam – macam tags yang dibutuhkan dalam penggunaan Tiles, sedangkan file kedua berisi struktur file konfigurasi dari tiles-defs.

3. Buat sebuah file konfigurasi kosong yang akan diisi kemudian. Buat sebuah file XML pada direktori /WEB-INF. kemudian beri nama dengan tiles-defs.xml. Isi file tersebut dengan kode sebagai berikut :

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration//EN" " http://jakarta.apache.org/struts/dtds/tiles-config.dtd ">

<tiles-definitions> </tiles-definitions>

Advanced MVC

Jika langkah – langkah tersebut telah dijalankan seluruhnya, maka Tiles Framework siap digunakan.

2.4.2 Membuat Layout Template

Langkah pertama dalam pembuatan sebuah template adalah mengidentifikasi komponen yang akan ditempatkan. Sebagai contoh, sebagai besar halaman web memiliki komponen header, footer, menu bar dan body.

Berikut ini rancang diagram dasar template yang akan dibuat :

Header

Menu Body Bar

Footer

Untuk membuat sebuah halaman template yang menerapkan layout tersebut, ikuti langkah – langkah berikut ini :

<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %> 1. Buat sebuah halaman JSP baru <HTML> 2. <HEAD> Import tag library dari Tiles

3. Buat file HTML yang menerapkan layout tersebut, biarkan kosong pada bagian <TITLE> <tiles:getAsString name="title"/></TITLE> </HEAD> elemen yang digunakan

<BODY> 4. Gunakan tag <tiles:insert> yang berfungsi sebagai penentu letak dari <TABLE border="0" width="100%" cellspacing="5"> komponen layout

Halaman HTML yang menerapkan layout tersebut memiliki bentuk sesederhana <TR> tabel, dengan komponen sebagai elemen tabel seperti terlihat pada halaman JSP di <TD colspan="2">< tiles:insert attribute="header"/></TD> </TR> bawah ini : <TR>

<TD width="140" valign="top"> < tiles:insert attribute="menu"/> </TD> <TD valign="top" align="left"> < tiles:insert attribute="body"/> </TD>

</TR> <TR>

<TD colspan="2"> < tiles:insert attribute="footer" /> </TD>

</TR> Advanced MVC </TABLE>

9 </HTML>

</BODY>

Terdapat dua macam tag pada contoh yang diberikan diatas : <tiles:insert> dan <tiles:getAsString>.

o <tiles:insert> - tag ini cukup sering digunakan pada Tiles Framework. Dalam hal ini berfungsi untuk memasukkan bagian JSP yang direferensikan dengan nama yang terisi pada atribut attribute.

o <tiles:getAsString> - tag ini berfungsi menampung value yang diisikan pada komponen dengan atribut name sebagai String.

2.4.3 Membuat Screen Definitions

Setelah memuat sebuah template, kita dapat menggunakannya untuk mendefinisikan sebuah screen. Pembuatan screen definition dapat dilakukan dalam dua cara dalam Tiles framework : didefinisikan dalam halaman JSP, atau dalam file XML yang dikenali oleh framework.

Membuat sebuah definition menggunakan halaman JSP : Pembuatan definition dalam halaman JSP menerapkan banyak macam tag yang

disertakan oleh Tiles Framework : o <tiles:definition> - tag dasar yang digunakan untuk mendefinisikan layer.

Value dari attribute id adalah nama yang terhubung dengan komponen lain. Value dari page attribute adalah lokasi dimana template file tersebut berasal.

o <tiles:put> - tag ini digunakan untuk menempatkan sebuah value ke dalam sebuah attribute dalam template. Name attribute adalah nama dari lokasi target dalam template, sedangkan value mendefinisikan lokasi dari fragmen

JSP yang akan digunakan.

Advanced MVC

Perhatikan contoh dibawah ini :

<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %> <tiles:definition id="welcomePage" page="/layout/basicLayout.jsp">

<tiles:put name="title" value="Welcome!"/> <tiles:put name="header" value="/header.jsp"/> <tiles:put name="footer" value="/footer.jsp"/> <tiles:put name="menu" value="/menu.jsp"/> <tiles:put name="body" value="/welcome.jsp"/>

</tiles:definition>

Pada contoh tersebut, kita membuat sebuah screen definition untuk halaman utama, yaitu halaman muka aplikasi. Halaman tersebut menggunakan layout yang didefinisikan pada daftar, dan menempatkan komponen title, header, footer, menu dan body pada lokasi yang ditentukan pada template.

Secara default, definition ini hanya terlihat pada halaman JSP yang memiliki deklarasi definition terkait. Untuk mengubahnya, kita dapat menambahkan sebuah value kedalam atribut opsional scope pada tag <tiles:definition>. Values pada atribut tersebut mencakup : page, request, session dan application.

2.4.4 Membuat definition menggunakan konfigurasi file XML

Cara kedua untuk membuat screen definitions adalah mencantumkan konfigurasi pada file tiles-defs.xml. Syntax penulisan konfigurasi tersebut sangat mirip dengan tag <tiles:definition> yang digunakan sebelumnya :

<!DOCTYPE tiles-definitions PUBLIC

"-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" " http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd ">

<tiles-definitions>

<definition name="welcomePage" page="/layout/basicLayout.jsp">

<put name="title" value="Welcome!"/> <put name="header" value="/header.jsp"/> <put name="footer" value="/footer.jsp"/> <put name="menu" value="/menu.jsp"/> <put name="body" value="/welcome.jsp"/>

</definition> <!-- ... more definitions ... -->

</tiles-definitions>

Apakah perbedaan antara dua cara tersebut? Kedua cara menyimpan definition sebagai JavaBean ke dalam memory. Method pada JSP me-load definition setelah fragmen JSP yang berisi definition tersebut telah diakses, dan secara default,

Advanced MVC Advanced MVC

Dilain pihak, XML method membuat screen definition dapat digunakan oleh keseluruhan aplikasi secara langsung setelah startup aplikasi. Tiles framework membuatnya permanen dalam memory. Satu-satunya hal yang diperlukan oleh komponen untuk menggunakannya adalah dengan memasukkan nama definition tersebut.

Kelebihan lain dari penggunaan XML method dalam pembuatan screen definition adalah definition itu sendiri dapat digunakan sebagai ActionForwards oleh Struts framework. Hal ini dapat mengurangi secara drastic halaman JSP yang dibutuhkan oleh aplikasi. Menggunakan definition sebagai ActionForwards merupakan pokok pembahasan yang akan dibahas lebih detail selanjutnya.

2.4.5 Menggunakan Screen Definitions

Membuat sebuah screen definition belum cukup untuk ditampilkan pada user. Supaya sebuah definition dapat dipakai, gunakan tag <tiles:insert> dan isikan nama definition yang akan ditampilkan :