Membuat Halaman Wizard Sederhana Menggunakan JSF (Java Server Faces) dan CDI (Context & Dependency Injection)


Java Technology

Java Technology

Bismillahirrahmanirrahim

Proses wizard adalah beberapa halaman yang digabungkan untuk membentuk satu alur proses, misal. Jika kita akan memasukkan data yang sangat banyak, biasanya kita memisahkan data tersebut menjadi beberapa bagian. Contoh saat kita akan memasukkan biodata pegawai, kita akan memasukkan data identitasnya terlebih dahulu, setelah itu memasukkan data akademik, data pengalaman kerja, dan lain-lain. Dari pada kita memasukkan datanya ke dalam satu halaman, lebih baik jika kita membaginya menjadi beberapa halaman.

Dalam proses wizard, artinya data pada halaman pertama harus dapat diakses pada halaman kedua dan halaman selanjutnya. Dalam web, biasanya data tersebut disimpan dalam sebuah HttpSession. Namun jika kita menggunakan HttpSession, maka data akan selalu sama dalam browser yang kita gunakan. Jika kita merubah data wizard di satu tab, maka data pada tab yang lain akan ikut berubah. Hal ini membuat kita tidak dapat menambah data secara sekaligus di beberapa tab.

Dalam kasus ini, kita dapat menggunakan @ConversationScope milik Context & Dependency Injection (CDI) yang tergabung dalam teknologi JEE 6. Untuk menggunakan CDI, kita hanya dapat menggunakannya pada Enterprise Application Server seperti Glassfish dan JBoss. Kita tidak dapat menggunakannya Servlet Container seperti Tomcat dan Jetty.

Untuk membuat sebuah ManageBean menggunakan @ConversationScope kita hanya perlu menambahkan @ConversationScope dalam kelas ManageBean yang kita gunakan, dan setelah itu menambahkan sebuah variabel Conversation menggunakan annotation @Inject.

package khannedy.learning.faces.controller;

import java.io.Serializable;
import javax.enterprise.context.Conversation;
import javax.inject.Named;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;

@Named(value = "WizardController")
@ConversationScoped
public class WizardController implements Serializable {

    @Inject
    private Conversation conversation;
}

Untuk memulai proses wizard, maka kita perlu memanggil metode begin() pada objek Conversation. Dan untuk mengakhiri proses wizard, kita perlu memanggil metode end() pada objek Conversation.

    @PostConstruct
    public void start(){
        conversation.begin();
    }

    public String finish(){
        conversation.end();
        return "finish";
    }

Karena kita akan membuat sebuah wizard, dimana terdapat beberapa tahapan dalam sebuah proses, maka kita perlu menentukan berapa jumlah tahapan yang terjadi pada wizard tersebut. Untuk mengetahui sekarang proses keberapa, kita dapat menambahkan variabel step dalam ManageBean.

    private int step;

    public int getStep() {
        return step;
    }

Dalam sebuah wizard, harus ada navigasi untuk ke halaman selanjutnya dan kehalaman sebelumnya. Oleh karena itu, kita perlu menambahkan metode next() untuk ke halaman selanjutnya dan prev() untuk kehalaman sebelumnya.

    public String next(){
        step++;
        return null;
    }

    public String prev(){
        step--;
        return null;
    }

Sebagai contoh, kita tambahkan 4 buah variabel yang harus diisi ketika proses wizard. Setiap variabel diisi dalam satu tahapan, sehingga akan ada 4 tahapan dalam proses wizard ini.

    private String data1;
    private String data2;
    private String data3;
    private String data4;

    // getter and setter
    ...

Berikut adalah kode lengkap untuk kelas ManageBean yang telah kita buat :

package khannedy.learning.faces.controller;

import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.inject.Named;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;

@Named(value = "WizardController")
@ConversationScoped
public class WizardController implements Serializable {

    @Inject
    private Conversation conversation;
    private int step;
    private String data1;
    private String data2;
    private String data3;
    private String data4;

    @PostConstruct
    public void start() {
        conversation.begin();
    }

    public String finish() {
        conversation.end();
        return "finish";
    }

    public int getStep() {
        return step;
    }

    public String next() {
        step++;
        return null;
    }

    public String prev() {
        step--;
        return null;
    }

    public String getData1() {
        return data1;
    }

    public void setData1(String data1) {
        this.data1 = data1;
    }

    public String getData2() {
        return data2;
    }

    public void setData2(String data2) {
        this.data2 = data2;
    }

    public String getData3() {
        return data3;
    }

    public void setData3(String data3) {
        this.data3 = data3;
    }

    public String getData4() {
        return data4;
    }

    public void setData4(String data4) {
        this.data4 = data4;
    }
}

Setelah itu, kita dapat membuat halaman faceletnya hanya dengan menggunakan 1 file xhtml.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Simple Wizard</title>
    </h:head>
    <h:body>
    </h:body>
</html>

Setelah itu, kita hanya perlu menambahkan h:form dan h:input yang akan digunakan untuk mengisi data-data pada wizard.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Simple Wizard</title>
    </h:head>
    <h:body>
        <h:form id="wizard">

            <h:panelGrid rendered="#{WizardController.step == 0}" columns="3">
                <h:outputLabel for="data1" value="Data 1 :"></h:outputLabel>
                <h:inputText id="data1" value="#{WizardController.data1}" required="true"></h:inputText>
                <h:message for="data1"></h:message>
                <h:outputText></h:outputText>
                <h:panelGroup>
                    <h:commandButton value="Next" action="#{WizardController.next}"></h:commandButton>
                </h:panelGroup>
                <h:outputText></h:outputText>
            </h:panelGrid>

            <h:panelGrid rendered="#{WizardController.step == 1}" columns="3">
                <h:outputLabel for="data2" value="Data 2 :"></h:outputLabel>
                <h:inputText id="data2" value="#{WizardController.data2}" required="true"></h:inputText>
                <h:message for="data2"></h:message>
                <h:outputText></h:outputText>
                <h:panelGroup>
                    <h:commandButton value="Prev" action="#{WizardController.prev}" immediate="true"></h:commandButton>
                    <h:commandButton value="Next" action="#{WizardController.next}"></h:commandButton>
                </h:panelGroup>
                <h:outputText></h:outputText>
            </h:panelGrid>

            <h:panelGrid rendered="#{WizardController.step == 2}" columns="3">
                <h:outputLabel for="data3" value="Data 3 :"></h:outputLabel>
                <h:inputText id="data3" value="#{WizardController.data3}" required="true"></h:inputText>
                <h:message for="data3"></h:message>
                <h:outputText></h:outputText>
                <h:panelGroup>
                    <h:commandButton value="Prev" action="#{WizardController.prev}" immediate="true"></h:commandButton>
                    <h:commandButton value="Next" action="#{WizardController.next}"></h:commandButton>
                </h:panelGroup>
                <h:outputText></h:outputText>
            </h:panelGrid>

            <h:panelGrid rendered="#{WizardController.step == 3}" columns="3">
                <h:outputLabel for="data4" value="Data 4 :"></h:outputLabel>
                <h:inputText id="data4" value="#{WizardController.data4}" required="true"></h:inputText>
                <h:message for="data4"></h:message>
                <h:outputText></h:outputText>
                <h:panelGroup>
                    <h:commandButton value="Prev" action="#{WizardController.prev}" immediate="true"></h:commandButton>
                    <h:commandButton value="Finish" action="#{WizardController.finish}"></h:commandButton>
                </h:panelGroup>
                <h:outputText></h:outputText>
            </h:panelGrid>

        </h:form>
    </h:body>
</html>

Pada kode diatas, kita menggunakan h:panelGrid untuk menampilkan input wizard. Agar h:panelGrid tersebut muncul, maka kita menggunakan atribut rendered=”#{WizardController.step == step}”, artinya jika step-nya 0, maka h:panelGrid yang menampilkan input data 1 yang muncul, dan seterusnya, sampai h:panelGrid untuk input data 4.

Setelah membuat halaman wizard.xhtml, kita dapat membuat sebuah halaman finish.xhtml untuk menampilkan halaman ketika proses wizard selesai.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Finish Wizard</title>
    </h:head>
    <h:body>
        <h1>Thank's!!!!</h1>
    </h:body>
</html>

Hasilnya kita dapat melihatnya pada gambar dibawah ini :

Wizard Step 1

Wizard Step 1

Wizard Step 2

Wizard Step 2

Wizard Finish

Wizard Finish

Alhamdulillah 😀

Iklan

Satu pemikiran pada “Membuat Halaman Wizard Sederhana Menggunakan JSF (Java Server Faces) dan CDI (Context & Dependency Injection)

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s