Objektif

Ada dua macam validasi di JSF, field-level dan application-level. (lihat disini). Artikel ini akan memuat contoh untuk melakukan validasi application-level di SEAM dan JSF.

Sebagai contoh adalah sebuah halaman dengan 2 field, jumlahSatu dan jumlahDua, masing-masing di bind ke property sebuah bean. Validasi yang dilakukan adalah “bila jumlahSatu < 10, maka jumlahDua harus > 10.”

SEAM SDK yang digunakan adalah versi 2.1.1.GA. Konfigurasi SEAM yang digunakan default dari seam-gen.

Implementasi

Bean yang akan dijadikan penampung value adalah berikut ini.

public class OrderItem implements Serializable {
  private BigDecimal jumlahSatu;
  private BigDecimal jumlahDua;

  public void setJumlahSatu(BigDecimal jml) {
    jumlahSatu = jml;
  }

  public BigDecimal getJumlahSatu() {
    return jumlahSatu;
  }

  public void setJumlahDua(BigDecimal jml) {
    jumlahDua = jml;
  }

  public BigDecimal getJumlahdua() {
    return jumlahDua;
  }
}

Kita memerlukan satu komponen SEAM khusus untuk menempatkan backing bean dari komponen-komponen yang akan kita validasi.

@Name("penampungKomponen")
@Scope(ScopeType.EVENT)
public class PenampungKomponen implements Serializable {
  private UIInput tfJumlahSatu;
  private UIInput tfJumlahDua;

  public void setTfJumlahSatu(UIInput tf) {
    tfJumlahSatu = tf;
  }

  public UIInput getTfJumlahSatu() {
    return tfJumlahSatu;
  }

  public void setTfJumlahDua(UIInput tf) {
    tfJumlahDua = tf;
  }

  public UIInput getTfJumlahDua() {
    return tfJumlahDua;
  }
}

Kenapa kita membutuhkan penampung khusus seperti diatas? Karena kita tidak bisa mem-bind komponen JSF ke komponen SEAM yang scopenya selain EVENT.

Halaman JSF yang harus dibuat adalah seperti ini.

<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
 xmlns:s="http://jboss.com/products/seam/taglib"
 xmlns:ui="http://java.sun.com/jsf/facelets"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:a="http://richfaces.org/a4j"
 xmlns:rich="http://richfaces.org/rich"
 template="layout/template.xhtml">

<ui:define name="body">

 <h:form id="purchaseOrder" styleClass="edit">
   <h:inputText id="tfJumlahSatu"
     required="true"
     size="50"
     maxlength="50"
     binding="#{penampungKomponen.jumlahSatu}"
     value="#{orderAction.item.jumlahSatu}"/>
   <s:message styleClass="errors"/>
   <br/>
   <h:inputText id="tfJumlahDua"
     required="true"
     size="50"
     maxlength="50"
     binding="#{penampungKomponen.jumlahDua}"
     value="#{orderAction.item.jumlahDua}"/>
   <s:message styleClass="errors"/>
   <br/>
   <h:commandButton id="save"
     value="Save"
     action="#{orderAction.doAction}"/>
   </h:form>
</ui:define>
</ui:composition>

Perhatikan di line 21 dan 29 terdapat komponen untuk menampilkan message yang berkaitan dengan komponen input sebelumnya.

Berikut ini adalah komponen SEAM dimana terdapat action dan validasi.

@Name("orderAction")
@Scope(ScopeType.SESSION)
public class OrderAction implements Serializable {
  @In(create=true) PenampungKomponen penampungKomponen;
  @In FacesMessages facesMessages;

  private OrderItem item;

  public void doAction {
    if(item.getJumlahSatu().compareTo(new BigDecimal(10)) < 0 &&
       item.getJumlahDua().compareTo(new BigDecimal(10)) < 0) {

       facesMessages.addToControlFromResourceBundle(penampungKomponen.getTfJumlahSatu().getId(), "validation.kurangDariSepuluh", item.getJumlahSatu());
       penampungKomponen.getJumlahSatu().setValid(false);
    }
    else {
       // berhasil
    }
  }

  public void setItem(OrderItem itm) {
    item = itm;
  }

  public OrderItem getItem() {
    return item;
  }
}

Perhatikan di line 13, kita membuat suatu message dan dikaitkan dengan suatu komponen JSF tertentu. Ini akan membuat message tersebut muncul disampingnya (karena di halaman JSF diatas kita menempatkan <s:message/> disamping <h:inputText/>). Kemudian di line 14 kita menandai bahwa komponen tersebut memiliki nilai yang tidak valid. Lalu apa yang akan muncul di layar?

Bagian terakhir adalah file messages_en.properties. Tambahkan entry berikut ini didalamnya.

validation.kurangDariSepuluh=Bila jumlahSatu bernilai #0, maka jumlahDua harus > 10

Selamat mencoba.

Tags: ,

One Response to “SEAM & JSF: validasi application-level”

  1. Aerie says:

    mantabbbbbb

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>