Planning Construction Kesimpulan Saran

41 b. Keyboard Keyboard adalah alat input yang biasanya didampingi dengan alat tampilan display di layar monitor yang menampilkan apa yang ditekan di keyboard. c. Mouse Mouse adalah alat input komputer yang digunakan oleh berbagai program aplikasi GUI Graphical User Interface dengan petunjuk posisi yang ditampilkan melalui monitor. 2. Perangkat Lunak Perangkat lunak merupakan bagian dari sistem pengolahan data yang digunakan untuk mengaktifkan fungsi dari perangkat keras komputer. Perangkat lunak yang penulis gunakan adalah sebagai berikut: a. Sistem Operasi Sistem operasi yang penulis sarankan adalah Microsoft Windows XP SP2. b. Program aplikasi Merupakan perangkat lunak yang akan digunakan dalam pembuatan program adalah server Apache Tomcat 5.5.17, J2SE 1.5, NetBeans IDE 6.7.1, MySql 5.

4.2. Planning

Dalam hal ini, penulis membangun aplikasi mobile learning secara individu. Adapun waktu yang diperlukan dalam penelitian pembuatan 42 aplikasi ini adalah selama 9 Minggu. Berikut ini adalah timeline yang penulis rancanakan selama membangun aplikasi mobile learning: Tabel 4.1. Planning Pembuatan Aplikasi Minggu ke-1 Minggu ke-2 Minggu ke-3 Minggu ke-4 Minggu ke-5 Minggu ke-6 Minggu ke-7 Minggu ke-8 Minggu ke-9 Communication Planning Modelling Construction Deployment

4.3. Modelling

4.3.1. Use Case Diagram

Gambar 4.1 Use Case Diagram Autentikasi User Berikut ini adalah use case naratif dari use cese diagram di atas yang menjelaskan urutan kegiatan yang dilakukan sistem dan user Tutor Autentikasi User Login Logout Administrator 43

1. Use Case Autentikasi User

Tabel 4.2 Use Case Autentikasi User Usecase Name Autentikasi User Actor s Administrator, tutor Brief Description Usecase ini mendeskripsikan event dari administrator dan tutor untuk login dan logout ke dalam sistem. Precondition User haruslah sudah terdaftar sebagai pengguna sistem. User haruslah seorang yang terdaftar sebagai administrator atau tutor. Trigger Use case ini diinisiasi pada saat user membuka aplikasi mobile learning. Basic Flow 1. User memulai aplikasi mobile learning 2. User mengklik tombol [login] Post condition Aplikasi klien mengirimkan user dan password yang dimasukan oleh user ke server, dan mengecek apakah username dan password cocok. Jika cocok maka aplikasi akan menampilkan menu utama, jika tidak cocok maka aplikasi akan menampilkan login form kembali. 44

2. Use Case Manajemen User

Gambar 4.2 Use Case Diagram Manajemen User Berikut ini adalah use case naratif dari use cese diagram di atas yang menjelaskan urutan kegiatan yang dilakukan sistem dan user. Tabel 4.3 Use Case Manajemen User Usecase Name Manajemen User Actor s Administrator Brief Description Usecase ini mendeskripsikan event dari administrator yaitu menambah data user. Precondition User haruslah sudah terdaftar sebagai pengguna sistem. Manajemen User Administrator Create User View User Manage own account Delete User Update User Tutor Login Logout 45 User haruslah seorang yang terdaftar sebagai administrator. Trigger Use case ini diinisiasi pada saat administrator memilih [menu add a user] pada user management. Basic Flow 1. Administrator membuka list dengan memilih menu [user management] 2. Administrator memilih menu [input user] 3. Administrator memasukan data User 4. Administrator mengklik tombol [save] 5. Administrator mengklik tombol [keluar] Alternate flow 2a. Administrator memilih salah satu user kemudian memilih menu [edit], maka aplikasi akan menampilkan data user tersebut ke dalam form dan kembali ke langkah 3. 2b. Administrator memilih salah satu user kemudian memilih menu [hapus], maka aplikasi akan menghapus data user yang dipilih dan menampilkan kembali daftar user Post condition Aplikasi menyimpan data User yang telah dimasukkan ke dalam database, dan aplikasi menampilkan kembali daftar user. 46

3. Use Case Materi

Gambar 4.3 Use Case Diagram Manajemen Materi Tabel 4.4 Use Case Materi Usecase Name Materi Actor s Administrator, Tutor Brief Description Usecase ini mendeskripsikan event dari administrator yaitu menambah,merubah dan menghapus Materi. Precondition User haruslah sudah terdaftar sebagai tutor atau administrator. Trigger Use case ini diinisiasi pada saat administrator memilih menu [materi]. Basic Flow 1. User membuka list dengan memilih menu [materi] 2. User memilih materi dari daftar 3. User memasukan data materi 4. User mengklik tombol [save] Materi Create Materi View Materi Upadate Materi Delete Materi Administrator Tutor Student 47 Alternate flow 2a. User memilih salah satu materi kemudian mengedit data materi pada form, kemudian User mengklik tombol [save] untuk menyimpan hasil masukkan. 2b. User memilih salah satu course kemudian memilih menu [delete], maka aplikasi akan menghapus materi yang dipilih. Post condition Aplikasi menyimpan perubahan materi ke dalam database, dan aplikasi menampilkan kembali daftar course.

4. Use Case Course

Gambar 4.4 Use Case Diagram Manajemen Course Tabel 4.5 Use Case Autentikasi User Usecase Name Course Actor s Administrator Course Create Course View Course Upadate Course Delete Course Administrator Tutor Student 48 Brief Description Usecase ini mendeskripsikan event dari administrator yaitu menambah,merubah dan menghapus Course. Precondition User haruslah sudah terdaftar sebagai pengguna sistem. User haruslah seorang yang terdaftar sebagai administrator. Trigger Use case ini diinisiasi pada saat administrator memilih menu [managemen course]. Basic Flow 1. Administrator membuka list dengan memilih menu [course] 2. Administrator memasukan data course 3 . Administrator mengklik tombol [simpan] Alternate flow 2a. Administrator memilih salah satu course kemudian mengedit data course pada form, kemudian user mengklik tombol [save]. 2b. Administrator memilih salah satu course kemudian mengklik tombol [hapus], maka aplikasi akan menghapus course yang dipilih. Post condition Aplikasi menyimpan perubahan course ke dalam database. 49

5. Use Case Manajemen File

Gambar 4.5 Use Case Diagram Manajemen File Tabel 4.6 Use Case Manajemen File Usecase Name Manajemen File Actor s Administrator, Dosen Brief Description Usecase ini mendeskripsikan event dari administrator dan Dosen yaitu menambah dan menghapus File. Precondition User haruslah sudah terdaftar sebagai pengguna sistem. User haruslah seorang yang terdaftar sebagai administrator atau Dosen. Trigger Use case ini diinisiasi pada saat user memilih menu [Upload File]. Basic Flow 1. User membuka list dengan memilih menu [Upload File]. 2. User mengklik tombol [browse]. 3 . User memilih file yang akan diupload Manajemen File Administrator Tutor Upload File Delete File 50 4. User mngklik tombol submit. Alternate flow Post condition Aplikasi menyimpan nama file ke dalam database, dan meyimpan file tersebut ke dalam folder pada server.

6. Use Case Manajemen Gambar

Gambar 4.6 Use Case Diagram Manajemen Gambar Tabel 4.7 Use Case Manajemen Gambar Usecase Name Manajemen Gambar Actor s Administrator, Dosen Brief Description Usecase ini mendeskripsikan event dari administrator dan Dosen yaitu menambah dan menghapus Gambar. Precondition User haruslah seorang yang terdaftar sebagai administrator atau Dosen. Trigger Use case ini diinisiasi pada saat user memilih menu [Image Manager]. Manajemen Gambar Administrator Tutor Upload Gambar Delete File 51 Basic Flow 1. User membuka list dengan memilih menu [Image Manager]. 2. User mengklik tombol [browse]. 3 . User memilih gambar yang akan diupload 4. User mngklik tombol submit. Alternate flow Post condition Aplikasi menyimpan nama file ke dalam database, dan meyimpan gambar tersebut ke dalam folder pada server.

4.3.2. Entity Relational Diagram ERD

