21
Apr
08

struts validator, pretty cool

Bulan februari kemarin saya menulis tentang error handling-nya struts -> https://n3tg33ks.wordpress.com/2008/02/22/error-handling-struts-1x/ . Struts validator ini sebenarnya sama saja intinya, cuma saya ajah yang nulis judulnya gak kompak :mrgreen: . Ada beberapa hal yang membedakan dari tulisan sebelumnya. Pertama, Untuk Form(model)-nya meng-extends class ValidatorForm, bukan ActionForm. Kedua, disini tidak perlu meng-override method validate() dan reset(). Dan yang Ketiga, memberikan sedikit sentuhan pada file validator.xml.

Saya mulai dari pembuatan modelnya(User.java), sebagai berikut:


package com.myapp.form;

//import javax.servlet.http.HttpServletRequest;
//import org.apache.struts.action.ActionErrors;
//import org.apache.struts.action.ActionMapping;
//import org.apache.struts.action.ActionMessage;
//import org.apache.struts.action.ActionServlet;
//import org.apache.struts.util.MessageResources;
import org.apache.struts.validator.ValidatorForm;

/**
 *
 * @author JollkY
 */
public class User extends ValidatorForm {
    private String userid;
    private String password;
    /** Creates a new instance of User */
    public User() {
    }

    public String getUserid() {
        return userid;
    }

    public void setUserid(String userid) {
        this.userid = userid;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
//   
//    @Override
//    public void reset(ActionMapping mappping,
//            HttpServletRequest request) {
//        ActionServlet srvt = this.getServlet();
//        MessageResources msgResources = srvt.getInternal();
//        msgResources.getMessage("pesan");
//        this.userid = "";
//        this.password = "";
//        System.out.println("RESET --->");
//    }
//   
//    @Override
//    public ActionErrors validate(ActionMapping mapping,
//            HttpServletRequest request) {
//            ActionErrors errorMsg = new ActionErrors();
//            if(this.userid.equalsIgnoreCase( "" ) || this.password.equalsIgnoreCase( "" )) {
//                errorMsg.add("userid", new ActionMessage( "errors.invalid" ));
//            }
//            return errorMsg;
//    }

}

Seperti yang sdh saya katakan di atas method validate() dan reset(), tidak lagi dibutuhkan. Untuk review, method validate() berisi kode untuk melakukan validasi terhadap input user, dan method reset berguna untuk memastikan bahwa semua field benar” bersih sebelum diisi lagi dengan nilai yang baru. Jangan lupa bahwa sekarang model meng-extends Class ValidatorForm.

Berikutnya adalah file action(LookUpAction.java). Tidak ada perubahan yang terjadi di sini:


/*
 * LookUpAction.java
 *
 * Created on February 8, 2008, 8:47 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.myapp.action;

import com.myapp.form.User;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 *
 * @author JollkY
 */
public class LookUpAction extends Action {

    /** Creates a new instance of LookUpAction */
    public LookUpAction() {
    }

    @Override
    public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            {

        User u = (User) form;
        return (mapping.findForward("success"));
    }
}

Begitu pula pada file konfigurasi struts (struts-config.xml) tidak ada perubahan:


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
    <form-beans>
        <form-bean name="userForm" type="com.myapp.form.User"/>
    </form-beans>

    <global-exceptions>

    </global-exceptions>

    <global-forwards>
        <forward name="welcome"  path="/Welcome.do"/>
    </global-forwards>

    <action-mappings>
        <action path="/Welcome" forward="/welcomeStruts.jsp"/>
        <action
            path="/lookUp"
            type="com.myapp.action.LookUpAction"
            name="userForm"
            validate="true"
            input="/welcomeStruts.jsp"
            scope="request">
            <forward name="success" path="/index.jsp"/>
            <forward name="failure" path="/welcomeStruts.jsp"/>
        </action>
    </action-mappings>

    <controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

    <message-resources parameter="com/myapp/struts/ApplicationResource"/>   

    <!-- ========================= Tiles plugin ===============================-->
    <plug-in className="org.apache.struts.tiles.TilesPlugin" >
        <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />     
        <set-property property="moduleAware" value="true" />
    </plug-in>

