BAB IV
IMPLEMENTASI DAN PEMBAHASAN SISTEM 4.1. Implementasi Sistem Implementasi
sistem
merupakan
tahap
dimana
rancangan yang telah dibuat dapat diterapkan. Tujuannya untuk melakukan uji coba pada aplikasi dan sebagai sarana pengolahan data dan penyajian informasi yang akan digunakan dalam proses pengambilan keputusan. Maka
selanjutnya
yang
akan
dilakukan
adalah
pengimplementasian atau penerapan sistem. 4.1.1. Konfigurasi web.xml Spring MVC Web.xml merupakan deployment descriptor, yaitu dokumen xml standar untuk aplikasi Java EE yang didalamnya dideskripsikan isi dari .war yang akan dibangun. Web.xml adalah file pertama yang akan dijalankan, berikut potongan web.xml untuk aplikasi ini : <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
sipus <param-name>contextConfigLocation <param-value> classpath:applicationContext-business.xml /WEB-INF/applicationContext-security.xml <param-name>log4jConfigLocation <param-value>/WEB-INF/classes/log4j.properties
25
26
Selanjutnya
bisa
menggunakan
spring
untuk
Injection of Control(IOC) seperti yang dijelaskan pada pengertian spring pada bab II, IOC adalah mekanisme memanggil
sebuah
objek
tetapi
tanpa
inisialisasi,
seperti pada kelas Tbuser, programmer hanya perlu membuat spring service seperti potongan kode berikut ini : public interface TbmuserDao extends GenericDao
{ public Boolean login(Tbmuser users); public Tbmuser loadByUsernameAndPassWithNewSession(Tbmuser users); public Boolean loginWithNewSession(Tbmuser users); public Tbmuser loadByUsernameAndPass(Tbmuser users); public Boolean isExist(Tbmuser users);
Method pada spring service, di implementasikan pada kelas UserDetailServiceImpl seperti pada kode berikut ini : @Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { @Transactional(readOnly = true) public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { Session session = HibernateUtil.getSessionFactory().openSession(); Tbmuser users = (Tbmuser) session.createCriteria(Tbmuser.class) .add(Restrictions.eq("userId", username)).setMaxResults(1) .uniqueResult(); System.out.println("username = " + username + " users = " + users); session.disconnect(); session.close();
Transaction management dengan menggunakan spring service berbeda dengan service yang dibuat menggunakan
JDBC,
Spring
service
tidak
perlu
mengelola transaksi secara manual dengan memulai transaksi seperti commit dan rollback.
27
Transaction management pada spring service dilakukan tidak
dengan
perlu
tahu
transparan, detail
artinya
spring
programmer
service
menangani
transaksi, programmer hanya perlu tahu bahwa method pada spring service ditandai dengan @Service untuk menandai
kelas
ini
adalah
spring
service
dan
@Transactional akan memulai transaksi ketika masuk ke method. 4.1.2. Konfigurasi Hibernate framework Untuk menggunakan hibernate pada program pertama-tama
lakukan
konfigurasi
seperti
pada
potongan kode berikut : <property <property <property <property <property
name="hibernate.connection.driver_class">org.postgresql.Driver name="hibernate.connection.url">jdbc:postgresql://localhost:5432/sipus name="hibernate.connection.username">postgres name="hibernate.connection.password">root123 name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect
Ini adalah konfigurasi driver connection yang menggunakan
portgresql,
konfigurasi
letak
dari
basisdata, dialect sql yang menggunakan postgres serta konfigurasi username dan password basidata. Selanjutnya buat kelas yang memetakan tabel yang
ada
pada
basis
data,
murid.java
yang
merupakan
seperti pemetaan
pada
kelas
dari
tabel
murid. Berikut potongan kode program untuk kelas murid.java : ....... private Long idMurid; private String nama; @Id @GeneratedValue(strategy = IDENTITY) @Column(name = "idmurid", insertable = false, unique = true, nullable = false) public Long getIdMurid() { return idMurid; } public void setId(Long idMurid) { this.idMurid = idMurid; } @Column(name = "nama", nullable = false, length = 255) public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } .....
28
•
@id adalah untuk menentukan kunci utama dari tabel
•
@Column adalah untuk memberikan nama dan konfigurasi lain pada tabel.
•
@ManyToOne dan @JoinColumn adalah untuk menentukan hubungan antar tabel. Kelebihan
dari ini
menggunakan
framework
seperti
adalah
melakukan
CRUD(Create,
lebih
READ,
hibernate
mudah
Update,
untuk
DELETE)
karena bisa tidak menggunakan bahasa SQL. Untuk menyimpan data cukup dengan menggunakan method setter seperti potongan kode berikut ini : murid.setId(idMurid.getValue().trim()); murid.setNama(nama.getValue()); murid.setJenisKelamin((String) jenisKelamin.getSelectedItem().getValue());
4.1.3. Halaman login Setelah aplikasi di jalankan dari web server, aplikasi akan mengecek file konfigurasi pada web.xml yang ada di folder web/WEB-INF/web.xml, didalam file tersebut ada konfigurasi yang menjelaskan file apa yang
pertama
dijalankan,
berikut
potongan
konfigurasinya : <welcome-file-list> <welcome-file>login.jsp
Aplikasi
akan
menjalankan
file
login.jsp,
selanjutnya user akan diberikan halaman login seperti pada gambar 4.1.
29
Gambar 4.1 Halaman login Untuk menggunakan dintegrasikan menggunakan
membuat Spring dengan spring
fasilitas Security
login, Framework
menggunakan security
zkoss. zkoss
tersebut
aplikasi yang Untuk harus
menambahkan konfigurasi di web.xml agar dikenali oleh aplikasi, b berikut kode yang ditambahkan : springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy springSecurityFilterChain /*
org.springframework.web.filter.DelegatingFilterPr oxy adalah sebuah servlet filter yang membolehkan spring security membungkus semua request aplikasi dan
meyakinkan
aplikasi
tersebut
aman
dengan
30
sewajarnya. Berikut adalah potongan kode halaman login.
Aksi dari form akan mengarahkan pada URL j_spring_security_check. standard
dari
spring
URL
ini
security
merupakan framework
URL untuk
menangani validasi benar tidaknya user dan password user. 4.1.4. Pengaturan hak akses Untuk dilakukan
membuat oleh
dan
administrator
mengatur melalui
hak
akses
form
jenis
pengguna dan form pengguna. Form jenis pengguna adalah untuk membuat kelompok pengguna seperti pada gambar 4.2.
31
Gambar 4.2 Halaman pengaturan kelompok pengguna Seperti yang dilihat pada gambar 4.2, menu select yang menggunakan checkbox disebelah kanan adalah untuk mengatur apa saja yang dapat dilakukan oleh pengguna ter terhadap adap menu yang akan diberikan akses yang terdiri dari CRUD(Create,read, update, dan delete). Button “Rubah struktur menu” adalah untuk menambahkan menu baru yang telah dibuat dan disimpan di dalam tabel menu yang ada di database, database form untuk menambahkan menu baru dapat dilihat pada gambar 4.3 berikut ini :
Gambar 4.3 Halaman Tree men
32
Setelah kelompok pengguna dibuat, selanjutnya bisa membuat data pengguna seperti pada gambar 4.4 berikut ini :
Gambar 4.4 Halaman pendataan pengguna Pada form ini bisa memilih kelompok pengguna yang telah dibuat sebelumnya, dengan menggunakan combobox akan ditampilkan daftar kelompok pengguna yang ada. Tampilan daftar pengguna yang telah dibuat bisa dilihat pada gambar 4.5 berikut ini :
Gambar 4.5 Halaman tampilan daftar pengguna
33
4.1.5.
Halaman data murid Halaman
data
murid
digunakan
untuk
memasukan dan menampilkan semua murid yang ada, tampilan untuk halaman data mur murid id dapat dilihat pada gambar 4.6 6 berikut ini :
Gambar 4.6 Input data murid File murid.zul yang merupakan halaman input data murid menjalankan controller MuridAction.java, MuridAction serperti pada potongan berikut ini : < <window border="none" id="window" apply="sipus.action.master.MuridAction" "sipus.action.master.MuridAction" width width="100%" height="100%">
Ketika menekan tombol tambah murid, halaman ini memanggil method onAdd yang ada pada controller MuridAction.java, berikut potongan pemanggilan dari murid.zul ke MuridAction.java :
forward="onClick=onAdd" "onClick=onAdd" id="add"
label="Tambah Data" image="/img/new.gif" "/img/new.gif">
34
Potongan otongan kode MuridAction.java yang merupakan method onAdd : public void onAdd(Event event) throws Exception { init(new Murid()); addWindow.setVisible(true); addWindow.onModal(); }
Setelah itu tampilan data murid yang sudah dimasukan an dapat dilihat pada gambar 4.8 :
Gambar 4.7 Tampilan data murid Untuk menampilkan data seperti pada gambar 4.8 menggunakan kelas MuridRenderer yang ada didalam kelas MuridAction,, kelas MuridRenderer ini meng implement RowRender yang ada pada framework zkoss. Berikut potongan kode program untuk menampilkan data :
35
class MuridRenderer implements RowRenderer { @Override public void render(final Row arg0, Object arg1) throws Exception { final Murid murid = (Murid) arg1; BarcodeCommon.generateBarcodeImage(murid.getKode(),"30","true").setParent(arg0);
RevisiHelper.createNewRevisi(Murid.class,murid,murid.getNama()).setParent(arg0); new Label(murid.getTanggalMasuk() == null ? "" : Common.dateFormat3.format(murid.getTanggalMasuk())).setParent(arg0); String alamat = (murid.getAlamat() + " "+ (murid.getKelurahan() == null ? "" : murid .getKelurahan().getNama()) + " RT " + murid.getRt() + " RW " + murid.getRw() + " " + (murid.getKecamatan() == null ? "" : murid .getKecamatan().getNama()) + " " + (murid.getKota() == null ? "" : murid.getKota() .getNama()) + " " + (murid.getPropinsi() == null ? "" : murid.getPropinsi().getNama())); new Label(alamat).setParent(arg0); new Label(murid.getKelas().getNama()).setParent(arg0);
Untuk mencetak barcode yang ada pada data murid, digunakan kelas BarcodeCommon.java yang ada pada package sipus.common, berikut adalah potongan kode untuk membuat gambar barcode : public static Image generateBarcodeImage(String code, String sizeY, String showText){ Image barcode = new Image(); try { AImage aImage = new AImage("barcode", BarcodeCommon .generateBarcode(code, sizeY, showText)); barcode.setContent(aImage); } catch (WrongValueException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return barcode; }
Selanjutnya kelas BarcodeCommon bisa digunakan pada kelas apapun, seperti pada potongan kode kelas MuridAction.java: .... BarcodeCommon.generateBarcodeImage(murid.getKode(),"30","true").setParent(arg0);
....
36
4.1.6.
Halaman Penilaian Halaman ini digunakan untuk memasukan data
penilaian,, penilaian di masukan berdasarkan periode yang telah disediakan pada combobox,, selain itu untuk mengambil data murid yang ada di tabel murid, aplikasi ini menggunakan banbox yang tersedia di framework zkoss. Untuk halaman input penilai penilaian an dapat dilihat pada pad gambar 4.8 8 berikut ini :
Gambar 4.8 Input data nilai Agar bisa menggunakan banbox seperti pada aplikasi ini, buat kelas AmbilDataMuridBanbox.java, dalam kelas ini meng extend banbox yang ada pada framework
zkoss zkoss,
berikut
potongan
kode
membuat kelas AmbilDataMuridBanbox.java : public class AmbilDataMuridBanbox extends Bandbox{ private static final long serialVersionUID = 1138226537107417869L; private Grid grid; ; private EventListener eventListener; public AmbilDataMuridBanbox (){ super(); this.addEventListener(Events. .addEventListener(Events.ON_OK, newEventListener() { @Override public void onEvent(Event arg0) throws Exception { Murid murid = (Murid) HibernateUtil. HibernateUtil.currentSession() .createCriteria(Murid.class) .add(Restrictions .ilike("kode",AmbilDataMuridBanbox .this.getValue() .trim(),MatchMode.EXACT)) .setMaxResults(1).uniqueResult(); ........
untuk
37
Kelas
AmbilDataMuridBanbox.
java
dapat
digunakan unt untuk uk kelas yang lain seperti pada controller PenilaianAction. java, berikut potongan kode de untuk menggunakan banbox banbox. private AmbilDataMuridBanbox murid; row = new Row(); row.setStyle("border:0px;background: "border:0px;background: transparent;" transparent;"); row.setParent(rows); row.appendChild( row.appendChild(new Label("Nama Murid")); row.appendChild( row.appendChild(murid = new AmbilDataMuridBanbox()); murid.setValue(penilaian.getMurid() .setValue(penilaian.getMurid() == null ? "" : penilaian.getMurid().getKode() + "-"+ penilaian.getMurid().getNama()); murid.setWidth( .setWidth("95%");
Selanjutnya
data
penilaian
bisa
seperti pada gambar 4.1 4.10 berikut ini :
Gambar 4. 4.9 Tampilan data penilaian
ditampilkan