Entity Relational Diagram ERD adalah suatu model yang digunakan untuk menggambarkan data dalam bentuk entitas, atribut dan hubungan antar-entitas. ERD dapat digunakan pada semua alat-alat pemodelan dan merupakan metode untuk menggambarkam sistem penyimpanan data. Hubungan antar tabel adalah sebagai berikut : Gambar 4.7 Entity Relational Diagram ERD 52 Berikut ini adalah kamus data dari tabel-tabel yang ada di dalam aplikasi: 1. Tabel User Nama Tabel : user Keterangan : Berisi data user Primary Key : id Tabel 4.8 Tabel user Nama Field Tipe Panjang Keterangan id int 4 ID user user_namaDepan Varchar 255 Nama depan user user_namaBelakang Varchar 255 Nama belakang user user_email Varchar 255 Email user user_password Varcahr 255 Password user User_type Varcahr 255 User role 2. Tabel Materi Nama Tabel : materi Keterangan : Berisi daftar-daftar materi berdasarkan mata kuliah yang diajarkan Primary Key : materi_id 53 Tabel 4.9 Tabel Materi Nama Field Tipe Panjang Keterangan materi _id Int 4 Id materi title varchar 255 Judul materi content text Isi materi user int 4 Id User dengan role tutor yang membuat materi matkul int 4 Id dari mata kuliah 3. Tabel Mata Matkul Nama Tabel : matkul Keterangan : Berisi daftar-daftar mata kuliah yang diajarkan Primary Key : matkul_id Tabel 4.10 Tabel Matkul Nama Field Tipe Panjang Keterangan matkul_id Int 4 Id mata kuliah matkul_title varchar 50 Nama mata kuliah matkul_kode varchar 8 Kode mata kuliah matkul_semester varchar 2 Semester mata kuliah 4. Tabel Kuliah Nama Tabel : kuliah Keterangan : Berisi data-data perkuliahan Primary Key : kuliah_id 54 Tabel 4.11 Tabel Kuliah Nama Field Tipe Panjang Keterangan Kuliah_id int 4 ID kuliah auto increment Matkul int 4 Foreign key dari mata kuliah User int 4 Foreign key user 5. Tabel Images Nama Tabel : images Keterangan : Berisi data-data gambar Primary Key : image_id Tabel 4.12 Tabel image Nama Field Tipe Panjang Keterangan image_id int 4 ID image auto increment Image_path varchar 255 Nama file gambar. User int 4 Foreign key user 6. Tabel File Nama Tabel : file Keterangan : Berisi data-data file yang diupload Primary Key : file_id Tabel 4.13 Tabel File Nama Field Tipe Panjang Keterangan file_id int 4 ID kuliah auto increment 55 File_path Varchar 255 Nama file Materi int 4 Foreign key materi

4.3.3 Pemodelan Antar Muka

Pada tahap perancangan antar muka penulis mempertimbangkan beberapa aspek. Berikut adalah beberapa aspek yang menjadi pertimbangan penulis: a. Disain dibuat konsisten. b. Navigasi mudah dimengerti. c. Penggunaan gambar yang sesedikit mungkin. d. Perpindahan halaman dibuat seminimal mungkin. Berdasarkan pertimbangan di atas, maka penulis merancang antar muka sebagai berikut: 1. Antar Muka Halaman Awal Gambar 4.8. Perancangan halaman Login Untuk admin dan tutor, saat pertama kali aplikasi ini dibuka di browser, aplikasi akan langsung menampilkan form login. APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning Copyright © 2010 All Right Reserved Gambar Username Password 56 2. Antar Muka Halaman Kelas Gambar 4.9. Perancangan halaman Kelas Menu-menu yang penulis tampilkan berisi: Kelas, Kuliah, Mata Kuliah, Materi, User, dan Logout. Pada halaman kelas, penulis tampilkan tabel Daftar kelas dan form untuk operasi create, update, dan delete kelas. Kelas Kuliah Mata Kuliah Materi User Logout APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning Copyright © 2010 All Right Reserved Tabel Kelas Nama Kelas New Save Delete 57 3. Antar Muka Halaman Kuliah Gambar 4.10 Perancangan halaman Kuliah Pada halaman kuliah, penulis tampilkan tabel Daftar kuliah dan form untuk operasi create, update, dan delete kuliah. 4. Antar Muka Halaman Materi Gambar 4.11 Perancangan halaman Materi Kelas Kuliah Mata Kuliah Materi User Logout APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning Kelas Kuliah Mata Kuliah Materi User Logout APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning Tabel Kuliah Course Kelas Tutor New Save Delete Tabel Materi New Save Delete Course Tutor Title Content 58 Pada halaman materi, penulis tampilkan tabel Daftar materi dan form untuk operasi create, update, dan delete materi. 5. Antar Muka Halaman Mata Kuliah Gambar 4.12 Perancangan halaman Mata Kuliah Pada halaman Mata kuliah, penulis tampilkan tabel Daftar Mata kuliah dan form untuk operasi create, update, dan delete Mata kuliah. Kelas Kuliah Mata Kuliah Materi User Logout APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning New Save Delete Tabel Mata Kuliah Semester Kode Title 59 6. Antar Muka Halaman User Gambar 4.13 Perancangan halaman User Pada halaman User, penulis tampilkan tabel Daftar User dan form untuk operasi create, update, dan delete User.

4.3.4 Pemodelan Kelas

Framework yang penulis gunakan dalam pengembangan aplikasi ini Kelas Kuliah Mata Kuliah Materi User Logout APLIKASI CONTENT MANAGEMENT SYSTEM m-Learning Tabel User New Save Delete Nama Depan Nama Belakang Email Password Konfirmasi Password NIP Gelar Role 60 adalah framework hibernate yaitu framework yang melakukan pemetaan table- table pada database ke dalam objek-objek yang disebut object mappings. Setiap object yang dibuat adalah representasi dari fields yang ada di database. Setelah mapping dilakukan, selanjutnya penulis membuat kelas-kelas yang digunakan untuk mengakses data yang disebut DAO Data Access Object. Berikut adalah object mappings dan DAO Data Access Object yang penulis buat. 61 a. Package entity Package entity berisi object mappings dari database, berikut adalah bentuk class diagram beserta relasi dari objek-objek yang ada di package entity. Gambar 4.14 Class Diagram pada package entity 62 b. Package DAO Berikut adalah class diagram dari package DAO yang penulis buat: Gambar 4.9. Class Diagram Package DAO

4.4. Construction

Gambar 4.15 Class Diagram pada package DAO 63 4.4 Construction 4.4.1 Implementasi antar muka Pada tahap ini, penulis memulai membuat aplikasi dari perancangan yang telah penulis buat sebelumnya. Bahasa pemrograman yang penulis terapkan adalah bahasa pemrograman Java dengan framework Hibernate untuk relational database dan JMaki sebagai framework AJAX. Adapun listing kode pemrograman dapat dilihat pada Lampiran B. Adapun tampilan aplikasi yang penulis buat bisa dilihat pada gambar dibawah ini: 1. Tampilan Halaman Login Gambar 4.16 Halaman Login 64 2. Tampilan Halaman Mata Kuliah Gambar 4.17 Halaman Mata Kuliah 3. Tampilan Halaman Materi Gambar 4.18 Halaman Materi 65 4. Tampilan Halaman User Gambar 4.19 Halaman User 5. Tampilan Halaman Upload File Gambar 4.20 Halaman Materi untuk Tutor 66 6. Tampilan halaman Image Manager Gambar 4.21 Halaman Image Manager 7. Tampilan Halaman Materi untuk Tutor Gambar 4.22 Halaman Materi untuk Tutor 67 8. Tampilan Halaman User untuk Tutor Gambar 4.23 Halaman User untuk Tutor 9. Tampilan Halaman Frontend daftar Dosen Gambar 4.24 Halaman Frontend daftar Dosen 68 10. Tampilan Halaman Frontend daftar Mata Kuliah Gambar 4.25 Halaman Frontend daftar Mata Kuliah 11. Tampilan Halaman Frontend Profil Dosen Gambar 4.26 Halaman Frontend Profil Dosen 69 12. Tampilan Halaman Frontend Materi Gambar 4.27 Halaman Frontend Materi 13. Tampilan Hasil Pencarian Gambar 4.28 Halaman Hasil Pencarian 70 Pengujian pada Handphone User Penulis melakukan pengujian pada beberapa tipe Handphone. Penulis melakukan pengujian dengan menggunakan jaringan ad-hoc dari laptop ke handphone. Berikut adalah hasil pengujian yang telah penulis lakukan: Gambar 4.29 Pengujian pada handphone Nokia E63 Gambar 4.30 Pengujian pada handphone Nokia E51 4.4. JUn a Gamb .2 Unit Tes Berikut ad it yang terin a. Class m bar 4.31 Pe sting dalah hasil ntegrasi den materi: Gamba engujian pad unit testin ngan IDE N ar 4.32 Has da handphon ng yang pen NetBeans 6.7 sil Unit Test ne Nokia C nulis lakuk 7.1: ting class m 3 kan dengan materi 71 tools 72 b. Class matkul: Gambar 4.33 Hasil Unit Testing class matkul c. Class user: Gambar 4.34 Hasil Unit Testing class user d. Class file: Gambar 4.35 Hasil Unit Testing class file 73 e. Class Image: Gambar 4.36 Hasil Unit Testing class Image