    <!-- ========================= Validator plugin ================================= -->
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property
            property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

</struts-config>

Pada file struts-config.xml, terdapat tag <plug-in> yang memberitahukan plugin struts apa saja yang digunakan dalam aplikasi. Karena saya menggunakan plugin validator dari struts maka di sana harus ada potongan kode ini – yang juga memberitahukan kepada struts dimana file konfigurasi plugin validator yang saya pakai:


{...}

<!-- ========================= Validator plugin ================================= -->
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property
            property="pathnames"
            value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

{...}

Bagian terpenting pada validator ini terdapat pada validation.xml dan validator-rules.xml, karena disanalah akan dilakukan validasi yang diinginkan(validation.xml) dan validasi apa saja yang dapat dilakukan(validator-rules.xml).


{.....}    
        <form name="userForm">
            <field
                property="userid"
                depends="required,minlength,mask">
                <msg name="required" key="error.nullfield"/>
                <arg0 key="error.userlabel"/>
                <msg name="minlength" key="error.userNameMinLenght"/>
                <arg1 name="minlength" key="${var:minlength}" resource="false"/>
                <var>
                    <var-name>minlength</var-name>
                    <var-value>5</var-value>
                </var>
                <msg name="mask" key="error.invalidCharacter"/>
                <var>
                    <var-name>mask</var-name>
                    <var-value>^[0-9a-zA-Z]*$</var-value>
                </var>
            </field>
            <field
                property="password"
                depends="required,mask">
                <msg name="required" key="error.nullfield"/>
                <arg0 key="error.passwordlabel"/>
                <msg name="mask" key="error.invalidCharacter"/>
                <var>
                    <var-name>mask</var-name>
                    <var-value>^[0-9a-zA-Z]*$</var-value>
                </var>
            </field>
        </form>
{....}

Pada file validation.xml terdapat potongan kode di atas. Setiap <form> akan memiliki lebih dari satu <field>.

============================================

<form name=””>

Saya menuliskan nama form yang akan divalidasi inputnya. Di atas saya menuliskan userForm, yang berarti nama form yang akan divalidasi adalah form userForm. Nama ini harus sama dengan nama form yang anda berikan di dalam struts-config.xml. Sebagai contoh, pada struts-config saya seharusnya terdapat:


<form-beans>
        <form-bean name="userForm" type="com.myapp.form.User"/>
</form-beans>

============================================

property=””

Merupakan nama field, harus sama dengan yang ada di Class model, misalnya:

private String = userid;

private String = password;

============================================

depends=””

Menerangkan apa saja yang perlu divalidasi, misalnya saya menuliskan

depends=”required,minlength,mask” pada field userid, berarti aplikasi harus memeriksa apakah field userid diisi atau tidak, apakah userid yang dimasukan tidak melewati batas minimum karakternya dan apakah sesuai dengan format – berhubungan dengan regular expresion – yang ditentukan. Aturan” ini masih banyak lagi. Dapat diperiksa di file validator-rules.xml.

============================================

<msg name=”” key=””/>

Pesan yang akan ditampilkan bila terjadi error. name akan mengarah pada aturan(depends) yang dipakai, dan key pesan yang mana yang akan tampilkan. Daftar pesan ini ada di ApplicationResource.properties. Contoh:

<msg name=”required” key=”error.nullfield“>, berarti jika field userid tidak diisi maka akan ditampilkan pesan error yang key-nya error.nullfield.

error.nullfield=The following field: {0} is a required field. Please provide a value for {0}.

============================================

<arg0 key=””/>

Coba anda perhatikan pada pesan error -> error.nullfield terdapat {0}. {0} harus digantikan dengan sesuatu. Sengaja diberi tanda seperti itu agar pesan ini juga bisa dipakai field yang lain, tinggal mengganti {0} saja. Jadi untuk <arg0 key=”error.userlabel”> berarti tanda {0} akan digantikan dengan pesan error yang key-nya error.userlable.

error.userlabel=<b>User name</b>

============================================

<var>

Berguna untuk memberikan nilai untuk aturan”, misalnya minlength, maxlength, mask, dll. Contoh:


<var>
      <var-name>minlength</var-name>
      <var-value>5</var-value>
</var>

Berarti minlength untuk userid adalah 5 karakter, kurang dari itu dianggap terjadi kesalahan.

============================================

Anda juga dapat melakukan hal yang sama untuk field password. Yang terakhir adalah view-nya:


<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>

<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<html:errors/>
<html:form action="/lookUp">
    Userid: <html:text property="userid"/>
    Passowrd: <html:password property="password"/>
    <html:submit value="Submit"/>
</html:form>

</body>
</html:html>

Setelah semuanya siap, tinggal di-build dan deploy, kemudian dijalankan. untuk source lengkapnya dapat di coba svn-nya –>http://struts-validator.googlecode.com/svn/trunk/

atau download di –> nyusul :mrgreen:

Djöllkè @ n3tg33ks.wordpress.com

Advertisements

1 Response to “struts validator, pretty cool”


  1. July 7, 2009 at 10:45 am

    keren mas…aq harus belajar ini.. rischan


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: