BLANTERORBITv102

    Cara Membuat Session Di Java Swing Menggunakan File XML

    Selasa, 21 November 2017

    Pembuka

    Pada kesempatan kali ini kita akan mencoba melanjutkan tutorial sebelumnya mengenai Cara Membuat Session Di Java Dengan Setter dan Getter. Didalam tutorial tersebut kita hanya mendapatkan session yang digunakan untuk frame lain. Sedangkan session biasanya tersimpan dan dapat digunakan kembali saat aplikasi di tutup (bukan di logout). Nah session sangat terkenal di dunia Web programming, session biasanya di simpan pada browser. Sehingga ketika web atau sistem yang kita jalankan masih dalam keadaan login di tutup, maka saat di buka kembali web akan tetap dalam keadaan login. Jika di logout maka seluruh session akan ter destroy (terhapus). Sebenarnya hal ini sangat sulit di dapatkan pada aplikasi desktop (correct me if wrong). Namun kita dapat mengakalinya dengan menyimpan session didalam sebuah file yang tersimpan di directory aplikasi yang dibangun. Di dalam tutorial ini saya akan memberikan contoh Cara Membuat Session Di Java Swing Menggunakan File XML. XML sendiri adalah bahasa Markup seperti HTML, namun ketentuan dalam pengetikan kode programmnya tidak lah menentu. XML banyak digunakan untuk urusan desain web atau interface aplikasi (android).

    Pembahasan

    Buatlah database dengan nama java-sc atau jika anda perlukan menggunakan database anda sediri. Kemudian buat tabel user dengan atribut id, nama, username, password, dan level. Sebenarnya database ini kita gunakan untuk menguji berhasil tidaknya saja.
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
    
    CREATE TABLE `user` (
      `id` int(11) NOT NULL,
      `nama` varchar(30) DEFAULT NULL,
      `username` varchar(20) DEFAULT NULL,
      `password` varchar(255) DEFAULT NULL,
      `level` enum('Admin','Pegawai') DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    ALTER TABLE `user`
      ADD PRIMARY KEY (`id`);
    
    ALTER TABLE `user`
      MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
    Tambahkan data berdasarkan kolom yang sudah dibuat pada tabel, barulah kita lanjutkan kedalam java. Buat project baru di java netbeans dengan nama project LoginWithSession, sehingga pada awal dibatnya project akan ada class main. Buat class baru dengan nama Database, seperti biasa ini nantinya berisikan beberapa konfig. tambahkan terlebih dahulu library MySQL JDBC Driver pada project yang dibuat. Isikan file Database.java dengan kode progam berikut.
    /*
     * Java Source Code Developer :: Hady Eka Saputra
     */
    package loginwithsession;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import javax.swing.JOptionPane;
    
    /**
     *
     * @author jsc-dev
     */
    public class Database {
        Connection conn = null;
        private static String id;
        private static String username;
        private static String password;
        private static String level;
        
        public static String get_userId(){
            return id;
        }
        public static void set_userId(String userId){
            Database.id = userId;
        }
        public static String get_username(){
            return username;
        }
        public static void set_username(String username){
            Database.username = username;
        }
         public static String get_password(){
            return password;
        }
        public static void set_password(String pass){
            Database.password = pass;
        }
        public static String get_level(){
            return level;
        }
        public static void set_level(String level){
            Database.level = level;
        }
        
        public static Connection koneksi(){
            String driver   = "com.mysql.jdbc.Driver";
            String host     = "jdbc:mysql://localhost/java-sc";
            String user     = "root";
            String pass     = "root";
            try {
                Class.forName(driver);
                Connection conn = DriverManager.getConnection(host, user, pass);
                return conn;
            } catch (ClassNotFoundException | SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
            return null;
        }
    }
    Untuk keterangan kode program diatas bisa dilihat pada tutorial Cara Membuat Session Di Java Dengan Setter dan Getter. Buat 2 jframe untuk keperluan form login dan keperluan frame dashboard aplikasi dengan nama loginFrame dan homeFrame. Sebagai contoh bisa dibuat seperti gambar dibawah ini beserta keterangannya, (untuk keperluan desain saya anggap sudah paham).
    Cara Membuat Session Di Java Swing Menggunakan File XML 1
    Gambar 1
    Cara Membuat Session Di Java Swing Menggunakan File XML 2
    Gambar 2
    Pada tombol masuk, tambahkan kode program dibawah ini.
            conn = Database.koneksi();
            String query = "SELECT `id`,`username`,`password`,`level` FROM `user` WHERE username=? AND password=?";
            try {
                pst = conn.prepareStatement(query);
                pst.setString(1, txt_username.getText());
                pst.setString(2, txt_password.getText());
                rs = pst.executeQuery();
                if (rs.next()) {
                    Database.set_userId(rs.getString("id"));
                    Database.set_username(rs.getString("username"));
                    Database.set_password(rs.getString("password"));
                    Database.set_level(rs.getString("level"));
                    JOptionPane.showMessageDialog(null, "Berhasil Login !!!!");
                    Database.createXML(rs.getString("id"), rs.getString("username"), rs.getString("password"), rs.getString("level"));
                    homeFrame hF = new homeFrame();
                    hF.setVisible(true);
                    this.dispose();
                    
                }
                else {
                    JOptionPane.showMessageDialog(null, "Username dan Password Tidak Cocok !!");
                }
                
                rs.close();
                pst.close();
                conn.close();
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, e);
            }
            
    Pastikan kita inisalisasikan pst,rs dan conn pada bagian dibawah nama class dari form, seperti berikut ini.
    public class loginFrame extends javax.swing.JFrame {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement pst = null;
        /**....................
    Anda akan menemukan error pada bagian  Database.createXML, ini adalah method yang kita gunakan untuk membuat file xml nantinya. Tambahkan kode program berikut di dalam Class Database sehingga secara penuh isi kode program class Database adalah seperti berikut ini.
    /*
     * Java Source Code Developer :: Hady Eka Saputra
     */
    package loginwithsession;
    
    import java.io.File;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import javax.swing.JOptionPane;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    /**
     *
     * @author jsc-dev
     */
    public class Database {
        Connection conn = null;
        private static String id;
        private static String username;
        private static String password;
        private static String level;
        
        public static String get_userId(){
            return id;
        }
        public static void set_userId(String userId){
            Database.id = userId;
        }
        public static String get_username(){
            return username;
        }
        public static void set_username(String username){
            Database.username = username;
        }
         public static String get_password(){
            return password;
        }
        public static void set_password(String pass){
            Database.password = pass;
        }
        public static String get_level(){
            return level;
        }
        public static void set_level(String level){
            Database.level = level;
        }
        
        public static Connection koneksi(){
            String driver   = "com.mysql.jdbc.Driver";
            String host     = "jdbc:mysql://localhost/java-sc";
            String user     = "root";
            String pass     = "root";
            try {
                Class.forName(driver);
                Connection conn = DriverManager.getConnection(host, user, pass);
                return conn;
            } catch (ClassNotFoundException | SQLException e) {
                JOptionPane.showMessageDialog(null, e.getMessage());
            }
            return null;
        }
        
        public static void createXML(String id,String uname,String pass,String lvl){
            try {
                DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
    
    
                Document doc = docBuilder.newDocument();
                Element rootElement = doc.createElement("session");
                doc.appendChild(rootElement);
                
                
                Element id_login = doc.createElement("id");
                rootElement.appendChild(id_login);
                id_login.setTextContent(id);
                Element username = doc.createElement("uname");
                rootElement.appendChild(username);
                username.setTextContent(uname);
                Element password = doc.createElement("pass");
                rootElement.appendChild(password);
                password.setTextContent(pass);
                Element level = doc.createElement("level");
                rootElement.appendChild(level);
                level.setTextContent(lvl);
                
                TransformerFactory transformerFactory = TransformerFactory.newInstance();
                Transformer transformer = transformerFactory.newTransformer();
                DOMSource source = new DOMSource(doc);
                StreamResult result = new StreamResult(new File(System.getProperty("user.dir") + "/session.xml"));
                transformer.transform(source, result);
    
       } catch (ParserConfigurationException | TransformerException e) {
      System.out.println(e);
       }
        }
        
    }
    
    Beralih ke bagian frame dashboard, buat method baru dengan nama logged kemudian tambahkan kode program untuk menggunakan data session pada masing-masing method yang menyimpan data tersebut. Berikut kode programnya.
        public homeFrame() {
            initComponents();
            logged();
        }
        private void logged (){
            txt_id.setText(loginwithsession.Database.get_userId());
            txt_username.setText(loginwithsession.Database.get_username());
            txt_password.setText(loginwithsession.Database.get_password());
            txt_level.setText(loginwithsession.Database.get_level());
            
        }
    Pada bagian tombol keluar tambahkan kode program berikut.
            File data = new File(System.getProperty("user.dir") + "/session.xml");
            if (data.exists()) {
                data.delete();
                loginFrame lF = new loginFrame();
                lF.setVisible(true);
                JOptionPane.showMessageDialog(null, "Berhasil Keluar Aplikasi, \n\nSilahkan Masuk Kembali!!");
                this.dispose();
            }
    Dengan menghapus file session.xml yang di buat tadi, maka kita tidak dapat mengakses homeFrame tanpa login. Terakhir adalah main class yang dimana jika kita membuild program kita nantinya class ini adalah class yang digunakan untuk class pertama yang dijalankan. Kita gunakan pada class pertama tadi yang sudah otomatis di buat saat membuat project, berikut kode programnya.
    /*
     * Java Source Code Developer :: Hady Eka Saputra
     */
    package loginwithsession;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JOptionPane;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import org.w3c.dom.Document;
    import org.xml.sax.SAXException;
    
    /**
     *
     * @author jsc-dev
     */
    public class checkSession {
        public static void main(String[] args) throws UnsupportedLookAndFeelException {
            File data = new File(System.getProperty("user.dir") + "/session.xml");
            if (data.exists()) {
                
                try {
                    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                    Document doc = (Document) dBuilder.parse(data);
                    String id = doc.getElementsByTagName("id").item(0).getTextContent();
                    String username = doc.getElementsByTagName("uname").item(0).getTextContent();
                    String password = doc.getElementsByTagName("pass").item(0).getTextContent();
                    String level = doc.getElementsByTagName("level").item(0).getTextContent();
                    
                    loginwithsession.Database.set_userId(id);
                    loginwithsession.Database.set_username(username);
                    loginwithsession.Database.set_password(password);
                    loginwithsession.Database.set_level(level);
                    
                    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                        if ("GTK+".equals(info.getName())) {
                            try {
                                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                                break;
                            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                                Logger.getLogger(checkSession.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }
                    homeFrame hF = new homeFrame();
                    hF.setVisible(true);
                } catch (IOException | ParserConfigurationException | SAXException e) {
                    JOptionPane.showMessageDialog(null, e);
                }
            }else {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("GTK+".equals(info.getName())) {
                        try {
                            javax.swing.UIManager.setLookAndFeel(info.getClassName());
                            break;
                        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                            Logger.getLogger(checkSession.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
                loginFrame lF = new loginFrame();
                lF.setVisible(true);
            }                      
        }
    }
    
    Selanjutnya coba jalankan aplikasi ini, secara umum maka akan seperti video dibawah.

    Penutup

    Sebenarnya cara ini tidak efisien mengingat keamanan dari aplikasi, namun karena biasanya aplikasi desktop hanya dijalankan secara lokal atau tidak perlu terhubung ke internet seperti aplikasi web mungkin saja cara ini terbilang aman. Untuk keperluan lainnya bisa saja menggunakan username dan password yang lebih secure dan tidak mudah di decrypt.

    Terimakasih sudah berkesempatan untuk menimba ilmu dari blog JSC, semoga ilmu yang di share dapat bermanfaat. Jika ada pertanyaan mengenai ilmu yang terkait ataupun tidak, mari kita berdiskusi di dalam kolom komentar ini.

    Keep Learning and Keep Sharing