4.4.3 System Testing

Pada tahap ini penulis melakukan serangkaian testing. Hasil dari testing yang telah penulis lakukan adalah sebagai berikut: a. Recovery Testing Penulis membuat proses pemulihan dengan memanggil fungsi rollback pada API Hibernate untuk mengatasi gangguan yang dapat menyebabkan kegagalan pada aplikasi. Fungsi rollback akan membatalkan semua perubahan yang dilakukan semua perintah SQL sejak proses transaksional dimulai atau sejak perubahan terakhir dibuat jika terjadi kegagalan. Pada tahap ini penulis melakukan langkah –langkah sebagai berikut: 1. Mematikan database Database dimatikan ketika aplikasi sedang dalam keadaan berjalan. Dari log pada server terlihat bahwa fungsi rollback untuk mengatasi kegagalan akses database berjalan dengan baik. 74 2. Mematikan server Server dimatikan ketika aplikasi sedang dalam keadaan berjalan. Dari log pada server terlihat bahwa fungsi rollback untuk mengatasi server yang mati berjalan dengan baik. b. Security Testing Hasil dari security testing yang penulis lakukan menunjukkan tidak terdapat link yang memungkinkan untuk diserang. Berikut pada tabel 4.14 dan tabel 4.15 adalah hasil pengujian yang telah penulis lakukan: Tabel 4.14 Hasil Security Testing pada halaman frontend Test Hasil Jumlah Link 10 Kemungkinan serangan Tabel 4.15 Hasil Security Testing pada halaman Administrator Test Hasil Jumlah Link 26 Kemungkinan serangan 75 c. Stress Testing Hasi dari stress testing yang penulis lakukan menunjukkan aplikasi mampu berjalan dalam keadaan normal dengan beban yang berat. Berikut adalah hasil pengujian yang telah penulis lakukan: Performance data: Tabel 4.16 Hasil Performance data pada Stress Testing Pada tabel 4.16 di atas menunjukkan data yang diterima pengguna dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Pengguna masih bisa mengakses total rata-rata 2,42 halaman dalam waktu 1 menit dengan jumlah rata- rata sukses 2,42 halaman atau 100 . 76 Response Time: Tabel 4.17 Hasil Response Time data pada Stress Testing Pada tabel 4.17 di atas menunjukkan respon aplikasi terhadap permintaan halaman oleh pengguna selama 1 menit yang dihitung setiap 10 detik. Total selama 1 menit pengujian, hasil rata-rata yang diperoleh adalah 1,8 detik per halaman. 77 Bandwith Usage: Tabel 4.18 Hasil Bandwith Usage data pada Stress Testing Pada tabel 4.18 di atas menunjukkan penggunaan bandwith oleh aplikasi dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Total selama pengujian adalah 9,96 kbits untuk penerimaan pada satu pengguna dan 1,68 kbits untuk pengiriman pada satu pengguna. 78 Errors report: Tabel 4.19 Hasil Errors report data pada Stress Testing Pada tabel 4.19 di atas menunjukkan error yang terjadi pada aplikasi selama stress testing dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Hasil yang didapat menunjukkan tidak ada error pada aplikasi selama stress testing dilakukan. 79 Performance Testing Berikut adalah hasil pengujian yang telah penulis lakukan: Performance data: Tabel 4.20 Hasil Performance data data pada Performance Testing Pada tabel 4.20 di atas menunjukkan data yang diterima pengguna dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Pengguna masih bisa mengakses total rata-rata 2,4 halaman dalam waktu 1 menit dengan jumlah rata- rata sukses 2,4 halaman atau 100 . 80 Response time: Tabel 4.21 Hasil Response time data pada Performance Testing Pada tabel 4.21 di atas menunjukkan respon aplikasi terhadap permintaan halaman oleh pengguna dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Total selama 1 menit pengujian, hasil rata-rata yang diperoleh adalah 1,711 detik per halaman. 81 Bandwith Usage Tabel 4.22 Hasil Bandwith Usage data pada Performance Testing Pada tabel 4.22 di atas menunjukkan penggunaan bandwith oleh aplikasi dalam kurun waktu 1 menit yang dihitung setiap 10 detik. Total selama pengujian adalah 2,0 kbits untuk penerimaan pada satu pengguna dan 0,54 kbits untuk pengiriman pada satu pengguna. 82 Errors Report: Tabel 4.23 Hasil Errors Report data pada Performance Testing Pada tabel 4.23 di atas menunjukkan error yang terjadi pada aplikasi selama stress testing dalam kurun waktu 1 menit yang dihitung setiap 10 detik. 83 Hasil yang didapat menunjukkan tidak ada error pada aplikasi selama stress testing dilakukan. 4.5 Deployment 4.5.1 Deployment Pada tahap ini penulis melakukan deployment aplikasi pada server Pusat Data Teknik informatika Fakultas Sains dan Teknologi PUSDATIN FST. 4.5.2 Users Delivery Feedback Untuk mendapatkan feedback mengenai aplikasi yang penulis kembangkan, penulis mendapat saran dari user mengenai aplikasi yang penulis buat. Berikut adalah feedback yang penulis dapatkan: 1. Halaman yang tampil disarankan memiliki tampilan yang menyesuaikan dengan lebar layar, sehingga tidak ada scroll pada bagian bawah halaman. 2. Pada setiap halaman materi disarankan untuk ditampilkan materi dari Dosen yang sama, sehingga memudahkan user dalam hal navigasi. 3. Ukuran huruf pada aplikasi disarankan untuk diperbesar. 84 BAB V PENUTUP

5.1 Kesimpulan

Berdasarkan uraian dan pembahasan pada bab-bab sebelumnya, maka dapat ditarik kesimpulan bahwa : 1. Dengan mengembangkan aplikasi mobile learning berbasis web, pengguna tidak memerlukan aplikasi khusus untuk menggunakan aplikasi ini. 2. Berdasarkan pengujian yang dilakukan oleh pengguna, dengan adanya fasilitas-fasilitas untuk mengupdate content, aplikasi memiliki content yang dinamis karena content dapat diisi sesuai dengan kebutuhan pengajar. 3. Berdasarkan pengujian yang dilakukan oleh penulis, aplikasi mobile learning ini dapat berjalan sesuai dengan tujuan, analisis, dan desain yang telah dirancang, sehingga aplikasi ini dapat membantu pembelajar dalam aktifitas belajar. Tabel 5.1 Rangkuman Hasil pengujian Nama Testing Hasil Security Testing Dari 36 link kemungkinan serangan 0 Stress Testing Performance data 2,42 halaman per detik Response Time Rata-rata 1,8 detik halaman. Bandwith Usage Receive per user 9,96 kbits Sending per user 1,68 kbits Errors report Total errors 0 Performance Testing Performance data 2,42 detik per halaman. Response Time Rata-rata 1,711 detik halaman. Bandwith Usage Receive per user 2,0 kbits Sending per user 0,54 kbits Errors report Total errors 0

5.2 Saran

