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.
mantabbbbbb