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 : <?xml version="1.0" encoding="utf-8"?> <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"> <display-name>sipus</display-name> <context-param> <param-name>contextconfiglocation</param-name> <param-value> classpath:applicationcontext-business.xml /WEB-INF/applicationContext-security.xml </param-value> </context-param> <context-param> <param-name>log4jconfiglocation</param-name> <param-value>/web-inf/classes/log4j.properties</param-value> </context-param> 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<Tbmuser, Long> { 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 dengan transparan, artinya programmer tidak perlu tahu detail spring 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 name="hibernate.connection.driver_class">org.postgresql.driver</property> <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/sipus</property> <property name="hibernate.connection.username">postgres</property> <property name="hibernate.connection.password">root123</property> <property name="hibernate.dialect">org.hibernate.dialect.postgresqldialect</property> 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, seperti pada kelas murid.java yang merupakan pemetaan 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 menggunakan hibernate framework seperti ini adalah lebih mudah untuk melakukan CRUD(Create, READ, Update, 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</welcome-file> </welcome-file-list> Aplikasi akan menjalankan file login.jsp, selanjutnya user akan diberikan halaman login seperti pada gambar 4.1.
29 Gambar 4.1 Halaman login Untuk membuat fasilitas login, aplikasi menggunakan Spring Security Framework yang dintegrasikan dengan menggunakan zkoss. Untuk menggunakan spring security tersebut harus menambahkan konfigurasi di web.xml agar dikenali oleh aplikasi, berikut kode yang ditambahkan : <filter> <filter-name>springsecurityfilterchain</filter-name> <filter-classorg.springframework.web.filter.delegatingfilterproxy </filter-class> </filter> <filter-mapping> <filter-name>springsecurityfilterchain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 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. <form name="f" action="<c:url value='j_spring_security_check'/>" method="post"> </form> Aksi dari form akan mengarahkan pada URL j_spring_security_check. URL ini merupakan URL standard dari spring security framework untuk menangani validasi benar tidaknya user dan password user. <p> <label>username</label> <input type='text' class="textinput" name='j_username' value='<c:if test="${not empty param.login_error"> <c:out value="${spring_security_last_username"/></c:if>' /> </p> <p> <label>password</label> <input type='password' class="textinput" name='j_password'> </p> <p> <label> </label> <input type="checkbox" class="checkbox" name="_spring_security_remember_me">biarkan Saya Tetap Masuk </p> <p><input type="submit" value="login" class="btnlogin"></p> 4.1.4. Pengaturan hak akses Untuk membuat dan mengatur hak akses dilakukan oleh administrator melalui 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 terhadap 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, 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 Padaa 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 murid dapat dilihat pada gambar 4.6 berikut ini : Gambar 4.6 Input data murid File murid.zul yang merupakan halaman input data murid menjalankan controller MuridAction.java, serperti pada potongan berikut ini : <window border="none" id="window" apply="sipus.action.master.muridaction" 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 : <toolbar> <toolbarbutton tooltiptext="tambah data" forward="onclick=onadd" id="add" label="tambah Data" image="/img/new.gif"> </toolbarbutton>
34 Potongan 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 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 penilaian dapat dilihat pada gambar 4.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, berikut potongan kode untuk 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.on_ok, neweventlistener() {... @Override public void onevent(event arg0) throws Exception { Murid murid = (Murid) HibernateUtil.currentSession().createCriteria(Murid.class).add(Restrictions.ilike("kode",AmbilDataMuridBanbox.this.getValue().trim(),MatchMode.EXACT)).setMaxResults(1).uniqueResult();
37 Kelas AmbilDataMuridBanbox. java dapat digunakan untuk kelas yang lain seperti pada controller PenilaianAction. java, berikut potongan kode untuk menggunakan banbox. private AmbilDataMuridBanbox murid; row = new Row() ); row.setstyle("border:0px;background: transparent;"); row.setparent(rows); row.appendchild(new Label("Nama Murid")); row.appendchild(murid = new AmbilDataMuridBanbox()); murid.setvalue( (penilaian.getmurid() == null? "" : penilaian.getmurid().getkode() + "-"+ penilaian..getmurid().getnama()); murid.setwidth( ("95%"); Selanjutnya data penilaian bisa ditampilkan seperti pada gambar 4.10 berikut ini : Gambar 4.9 Tampilan data penilaian