Berdasarkan kesimpulan-kesimpulan yang telah dikemukakan, dapat diajukan beberapa saran untuk pengembangan lebih lanjut antara lain : 1. Disarankan adanya media player untuk file multimedia sehingga dapat dibuka dengan cara streaming. 2. Aplikasi ini belum dapat menyimpan hasil yang didapat mahasiswa setelah mengerjakan soal. Disarankan adanya penyimpanan nilai bagi mahasiswa yang telah mengerjakan soal-soal. 86 DAFTAR PUSTAKA Ally , Mohamed. 2009. Mobile Learning Transforming the Delivery of Education and Training. Edmonton: AU Press. Bauer , Christian And King , Gavin. 2005. Java Persistence with Hibernate. New York: Manning Basaeed, Essa and Berri, Jawad.2007. Learner-Centric Context-Aware Mobile Learning. Jogiyanto, H.M. 2008. Metodologi Penelitian Sistem Informasi. Yogyakarta: Andi Offset. Kineo and UFI. 2009. Mobile Learning Reviewed. UK Low , Leonard.2007. M-learning standards report. Canberra MySQL Reference Manual. 2001. MySQL AB Naik, Kshirasagar And Tripathy, Priyadarshi. 2008 . Software Testing And Quality Assurance Theory and Practice. New Jersey: A johnwiley sons, inc., publication. 87 Naughton , Patrick and Schildt, Herbert . 2001. Java 2: The Complete Reference. California:OsborneMcGraw-Hill Niazi , Razieh and Qusay H. Mahmoud. 2008. Design and Development of a Device-Independent System for Mobile Learning. IEEE Education Society Students Activities Committee Pressman, Roger S. 2001. Software Engineering: A Practitioners Approach. New York: McGraw-Hill. 2005. Software Engineering: A Practitioner’s Approach. New York: Mc-Graw Hill. Rachdian , Adhi. 2005 Mastering CMS dengan Mambo Joomla. Jakarta: PT. Elex Media Komputindo. Stieglitz , Stefan and Fuchß, Christoph.2007. Mobile Learning by Using Ad Hoc Messaging Network. LAMPIRAN A WAWANCARA Wawancara dilakukan kepada Bapak Imam M. Shofi sebagai Kepala Pusat Data Teknik informatika Fakultas Sains dan Teknologi PUSDATIN FST. Adapun pertanyaan yang penulis ajukan adalah sebagai berikut: 1. Apakah aplikasi mobile learning dibuat terbuka dapat diakses oleh siapa saja atau tidak? 2. Menu apa saja yang seharusnya ada pada aplikasi mobile learning? 3. File berformat apa saja yang biasanya dijadikan bahan mengajar? 4. Word processor pada aplikasi web seperti apa yang diperlukan untuk mangakomodasi materi belajar? Dari wawancara di atas, penulis menarik kesimpulan sebagai berikut: 1. Aplikasi dibuat terbuka dapat diakses oleh siapa saja. 2. Aplikasi menampilkan profil dosen yang mengisi konten belajar. 3. File yang sering digunakan adalah file dokumen berformat .doc, .ppt, .pdf dan file multimedia seperti .mp3 dan .flv. 4. Word processor untuk mengisi konten memiliki fasilitas yang mirip dengan aplikasi word processor pada aplikasi desktop seperti dapat membuat tabel, numbering, format huruf, dan memasukkaan gambar pada konten. LAMPIRAN B USERS FEEDBACK Kuesioner penulis sebarkan untuk mendapatkan feedback dari user. Responden kuesioner ini adalah mahasiswa dan dosen. Adapun hasil jawaban kuesioner adalah sebagai berikut: No Pertanyaan Jawaban Ya Tidak 1 Apakah tujuan dari aplikasi dapat tercapai? 87 13 2 Apakah disain menggunakan elemen-elemen standard dan tidak menggunakan antarmuka dan elemen-elemen yang sulit dipahami? 93 7 3 Apakah seluruh bagian dari disain benar-benar diperlukan? 93 7 4 Apakah disain aplikasi konsisten? 93 7 5 Apakah aplikasi dapat meningkatkan produktifitas pembelajaran? 100 0 6 Apakah disain aplikasi mudah dipelihara? 93 7 7 Apakah faktor-faktor keamanan sudah terpenuhi? 93 7 Dari hasil kuesioner di atas, penulis menyimpulkan bahwa aplikasi telah memenuhi kebutuhan pengguna. LAMPIRAN C LISTING SOURCE CODE Hibernate.cfg.xml: ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐configuration PUBLIC ‐HibernateHibernate Configuration DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐configuration‐3.0.dtd hibernate ‐configuration session‐factory property name=hibernate.dialectorg.hibernate.dialect.MySQLDialectproperty property name=hibernate.connection.driver_classcom.mysql.jdbc.Driverproperty property name=hibernate.connection.urljdbc:mysql:localhost:3306skripsi4property property name=hibernate.connection.usernamerootproperty property name=hibernate.connection.passwordproperty mapping resource=entityMateri.hbm.xml mapping resource=entityMatkul.hbm.xml mapping resource=entityUser.hbm.xml mapping resource=entityFile.hbm.xml mapping resource=entityImages.hbm.xml session‐factory hibernate ‐configuration Package dao: Class DAO.java: import java.util.logging.Level; import java.util.logging.Logger; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class DAO { protected DAO { } public static Session getSession { Session session = Session DAO.session.get; if session == null { session = sessionFactory.openSession; DAO.session.setsession; } return session; } protected void begin { getSession.getTransaction.begin; } protected void commit { getSession.getTransaction.commit; } protected void rollback { try { getSession.getTransaction.rollback; log.logLevel.WARNING,rollback success; } catch HibernateException e { log.logLevel.WARNING,Cannot rollback,e; } try { getSession.close; } catch HibernateException e { log.logLevel.WARNING,Cannot close,e; } DAO.session.setnull; } public static void close { getSession.close; DAO.session.setnull; } private static final Logger log = Logger.getAnonymousLogger; private static final ThreadLocal session = new ThreadLocal; private static final SessionFactory sessionFactory = new Configuration.configure.buildSessionFactory; } Class DAOFile.java: package dao; import entity.AdException; import entity.File; import entity.Materi; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; public class DAOFile extends DAO { public File getString file_id throws AdException { try { begin; Query q = getSession.createQuery from File where file_id= :file_id; q.setStringfile_id, file_id; File kelas = File q.uniqueResult; commit; return kelas; } catch HibernateException e { rollback; throw new AdExceptionCould not obtain the named category + file_id, e; } } public File createString path, Materi materi, byte[] file_file, String file_type throws AdException { try { begin; File file = new Filepath, materi, file_type; getSession.savefile; commit; return file; } catch HibernateException e { rollback; throw new AdExceptionCould not create file + e; } } public void deleteFile file throws AdException { try { begin; getSession.deletefile; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not delete file, e; } } public List list throws AdException { try { begin; Query q = getSession.createQueryfrom File; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } } Class DAOImage.java: package dao; import entity.AdException; import entity.Images; import entity.User; import org.hibernate.HibernateException; import org.hibernate.Query; public class DAOImage extends DAO { public Images getString file_id throws AdException { try { begin; Query q = getSession.createQuery from Images where image_id= :file_id; q.setStringfile_id, file_id; Images kelas = Images q.uniqueResult; commit; return kelas; } catch HibernateException e { rollback; throw new AdExceptionCould not obtain the named category + file_id, e; } } public Images createString path, User user throws AdException { try { begin; Images file = new Imagespath, user; getSession.savefile; commit; return file; } catch HibernateException e { rollback; throw new AdExceptionCould not create file + e; } } public void deleteImages image throws AdException { try { begin; getSession.deleteimage; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not delete file, e; } } } Class DAOMateri.java: package dao; import java.util.List; import org.hibernate.HibernateException; import entity.AdException; import entity.Materi; import entity.User; import entity.Matkul; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.LogicalExpression; import org.hibernate.criterion.Restrictions; public class DAOMateri extends DAO { public Materi getString materi_id throws AdException { try { begin; Query q = getSession.createQuery from Materi where materi_id= :materi_id; q.setStringmateri_id, materi_id; Materi materi = Materi q.uniqueResult; commit; return materi; } catch HibernateException e { rollback; throw new AdExceptionCould not obtain the named category + materi_id, e; } } public Materi getByMatkulString matkul throws AdException { try { begin; Query q = getSession.createQuery from Materi where matkul= :matkul; q.setStringmatkul, matkul; Materi materi = Materi q.uniqueResult; commit; return materi; } catch HibernateException e { rollback; throw new AdExceptionCould not obtain the named category + matkul, e; } } public List listBySearchString keyword throws AdException { try { begin; Criteria crit = getSession.createCriteriaMateri.class; Criterion title = Restrictions.liketitle, + keyword + ; Criterion content = Restrictions.likecontent, + keyword + ; LogicalExpression orExp = Restrictions.ortitle, content; crit.addorExp; List result = crit.list; commit; return result; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public Materi createString title, String content, User user, Matkul matkul throws AdException { try { begin; Materi advert = new Materititle, content, user, matkul; getSession.saveadvert; commit; return advert; } catch HibernateException e { rollback; throw new AdExceptionCould not create advert, e; } } public void deleteMateri advert throws AdException { try { begin; getSession.deleteadvert; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not delete advert, e; } } public List list throws AdException { try { begin; Query q = getSession.createQueryfrom Materi; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listByMatkulString cd throws AdException { try { begin; Query q = getSession.createQueryfrom Materi where matkul= :cd; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listByUserString usId throws AdException { try { begin; Query q = getSession.createQueryfrom Materi where user= :usId; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the Materi + e; } } public void updateMateri materi, String judul, String content, Matkul matkul, User user throws AdException { try { begin; materi.setTitlejudul; materi.setContentcontent; materi.setMatkulmatkul; materi.setUseruser; getSession.mergemateri; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not save the category, e; } } } Class DAOMatkul.java: package dao; import entity.Matkul; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import entity.AdException; import org.hibernate.Criteria; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.LogicalExpression; import org.hibernate.criterion.Restrictions; public class DAOMatkul extends DAO { public Matkul getString matkul_id throws AdException { try { begin; Query q = getSession.createQuery from Matkul where matkul_id = :matkul_id; q.setStringmatkul_id, matkul_id; Matkul category = Matkul q.uniqueResult; commit; return category; } catch HibernateException e { rollback; throw new AdExceptionCould not obtain the named category + matkul_id, e; } } public Matkul createString title, String kode, String sem throws AdException { try { begin; Matkul matkul = new Matkultitle, kode, sem; getSession.savematkul; commit; return matkul; } catch HibernateException e { rollback; throw new AdExceptionCould not create advert, e; } } public void deleteMatkul matkul throws AdException { try { begin; getSession.deletematkul; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not delete advert, e; } } public List list throws AdException { try { begin; Query q = getSession.createQueryfrom Matkul order by matkul_title asc; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listBySearchString keyword throws AdException { try { begin; Criteria crit = getSession.createCriteriaMatkul.class; crit.addRestrictions.likematkul_title, + keyword + ; List result = crit.list; commit; return result; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listTutor throws AdException { try { begin; Query q = getSession.createQueryfrom Matkul order by matkul_title asc; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public void updateMatkul matkul, String judul, String kode, String sem throws AdException { try { begin; matkul.setMatkul_titlejudul; matkul.setMatkul_kodekode; matkul.setMatkul_semestersem; getSession.mergematkul; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not save the category, e; } } } Class DAOUser.java: package dao; import org.hibernate.HibernateException; import org.hibernate.Query; import entity.AdException; import entity.User; import java.util.List; import org.hibernate.Criteria; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.LogicalExpression; import org.hibernate.criterion.Restrictions; public class DAOUser extends DAO { public User getString user_id throws AdException { try { begin; Query q = getSession.createQueryfrom User where user_id = :user_id; q.setStringuser_id, user_id; User user = User q.uniqueResult; commit; return user; } catch HibernateException e { rollback; throw new AdExceptionCould not get user + user_id, e; } } public List list throws AdException { try { begin; Query q = getSession.createQueryfrom User; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listBySearchString keyword throws AdException { try { begin; Criteria crit = getSession.createCriteriaUser.class; Criterion title = Restrictions.likeuser_namaDepan, + keyword + ; Criterion content = Restrictions.likeuser_namaBelakang, + keyword + ; LogicalExpression orExp = Restrictions.ortitle, content; crit.addorExp; List result = crit.list; commit; return result; } catch HibernateException e { rollback; throw new AdExceptionCould not list the categories, e; } } public List listForTutor throws AdException { try { begin; Query q = getSession.createQueryfrom User where user_type=2 order by user_namaDepan asc; List list = q.list; commit; return list; } catch HibernateException e { rollback; throw new AdExceptionCould not list the tutors, e; } } public void updateUser user, String nama_depan, String nama_belakang, String users_email, String users_nip, String users_degree, String users_type, String users_cv, String users_pwd throws AdException { try { begin; user.setUser_passwordusers_pwd; user.setUser_namaDepannama_depan; user.setUser_namaBelakangnama_belakang; user.setUser_emailusers_email; user.setUser_nipusers_nip; user.setUser_gelarusers_degree; user.setUser_typeusers_type; user.setUser_cvusers_cv; getSession.mergeuser; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not save the category + e; } } public void updateUser user, String nama_depan, String nama_belakang, String users_email, String users_nip, String users_degree, String users_type, String users_cv throws AdException { try { begin; user.setUser_namaDepannama_depan; user.setUser_namaBelakangnama_belakang; user.setUser_emailusers_email; user.setUser_nipusers_nip; user.setUser_gelarusers_degree; user.setUser_typeusers_type; user.setUser_cvusers_cv; getSession.mergeuser; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not save the category + e; } } public void resetPwdUser user, String users_nip throws AdException { try { begin; user.setUser_passwordusers_nip; getSession.mergeuser; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not save the category + users_nip, e; } } public User createString user_namaDepan, String user_namaBelakang, String user_email, String user_password, String user_nip, String user_gelar, String user_type, String user_cv throws AdException { try { begin; User user = new Useruser_namaDepan, user_namaBelakang, user_email, user_nip, user_nip, user_gelar, user_type, user_cv; getSession.saveuser; commit; return user; } catch HibernateException e { rollback; throw new AdExceptionCould not create user + user_namaDepan + e; } } public void deleteUser user throws AdException { try { begin; getSession.deleteuser; commit; } catch HibernateException e { rollback; throw new AdExceptionCould not delete user + user.getUser_namaDepan, e; } } } Package entity: Class AdException.java: package entity; public class AdException extends Exception { public AdExceptionString message { supermessage; } public AdExceptionString message, Throwable cause { supermessage, cause; } } Class File.java: package entity; public class File { private long file_id; private String file_path; private Materi materi; private String file_type; public FileString file_path, Materi materi, String file_type { this.file_path = file_path; this.materi = materi; this.file_type = file_type; } public String getFile_type { return file_type; } public void setFile_typeString file_type { this.file_type = file_type; } public File { } public long getFile_id { return file_id; } public void setFile_idlong file_id { this.file_id = file_id; } public String getFile_path { return file_path; } public void setFile_pathString file_path { this.file_path = file_path; } public Materi getMateri { return materi; } public void setMateriMateri materi { this.materi = materi; } } File.hbm.xml: ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐mapping PUBLIC ‐HibernateHibernate Mapping DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐mapping‐3.0.dtd hibernate ‐mapping class dynamic‐insert=false dynamic‐update=false mutable=true name=entity.File optimistic ‐lock=version polymorphism=implicit select‐before‐update=false table=file id column=file_id name=file_id type=long generator class=native id property column=file_path name=file_path type=string property column=file_type name=file_type type=string many‐to‐one class=entity.Materi column=materi foreign ‐key=fk_file_materi name=materi not‐null=true class hibernate ‐mapping Class Images.java package entity; public class Images { private long image_id; private String image_path; private User user; public ImagesString file_path, User user { this.image_path = file_path; this.user = user; } public Images { } public long getImage_id { return image_id; } public void setImage_idlong image_id { this.image_id = image_id; } public String getImage_path { return image_path; } public void setImage_pathString image_path { this.image_path = image_path; } public User getUser { return user; } public void setUserUser user { this.user = user; } } Images.hbm.xml ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐mapping PUBLIC ‐HibernateHibernate Mapping DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐mapping‐3.0.dtd hibernate ‐mapping class dynamic‐insert=false dynamic‐update=false mutable=true name=entity.Images optimistic ‐lock=version polymorphism=implicit select‐before‐update=false table=images id column=image_id name=image_id type=long generator class=native id property column=image_path name=image_path type=string many‐to‐one class=entity.User column=user foreign‐key=fk_image_user name=user not ‐null=true class hibernate ‐mapping Class Materi.java package entity; import java.util.HashSet; import java.util.Set; public class Materi { private long materi_id; private String title; private String content; private User user; private Matkul matkul; private Set files = new HashSet; public MateriString title, String content, User user, Matkul matkul { this.title = title; this.content = content; this.user = user; this.matkul = matkul; this.files = new HashSet; } Materi { } public Set getFiles { return files; } public void setFilesSet files { this.files = files; } public String getContent { return content; } public void setContentString content { this.content = content; } public String getTitle { return title; } public void setTitleString title { this.title = title; } public User getUser { return user; } public void setUserUser user { this.user = user; } public long getMateri_id { return materi_id; } public void setMateri_idlong materi_id { this.materi_id = materi_id; } public Matkul getMatkul { return matkul; } public void setMatkulMatkul matkul { this.matkul = matkul; } } Materi.hbm.xml ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐mapping PUBLIC ‐HibernateHibernate Mapping DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐mapping‐3.0.dtd hibernate ‐mapping class dynamic‐insert=false dynamic‐update=false mutable=true name=entity.Materi optimistic ‐lock=version polymorphism=implicit select‐before‐update=false table=materi id column=materi_id name=materi_id type=long generator class=native id property column=title name=title type=string property column=content name=content type=text many‐to‐one class=entity.User column=user foreign ‐key=fk_materi_user name=user not‐null=true many‐to‐one class=entity.Matkul column=matkul foreign‐key=fk_materi_matkul name=matkul not‐null=true set cascade=delete inverse=true lazy=true name=files table=file key column name=materi key one‐to‐many class=entity.File set set cascade=delete inverse=true lazy=true name=soals table=soal key column name=materi key set class hibernate ‐mapping Class Matkul.java package entity; import java.util.HashSet; import java.util.Set; public class Matkul { private long matkul_id; private String matkul_title; private String matkul_kode; private String matkul_semester; private Set materis = new HashSet; public Matkul { } public Matkul String matkul_title,String matkul_kode,String matkul_semester { this.matkul_title = matkul_title; this.matkul_kode = matkul_kode; this.matkul_semester = matkul_semester; this.materis = new HashSet; } public String getMatkul_semester { return matkul_semester; } public void setMatkul_semesterString matkul_semester { this.matkul_semester = matkul_semester; } public String getMatkul_kode { return matkul_kode; } public void setMatkul_kodeString matkul_kode { this.matkul_kode = matkul_kode; } public Set getMateris { return materis; } public long getMatkul_id { return matkul_id; } public String getMatkul_title { return matkul_title; } public void setMaterisSet materis { this.materis = materis; } public void setMatkul_idlong matkul_id { this.matkul_id = matkul_id; } public void setMatkul_titleString matkul_title { this.matkul_title = matkul_title; } } Matkul.hbm.xml ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐mapping PUBLIC ‐HibernateHibernate Mapping DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐mapping‐3.0.dtd hibernate ‐mapping class dynamic‐insert=false dynamic‐update=false mutable=true name=entity.Matkul optimistic ‐lock=version polymorphism=implicit select‐before‐update=false table=matkul id column=matkul_id name=matkul_id type=long generator class=native id property column=matkul_title name=matkul_title not‐null=true type=string property column=matkul_kode name=matkul_kode not‐null=true unique=true type=string property column=matkul_semester name=matkul_semester not ‐null=true type=string set cascade=delete inverse=true lazy=true name=materis table=materi key column name=matkul key one‐to‐many class=entity.Materi set class hibernate ‐mapping Class User.java package entity; import java.util.HashSet; import java.util.Set; public class User { private long user_id; private String user_namaDepan; private String user_namaBelakang; private String user_email; private String user_password; private String user_nip; private String user_gelar; private String user_type; private String user_cv; private Set materis = new HashSet; private Set images = new HashSet; public UserString user_namaDepan, String user_namaBelakang, String user_email, String user_password, String user_nip, String user_gelar, String user_type, String user_cv { this.user_type = user_type; this.user_namaDepan = user_namaDepan; this.user_namaBelakang = user_namaBelakang; this.user_email = user_email; this.user_password = user_password; this.user_nip = user_nip; this.user_gelar = user_gelar; this.user_cv = user_cv; this.materis = new HashSet; this.images = new HashSet; } public User { } public String getUser_cv { return user_cv; } public void setUser_cvString user_cv { this.user_cv = user_cv; } public Set getImages { return images; } public void setImagesSet images { this.images = images; } public Set getMateris { return materis; } public String getUser_type { return user_type; } public void setUser_typeString user_type { this.user_type = user_type; } public String getUser_email { return user_email; } public String getUser_gelar { return user_gelar; } public long getUser_id { return user_id; } public String getUser_namaBelakang { return user_namaBelakang; } public String getUser_namaDepan { return user_namaDepan; } public String getUser_nip { return user_nip; } public String getUser_password { return user_password; } public void setMaterisSet materis { this.materis = materis; } public void setUser_emailString user_email { this.user_email = user_email; } public void setUser_gelarString user_gelar { this.user_gelar = user_gelar; } public void setUser_idlong user_id { this.user_id = user_id; } public void setUser_namaBelakangString user_namaBelakang { this.user_namaBelakang = user_namaBelakang; } public void setUser_namaDepanString user_namaDepan { this.user_namaDepan = user_namaDepan; } public void setUser_nipString user_nip { this.user_nip = user_nip; } public void setUser_passwordString user_password { this.user_password = user_password; } } User.hbm.xml ?xml version=1.0 encoding=UTF‐8? DOCTYPE hibernate‐mapping PUBLIC ‐HibernateHibernate Mapping DTD 3.0EN http:hibernate.sourceforge.nethibernate ‐mapping‐3.0.dtd hibernate ‐mapping class dynamic‐insert=false dynamic‐update=false mutable=true name=entity.User optimistic ‐lock=version polymorphism=implicit select‐before‐update=false table=user id column=user_id name=user_id type=long generator class=identity id property column=user_namaDepan name=user_namaDepan type=string property column=user_namaBelakang name=user_namaBelakang type=string property column=user_email name=user_email type=string unique=true property column=user_password name=user_password type=string property column=user_nip name=user_nip type=string unique=true property column=user_gelar name=user_gelar type=string property column=user_type name=user_type not‐null=true type=string property column=user_cv name=user_cv not‐null=true type=text set cascade=delete inverse=true lazy=true name=materis table=materi key column name=user key one‐to‐many class=entity.Materi set set cascade=delete inverse=true lazy=true name=images table=images key column name=user key one‐to‐many class=entity.Images set class hibernate ‐mapping File glue.js: =========================matkul===================================== jmaki.subscribematkulTableonSelect, functionargs{ var title= args.value.title; var kode= args.value.kode; var sem= args.value.sem; var id= args.value.id; document.getElementByIdsem.value=sem; document.getElementByIdtitle.value=title; document.getElementByIdkode.value=kode; document.getElementByIdid.value=id; }; jmaki.subscribebuttonSaveonClick, functionargs{ var val = document.getElementByIdtitle.value; var kode = document.getElementByIdkode.value; var sem = document.getElementByIdsem.value; var valId = document.getElementByIdid.value; ifval={ ifvalId={ var row = { id : valId, title : val, kode:kode, sem:sem }; jmaki.doAjax{ method: POST, url: edit.jsp?title= + val+kode=+kode+sem=+sem+id=+valId , callback: function_req { jmaki.publishjmakimatkulupdateRow, { targetId: valId, value:row }; } } } else{ jmaki.doAjax{ method: POST, url: add.jsp?title= + val+kode=+kode+sem=+sem } refreshPage; } document.getElementByIdid.value=; document.getElementByIdtitle.value=; document.getElementByIdkode.value=; document.getElementByIdsem.value=; } else{ alertAnda harus mengisi judul } }; jmaki.subscribebuttonDeleteonClick, functionargs{ var id = document.getElementByIdid.value; ifid={ ifconfirmHapus data ?{ document.getElementByIdid.value=; document.getElementByIdtitle.value=; document.getElementByIdsem.value=; document.getElementByIdkode.value=; jmaki.doAjax{ method: POST, url: delete.jsp?id= + id, callback: function_req { jmaki.publishjmakimatkulremoveRow, { targetId: id }; } } } } }; jmaki.subscribebuttonNewonClick, functionargs{ document.getElementByIdkode.value=; document.getElementByIdtitle.value=; document.getElementByIdid.value=; document.getElementByIdsem.value=; }; =====================user========================================= jmaki.subscribeuserTableonSelect, functionargs{ var fn= args.value.fn; var ln= args.value.ln; var email= args.value.email; var nip= args.value.nip; var gelar= args.value.gelar; var type= args.value.type; var pwd= args.value.pwd; var cv= args.value.cv; var id= args.value.id; document.getElementByIdfn.value=fn; document.getElementByIdln.value=ln; document.getElementByIdem.value=email; document.getElementByIdnip.value=nip; document.getElementByIdgelar.value=gelar; document.getElementByIdpwd.value=pwd; document.getElementByIdid.value=id; tinyMCE.execCommandmceSetContent,false,cv; if type == 1 { document.getElementByIdtype.options[1].selected = true } else{ document.getElementByIdtype.options[2].selected = true } }; jmaki.subscribeNewUseronClick, functionargs{ document.getElementByIdid.value=; document.getElementByIdfn.value=; document.getElementByIdln.value=; document.getElementByIdem.value=; document.getElementByIdnip.value=; document.getElementByIdgelar.value=; document.getElementByIdpwd.value=; tinyMCE.execCommandmceSetContent,false,; document.getElementByIdtype.options[0].selected = true; }; jmaki.subscribeSaveUseronClick, functionargs{ var fn=document.getElementByIdfn.value; var ln=document.getElementByIdln.value; var email=document.getElementByIdem.value; var pwd=document.getElementByIdpwd.value; var nip=document.getElementByIdnip.value; var gelar=document.getElementByIdgelar.value; var type=document.getElementByIdtype.value; var cv = tinyMCE.getFCKxeditor1.getContent ; var id= document.getElementByIdid.value; iffn=ln={ ifid={ var row = { id : id, fn : fn, ln : ln, email : email, nip : nip }; jmaki.doAjax{ method: POST, url: edit.jsp?fn= + fn+cv=+cv+ln=+ln+em=+email+nip=+nip+gelar=+gelar+type=+type+id=+i d+act=1 , callback: function_req { jmaki.publishjmakiuserupdateRow, { targetId: id, value:row }; } } } else{ jmaki.doAjax{ method: POST, url: add.jsp?fn= + fn+cv=+cv+ln=+ln+em=+email+pwd=+pwd+nip=+nip+gelar=+gelar+type= +type } } } document.getElementByIdfn.value=; document.getElementByIdln.value=; document.getElementByIdem.value=; document.getElementByIdnip.value=; document.getElementByIdpwd.value=; document.getElementByIdgelar.value=; tinyMCE.execCommandmceSetContent,false,; document.getElementByIdtype.options[0].selected = true document.getElementByIdid.value=; refreshPage; }; jmaki.subscribeSaveTutoronClick, functionargs{ var fn=document.getElementByIdfn.value; var ln=document.getElementByIdln.value; var email=document.getElementByIdem.value; var pwd=document.getElementByIdpwd.value; var pwd2=document.getElementByIdpwd2.value; var nip=document.getElementByIdnip.value; var gelar=document.getElementByIdgelar.value; var type=document.getElementByIdtype.value; var id= document.getElementByIdid.value; var cv = tinyMCE.getFCKxeditor1.getContent; ifpwd2={ ifpwd==pwd2{ jmaki.doAjax{ method: POST, url: edit.jsp?fn= + fn+cv=+cv+ln=+ln+em=+email+pwd=+pwd+pwd=+pwd2+nip=+nip+gelar =+gelar+type=+type+id=+id+act=1 } document.getElementByIdfn.value=fn; document.getElementByIdln.value=ln; document.getElementByIdem.value=email; document.getElementByIdnip.value=nip; document.getElementByIdpwd.value=pwd; document.getElementByIdgelar.value=gelar; document.getElementByIdtype.value = type; document.getElementByIdid.value=id; }else{ alertpassword tidak sesuai; } }else{ jmaki.doAjax{ method: POST, url: edit.jsp?fn= + fn+cv=+cv+ln=+ln+em=+email+pwd=+pwd+pwd=+pwd2+nip=+nip+gelar =+gelar+type=+type+id=+id+act=1 } document.getElementByIdfn.value=fn; document.getElementByIdln.value=ln; document.getElementByIdem.value=email; document.getElementByIdnip.value=nip; document.getElementByIdpwd.value=pwd; document.getElementByIdgelar.value=gelar; document.getElementByIdtype.value = type; document.getElementByIdid.value=id; } }; jmaki.subscribeDeleteUseronClick, functionargs{ var id = document.getElementByIdid.value; ifid={ ifconfirmHapus data ?{ document.getElementByIdfn.value=; document.getElementByIdln.value=; document.getElementByIdem.value=; document.getElementByIdnip.value=; document.getElementByIdpwd.value=; document.getElementByIdgelar.value=; tinyMCE.execCommandmceSetContent,false,; document.getElementByIdtype.options[0].selected = true document.getElementByIdid.value=; jmaki.doAjax{ method: POST, url: delete.jsp?id= + id, callback: function_req { jmaki.publishjmakiuserremoveRow, { targetId: id }; } } } } }; jmaki.subscribeResetPwdUseronClick, functionargs{ var id = document.getElementByIdid.value; var nip =document.getElementByIdnip.value; ifid={ jmaki.doAjax{ method: POST, url: edit.jsp?id= + id+act=3nip=+nip } } }; ========================upload file================================= jmaki.subscribemateriTableUploadFileonSelect, functionargs{ var id= args.value.id; document.getElementByIdid.value=id; updateDivUploadFileid; }; function updateDivUploadFileid{ jmaki.doAjax{ method: POST, url: form.jsp?id=+id, callback: function_req { document.getElementByIdcontent.innerHTML = _req.responseText; } } } jmaki.subscribeuserTableImageonSelect, functionargs{ var id= args.value.id; document.getElementByIdid.value=id; updateDivUploadFileImageid; }; function updateDivUploadFileImageid{ jmaki.doAjax{ method: POST, url: form_image.jsp?id=+id, callback: function_req { document.getElementByIdcontent.innerHTML = _req.responseText; } } } ==========================materi======================================== jmaki.subscribenewMaterionClick, functionargs{ tinyMCE.execCommandmceSetContent,false,; document.getElementByIdid.value=; document.getElementByIdtitle.value=; document.getElementByIdcourse.value=; document.getElementByIdtutor.value=; }; jmaki.subscribemateriTableonSelect, functionargs{ var content= args.value.content; var title= args.value.title; var tutorId= args.value.tutorId; var courseId= args.value.courseId; var id= args.value.id; tinyMCE.execCommandmceSetContent,false,content; document.getElementByIdid.value=id; document.getElementByIdtitle.value=title; updateDivMatericourseId,tutorId; }; jmaki.subscribesaveMaterionClick, functionargs{ var id= document.getElementByIdid.value; var tutor= document.getElementByIdtutor.value; var course= document.getElementByIdcourse.value; var title= document.getElementByIdtitle.value; var content = tinyMCE.getFCKxeditor1.getContent ; ifid={ var row = { id : id, tutor : tutor, course : course, title : title }; jmaki.doAjax{ method: POST, url: edit.jsp?tutor= + tutor+course=+course+content=+content+title=+title+id=+id , callback: function_req { jmaki.publishjmakimateriupdateRow, { targetId: id, value:row }; } } } else{ jmaki.doAjax{ method: POST, url: add.jsp?tutor= + tutor+course=+course+content=+content+title=+title } } document.getElementByIdid.value=; document.getElementByIdtitle.value=; document.getElementByIdcourse.value=; document.getElementByIdtutor.value=; tinyMCE.execCommandmceSetContent,false,; refreshPage; }; jmaki.subscribedeleteMaterionClick, functionargs{ var id = document.getElementByIdid.value; ifid={ ifconfirmHapusx data ?{ tinyMCE.execCommandmceSetContent,false,; document.getElementByIdid.value=; document.getElementByIdtitle.value=; document.getElementByIdcourse.value=; document.getElementByIdtutor.value=; jmaki.doAjax{ method: POST, url: delete.jsp?id= + id, callback: function_req { jmaki.publishjmakimateriremoveRow, { targetId: id }; } } } } }; function updateDivMatericourseId,tutorId{ jmaki.doAjax{ method: POST, url: selectorMateri.jsp?courseId=+courseId+tutorId=+tutorId, callback: function_req { document.getElementByIdselectorMateri.innerHTML = _req.responseText; } } } ========================Login========================================= jmaki.subscribeLoginonClick, functionargs{ var nip=document.getElementByIdlogin_name.value; var pwd=document.getElementByIdlogin_password.value; jmaki.doAjax{ method: POST, url: login.jsp?nip= + nip+pwd=+pwd } }; Frontend Pages: lectures.jsp page import=dao.DAO page import=dao.DAOKuliah page import=dao.DAOUser page import=entity.AdException page import=entity.User page import=entity.Kuliah page import=java.util.Iterator page import=java.util.List page import=dao.DAOMatkul page import=entity.Matkul taglib prefix=a uri=http:jmakiv1.0jsp DOCTYPE html PUBLIC ‐W3CDTD XHTML 1.0 TransitionalEN http:www.w3.orgTRxhtml1DTDxhtml1‐transitional.dtd html head link rel=stylesheet href=jmaki‐standard.css type=textcsslink titleLecturestitle meta http‐equiv=Content‐Type content=texthtml; charset=UTF‐8 head body div id=outerBorder include file=header.jsp try { List users = new DAOUser.listForTutor; Iterator ci = users.iterator; while ci.hasNext { User user = User ci.next; String id = Long.toStringuser.getUser_id; Iterator ai = user.getMateris.iterator; if ai.hasNext { out.printdiv id=level1img src=imagesarrow.png width=9 + a href=lecture.jsp?id= + id + + user.getUser_namaDepan + + user.getUser_namaBelakang + abr div; } } DAO.close; } catch AdException e { System.out.printlne.getMessage; } div ‐‐ main ‐‐ div ‐‐ outerborder ‐‐ body html course.jsp: page import=dao.DAO page import=dao.DAOMatkul page import=entity.AdException page import=entity.Matkul page import=java.util.Iterator page import=java.util.List taglib prefix=a uri=http:jmakiv1.0jsp DOCTYPE html PUBLIC ‐W3CDTD XHTML 1.0 TransitionalEN http:www.w3.orgTRxhtml1DTDxhtml1‐transitional.dtd html head link rel=stylesheet href=jmaki‐standard.css type=textcsslink titleCoursestitle meta http‐equiv=Content‐Type content=texthtml; charset=UTF‐8 head body div id=outerBorder include file=header.jsp try { List matkuls = new DAOMatkul.list; Iterator ci = matkuls.iterator; while ci.hasNext { Matkul matkul = Matkul ci.next; String id = Long.toStringmatkul.getMatkul_id; Iterator ai = matkul.getMateris.iterator; if ai.hasNext { out.printdiv id=level1img src=imagesarrow.png width=9 + a href=subjectListByCourse.jsp?id= + id + + matkul.getMatkul_title + abrdiv; } } DAO.close; } catch AdException e { System.out.printlne.getMessage; } div ‐‐ outerborder ‐‐ body html subject.jsp: String idx = request.getParameterid; if idx == null || idx.equalsIgnoreCase { jsp:forward page=index.jsp } page import=dao.DAO page import=dao.DAOMateri page import=dao.DAOFile page import=entity.AdException page import=entity.Materi page import=entity.Matkul page import=entity.File page import=java.util.Iterator page import=java.util.List page import=dao.DAOMatkul page import=entity.Matkul page import=java.io. taglib prefix=a uri=http:jmakiv1.0jsp DOCTYPE html PUBLIC ‐W3CDTD XHTML 1.0 TransitionalEN http:www.w3.orgTRxhtml1DTDxhtml1‐transitional.dtd html head link rel=stylesheet href=..jmaki‐standard.css type=textcsslink titleSubjecttitle meta http‐equiv=Content‐Type content=texthtml; charset=UTF‐8 head body div id=outerBorder div id=header div id=bannerimg src=..imagesUIN_logo.jpg width=100 alt=UIN_logo div div div id=main div id=menu a href=..lectures.jspLecturesa | a href=..course.jspCoursesabr div String id = request.getParameterid; String Courseid = request.getParameterCourseid; try { Materi materi = new DAOMateri.getid; out.printlnb + materi.getTitle + bbr ; out.printmateri.getContent + br br br bAttachments:bbr ; Iterator ai = materi.getFiles.iterator; while ai.hasNext { File files = File ai.next; if files.getFile_type.equalsIgnoreCase2 { out.printimg src=..imagesarrow.png width=9 + a href=..uploadfiles + files.getFile_path + + files.getFile_path + abr; } } DAO.close; } catch AdException e { System.out.printlne.getMessage; } div ‐‐ main ‐‐ div id=related bMateri lain dari Dosen ini:bbr Matkul matkul = new DAOMatkul.getCourseid; Iterator ai = matkul.getMateris.iterator; while ai.hasNext { Materi advert = Materi ai.next; if advert.getMateri_id = Integer.parseIntid { out.printdiv id=subject_listimg src=..imagesarrow.png width=9 + a href=subject.jsp?id= + advert.getMateri_id + Courseid= + Courseid + + advert.getTitle + a; out.printlnbr Tutor : + advert.getUser.getUser_namaDepan + brbrdiv; } } DAO.close; div ‐‐ related ‐‐ div ‐‐ outerborder ‐‐ body html UNIVERSITAS ISLAM NEGERI UIN SYARIF HIDAYATULLAH JAKARTA Jln. Ir. H. Juanda No. 95 Ciputat 15412 Telp. 021 7402982, Fax. 021 7402982, website : www.uinjkt.ac.id , email : infouinjkt.ac.id NIM : 105091002893

I. DATA PRIBADI

Nama : Aditya Prasetio Tempat Tgl. Lahir : Jakarta, 3 November 1987 Jenis Kelamin : Laki-Laki Agama : Islam Warga Negara : Indonesia Negara Asal : Indonesia Alamat Asal : Jl. Petogogan I22 RT 00505 Gandaria Utara Keb. Baru Jakarta Selatan Kode Pos : 12240 E-mail : prasetio.adityagmail.com TeleponHP : 081319960703 Asal sekolah SMA : MA. Darunnajah Asal Propinsi SMA : Jakarta Jurusan : IPA Alamat Sekolah : Jl. Ulujami Raya No. 86 Keb. Lama Jak-Sel NEM : 20.84 Email : SDA IPK terakhir : 2.91

II. DATA KELUARGA

Nama Ayah : Achmad Soeharto Pekerjaan : - Pendidikan Terakhir : STM Nama Ibu : Sri Kadariyah Pekerjaan : - Pendidikan Terakhir : SMP Alamat Sekarang : - Kode Pos : - Telepon : - Penghasilan : - Orang TuaWali : Syamsuddin III. JENJANG PROGRAM : S1

IV. STATUS PROGRAM :

Reguler

V. PILIHAN FAKULTASPROGRAM STUDI

Fakultas : Fakultas Sains Teknologi Program Studi : Teknik Informatika Foto 3 x 4 Terbaru Pas photo PENGEMBANGAN APLIKASI CONTENT MANAGEMENT SYSTEM UNTUK MOBILE LEARNING BAGI PENGAJAR BERBASIS JAVA Aditya Prasetio Fakultas Sains dan Teknologi Universitas Islam Negeri Syarif Hidayatullah Jakarta Tel : 021 823026 Fax : 021 8624025 Email : prasetio.adityagmail.com ABSTRAK Selama satu dekade terakhir, dunia pendidikan dan pelatihan sangat dipengaruhi oleh perkembangan teknologi. Fenomena ini akan semakin menguat mengingat teknologi ke depan akan semakin kompleks, powerfull, dan terjangkau secara ekonomi. Sebagai contoh paling populer, internet kini sudah menjadi kebutuhan penting bagi siapa pun yang terlibat dalam aktifitas pendidikan dan pelatihan, baik sebagai media maupun sumber belajar. Pada penelitian sebelumnya setiap aplikasi hanya terbatas pada satu pelajaran saja sehingga pengguna memerlukan aplikasi berbeda pada setiap pelajaran. Disamping itu pengguna harus mengunduh aplikasi tersebut ke handphone mereka, hal ini membuat content menjadi statis. Oleh karena itu, dirasa perlu untuk memngembangkan aplikasi mobile learning yang memiliki content dinamis. Adapun metodologi yang penulis gunakan dalam membuat aplikasi ini adalah menggunakan RAD, yang mempunyai lima tahapan, yaitu Communication, Planning, Modelling, Construction, dan Deployment. Penulis menggunakan bahasa pemrogaman Java, Framework Jmaki untuk AJAX, ORM Hibernate dan database MySQL dalam membuat aplikasi ini. Dengan adanya aplikasi ini maka akan mempermudah pengajar dalam memberikan materi belajar maupun soal latihan tanpa terbatas oleh ruang dan waktu sehingga diharapkan dapat meningkatkan efektifitas dalam belajar. Kata Kunci : Mobile learning, Content Management System, web dinamis, RAD.

1. PENDAHULUAN

1.1. Latar Belakang