Welcome to Abdul Malik Ikhsan's Blog

Debugging Techniques

Posted in Teknologi by samsonasik on March 27, 2009

Kalau kita membuat program, seringkali tidak terhindar dari yang namanya ERROR, error yang saya maksudkan di sini bukan cuma soal kalau terjadi pesan kesalahan, tapi juga kalau hasil yang diinginkan tidak tercapai. Nah, untuk memperbaikinya, nah, kadang langsung kelihatan, kadang juga kita harus nge-DEBUG-nya. Berikut beberapa cara yang bisa dilakukan :
1. Look at the warning
Cara ini adalah cara yang biasa dilakukan pertama kali, kecuali sama sekali tidak ada warning, tapi hasil yang diinginkan gagal, baru cari cara lain, yaitu cara kedua.
2. Printing
Debug dengan cara ini adalah debug paling enak, misal dengan cara printf(- atau echo, atau System.out.println (menurut bahasa pemrograman masing2 )) data yang dikirim, atau proses yang dilakukan, kalau itu gagal, atau lolos, coba berhentikan program, kalau di PHP bisa pakai die atau exit, kalau di JAVA bisa pakai System.out.close(), dan lain2 sesuai bahasa masing2. Setelah itu lihat hasil print nya, di situ kita bisa analisis kesalahannya.
3. RTFM (Read The Fine Manual)
Baca dokumentasi !!! Seringkali kita melakukan error bukan karena salah tulis atau kurang (;), atau kurang endif, tapi karena memang kode yang dipasang benar2 tidak cocok. Cara RTFM merupakan cara yang tepat.
4. Look at available services
Bisa saja lho, terjadi error yang kita tidak mengerti sama sekali pesan errornya, itu karena ada service (service-service) yang diperlukan belum nyala. Coba deh cek service yang dibutuhkan, atau bisa saja terjadi conflict dengan service lain, kemarin saya pernah pakai toonel dengan port 8080, pas nyalain JSP, ternyata ga jalan. pas dicek ternyata memang port nya bentrok dengan toonel yang port-nya belum sempat saya ganti.
5. Watching
Hal yang pernah saya temui pas ngasisten-in dosen (cie..cie..), adalah code yang terbalik-balik. Pesan error tidak terjadi, tapi hasil yang diinginkan tidak tercapai. Pas dilihat di code programnya, memang ada proses yang terbalik atau kurang atau belum dilakukan.
6. Tidy the code
Dengan merapikan source code, proses debugging dengan cara dari no 1 s/d no 5 akan lebih mudah dilakukan.

……….
Referensi :
http://www.oopweb.com/CPP/Documents/DebugCPP/Volume/techniques.html
http://oreilly.com/catalog/linuxdrive3/book/ch04.pdf

Syair Abu Nawas

Posted in Agama by samsonasik on March 26, 2009

Oh, Tuhanku,

aku tak layak menjadi penghuni surga

Tapi, aku tidak tahan di neraka jahim

Terimalah taubatku dan ampunilah dosa-dosaku,

Sebab Engkaulah Maha Pengampun dari dosa-dosa besar

Tuhan, dosaku bagaikan bilangan pasir

Berilah aku kesempatan taubat Wahai Yang Maha Agung

Sementara umurku selalu berkurang tiap hari,

Malah dosaku terus bertambah, bagaimana aku menanggungnya?

Tuhanku,

Hamba-Mu yang penuh dosa kini telah datang pada-Mu mengakui dosa-dosanya dan memanggil nama-Mu

Jika Engkau ampuni, dan Engkau berhak mengampuninya

Sekiranya Engkau tolak,

Siapa lagi yang kami harap selain Engkau?”

indah banget ya….
disunting dari : http://sufimuda.wordpress.com/2009/03/25/belajar-dari-taubat-abu-nawas/

Meload data dari PHP ke Flex

Posted in Flex by samsonasik on March 25, 2009

Tentunya capek donk, kalau data kita ga dinamis, alias kita simpan dalam bentuk format XML biasa yang harus hardcode kita edit manual, nah, kali ini saya akan membahas tentang gimana sih caranya load data dari Array PHP ke flex, tetep sih dalam format XML, cuman kali ini isi datanya bisa dinamis. OK, pertamax, kita siapkan dulu datanya, saya beri contoh, data disimpan dalam sebuah table bernama books, field-fieldnya antara lain: isbn, title, dan author, kita isi beberapa record sebagai contoh.
Nah, setelah kita buat project kita, boleh pakai Netbeans, Eclipse, maupun yang lain. Saya beri contoh struktur source-nya seperti ini :

File MXML utama kita beri nama misalnya TestPHP.mxml. Pertama, kita siapkan PHP kita. berikut script untuk Koneksi.class.php :

<?php
    class Koneksi {

        public function Koneksi() {
            mysql_connect("localhost","root","");
            mysql_select_db("testFlexPHP");
        }

        public function listRecord($query) {
            $lister = mysql_query($query);
            $data = array();
            while ($row = mysql_fetch_array($lister)) {
                $data&#91;&#93; = $row;
            }
            return $data;
        }

        public function execQuery($query) {
            return mysql_query($query);
        }

    }
?>

Berikutnya, kita extends di kelas Books.class.php

<?php
    include "../PHPs/Koneksi.class.php";
    class Books extends Koneksi {

        public function Books() {
            parent::Koneksi();
        }    

        public function Edit($isbn, $title, $author) {
            parent::execQuery("update books set title='$title', author='$author' where isbn='$isbn'");
        }
        //tambahkan fungsi2 lain yg dibutuhkan...
        public function Add() {

        }
    }
?>

Kita siapkan pula script PHP untuk update data:

<?php
    include "../PHPs/Books.class.php";
    $book = new Books();
    $book->Edit($_POST['isbn'], $_POST['title'], $_POST['author']);
?>

Yes, sekarang, masuk ke PHP format XML kita (sample.xml.php) :

<?php header("Content-type: text/xml");
      include "../PHPs/Books.class.php";
      $book = new Books();
      $data = $book->listRecord("select * from books");
?>
<books>
       <?php foreach($data as $key=>$row){ ?>
            <item isbn="<?=$row&#91;'isbn'&#93;?>">
                <title><?=$row&#91;'title'&#93;?></title>
                <author><?=$row&#91;'author'&#93;?></author>
            </item>
        <?php } ?>
</books>

Untuk meload data, kita siapkan fungsi actionscript yang akan digunakan oleh MXML untuk meload data. (book.as)

import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;

    [Bindable]
    private var dataku :ArrayCollection;

    private function viewData(event:ResultEvent):void {
            dataku = event.result.books.item;
    }

Nah, ceritanya kan meload data yang bersifat dinamic dari PHP, di file mxml kita,kita butuh component HttpService untuk memanggil method actionscript yang memanggil data php dalam dalam format XML kita.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical"
    initialize="sampleService.send()">
<mx:Script>
    <!&#91;CDATA&#91;
        //digunakan untuk post form data pada saat update
        private function send_data():void {
            kirimEdit.send();
            //refresh hasil data
            sampleService.send();
        }
    &#93;&#93;>
</mx:Script>

<mx:Script source="ActionScripts/book.as"/>
<mx:HTTPService id="sampleService" url="XMLs/sample.xml.php" result="viewData(event)"/>
<mx:HTTPService id="kirimEdit" url="PHPs/UpdateBook.php" method="POST">
    <mx:request xmlns="">
        <title>
            {title.text}
        </title>
        <author>
            {author.text}
        </author>
        <isbn>
            {isbn.text}
        </isbn>
    </mx:request>
</mx:HTTPService>

     <mx:Panel title="contoh satu record" width="500" height="70" horizontalAlign="center">
         <mx:HBox>
             <mx:Label text="contoh pemanggilan satu record (Record ke 2) : "/>
             <mx:Text text="{dataku.getItemAt(1).title}"/>
         </mx:HBox>
     </mx:Panel>

     <mx:Panel title="contoh beberapa record" width="400" height="500" horizontalAlign="center">
         <mx:DataGrid dataProvider="{dataku}" id="gridBuku">
             <mx:columns>
                 <mx:DataGridColumn headerText="isbn" dataField="isbn"/>
                 <mx:DataGridColumn headerText="Title" dataField="title"/>
                 <mx:DataGridColumn headerText="Author" dataField="author"/>
             </mx:columns>
         </mx:DataGrid>

         <mx:Form>
             <mx:FormItem label="ISBN">
                 <mx:TextInput text="{gridBuku.selectedItem.isbn}" editable="false" id="isbn"/>
             </mx:FormItem>

             <mx:FormItem label="Title">
                 <mx:TextInput text="{gridBuku.selectedItem.title}" id="title"/>
             </mx:FormItem>

             <mx:FormItem label="Author">
                 <mx:TextInput text="{gridBuku.selectedItem.author}" id="author"/>
             </mx:FormItem>
             <mx:Button click="send_data()" label="Update"/>
         </mx:Form>
     </mx:Panel>
</mx:Application>

Hasil nya seperti ini :

Kapan pakai OOP ? Kapan pakai Procedural ?

Posted in Teknologi by samsonasik on March 23, 2009

Dengan hadirnya teknik pemrograman OOP, bukan berarti lho, kita mengesampingkan Procedural,
karena selalu pada saat belajar pemrograman (algoritma nya dulu) , kita belajar menjalankan
dengan teknik Procedural.

Nah, apakah karena tidak belajar algoritma dasar lagi (padahal lulusnya mungkin juga lulus-lulusan,
xi..xi..xi…), melainkan belajar konsep pemrogramannya(yang sekarang kebanyakan sudah support OOP),
kita kemudian anti Procedural ? oh.., tentu saja tidak. Ada hal-hal tertentu di mana kita bisa
menggunakan teknik procedural, yaitu :
1. Program yang dibutuhkan untuk kebutuhan ‘tools cepat’ untuk membantu penyelesaian aplikasi.
contoh : program pemindah data, program pencari record di database untuk membantu debugging aplikasi orang,
dan program-program kecil yang kemungkinan hanya digunakan untuk membantu pekerjaan, bukan digunakan
untuk dikembangkan sebagai aplikasi yang besar.
2. Program testing, misal untuk mendebug coding program, kita tak perlu buat kelas dan method2 nya untuk
melakukan debugging, karena biasanya sudah disediakan oleh bahasa pemrogramannya, walaupun di beberapa framework
ada method-method singkat untuk mendebug, tapi itupun berupa helper (fungsi-fungsi), bukan berupa kelas, itu hanyalah
masalah hobi si developer framework yang harus always OOP, bukan hal yang harus always diikuti.
3. Kefefet, seperti kondisi dadakan (walaupun ruang lingkupnya besar), sehingga kita tidak diberi waktu untuk
memodelkan dahulu, walaupun nantinya ketika aplikasi sudah beres, kalau ada waktu,
tetep kita sebaiknya membuat itu menjadi OOP, untuk memudahkan pada saat pengembangan.
4. Aplikasi yang bersifat algoritmik, atau pengecekan compiler/interpreter jalan apa tidak.
Bayangkan kalau kita mau cek menuliskan “Hello World !!!” harus seperti ini :

class Hello {
    private String str;
    public Hello(){
        this.str = new String("Hello World !!!");
    }
    public String showHello() {
        return this.str;
    }
   public static void main(String[] args) {
        Hello hl = new Hello();
        System.out.println(hl.showHello());
   }
}

Ga banget kan ?? 🙂

Nah, kapan kita menggunakan OOP ?
1. Aplikasi bersifat besar.
2. Aplikasi bersifat sedang tetapi ada kemungkinan nantinya akan dikembangkan lagi.

Terus, kenapa kita harus belajar OOP dari hal-hal kecil ? Tentunya supaya kita jadi terbiasa, sehingga tidak kaget
ketika menghadapi aplikasi yang besar. Simple kan?

load XML data (Simple)

Posted in Flex by samsonasik on March 21, 2009

Saya menulis tentang Flex kali ini bukan untuk memberikan tutorial lho, melainkan hanya untuk bisa saling berbagi (sharing) apa yang baru saya pelajari, karena emang belajarnya baru dari kemarin, he..he.. (jadi kalau mau nanya, mending nanya udah ada yang punya apa belum ya, he…he.., soalnya kalau nanya tentang Flex, takut belum bisa kejawab, 🙂  )

Ok, sekarang fokus ke masalah, kebanyakan Flex meload data dengan format XML, karena kalau format Binary, jika user menginginkan pergantian tampilan, maka perlu recoding di bagian back end, maka saya lebih fokuskan untuk membahas tentang load data via XML – nya ( bilang saja yang baru bisa baru itu, xi..xi..xi… , 🙂 )

Sekarang kita siapkan project kita, misal kita beri nama TestGridXML , karena kita akan fokus pada data, maka kita siapkan dulu datanya. Di sini saya menyimpan data format XML di actionscript file nya,  biar lebih rapi, buat aja folder untuk menyimpan file-file actionscript di bawah folder src, seperti pada gambar berikut :
debug-perspective

Berikut contoh code program XMLDataTest.as :

// ActionScript file
//digunakan agar variable bisa diakses langsung oleh komponen
[Bindable]
private var dataPenduduk:XML =
<penduduk>
<penduduk no="1">
	<nama>Abdul Malik Ikhsan</nama>
	<alamat>Jalan Pamekar</alamat>
    </penduduk>
<penduduk no="2">
	<nama>samsonasik</nama>
	<alamat>Jalan Burangrang</alamat>
    </penduduk>

</penduduk>

Sekarang, tinggal buat view nya deh :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
	xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="vertical" verticalAlign="middle">
<mx:Script source="ActionScriptFilez/XmlDataTest.as"/>
<mx:Panel title="Test Grid Application" width="350" horizontalAlign="center">
	<mx:DataGrid dataProvider="{dataPenduduk.penduduk}">
		<mx:columns>
			<mx:DataGridColumn headerText="No." dataField="@no"/>
			<mx:DataGridColumn headerText="Nama" dataField="nama"/>
			<mx:DataGridColumn headerText="Alamat" dataField="alamat"/>
		</mx:columns>
	</mx:DataGrid>
</mx:Panel>
</mx:Application>

Inilah hasilnya :
datagrid flex simple

Jualan obat ganteng…

Posted in Foto by samsonasik on March 18, 2009

ayo, siapa mau beli obat ganteng, silakan hubungi saya, berikut produk dari saya :

xi…xi…xi…

getParam CodeIgniter helper

Posted in Tutorial PHP by samsonasik on March 14, 2009

Kalau di zend Framework, kita bisa gunakan $this->getParam untuk memanggil suatu parameter setelah nama parameter tersebut, misal http://localhost/namaKelasKontroller/namaMethod/namasegment/isisegment/namasegment2/isisegment2 dan seterusnya, tinggal tulis $this->getParam(namasegment), kalau di CI, kita harus hafal dia berada pada segment ke berapa, halah gubrak ( atau saya yang belum nemu aja ya, he..he..).
Nah, untuk mengatasinya, kita bisa mengantisipasi dengan membuat sebuah helper baru, misal use_param_helper , di simpan dalam ./system/application/helpers/use_param_helper.php , berikut code programnya,

<?php
    if ( ! function_exists('getParam'))
    {
        function  getParam($param)
        {
            $ci = & get_instance();
            $totalsegment = $ci->uri->total_segments();
            $resultparam = "";
            for($i=1;$i<=$totalsegment;$i++) {
                if ($ci->uri->segment($i)==$param) {
                    $resultparam = $ci->uri->segment($i+1);
                    break;
                }
            }
            return $resultparam;
        }
    }
/* End of file use_param_helper.php */
/* Location: ./system/application/helpers/use_param_helper.php */

kita autoload aja supaya mudah, di ./system/application/config/autoload.php kita bisa atur di code program :

//...
$autoload['helper'] = array('url', 'use_param');
//...

Sekarang kita coba di controller, di sini saya coba di controller TestParam :

id/1/nama/andi
Yup, asik kan, jadi ga perlu lagi ngitung segment ke berapanya …

kenapa saya pakai linux ?

Posted in kehidupan, Teknologi by samsonasik on March 14, 2009

Kalau ada yang nanya, kenapa saya pakai Linux ? jawabannya ada banyak, he..he.. :

  1. Pas pengen nginstall pertama, ada nya ubuntu, ya sudahlah ( padahal alasan aja males nyari , xi..xi..xi..).
  2. Jarang ada Linux terkena virus.
  3. Gratis
  4. Tidak Perlu Didefrag, karena filesystemnya lebih bagus dari filesystem windows.
  5. Tidak perlu menginstall banyak driver, karena kebanyakan udah support, walaupun ada beberapa yang tidak

Nah, alasan ketiga tuh yang paling masuk akal, soalnya kalau ke mana2, takut kalau pakai produk bajakan, he..he.. . Jadinya,  pakai yang openSource tapi lumayan asik, terutama compiznya, asik buanget, coba deh. 🙂

Membuat Paging pada JSP

Posted in Tutorial JSP, Tutorial Servlet by samsonasik on March 10, 2009

Hm…, lama nih ga nulis artikel tentang JSP, habis, nasib ngurusin PHP mulu, :), he..he… Di sini saya memodifikasi kelas pagination punya CodeIgniter (PHP), cuma copy logika nya aja, karena pagination nya emang udah bagus 🙂 (bilang aja ga bisa buat sendiri, xi..xi…xi…).

Hal pertama yang harus ditentukan adalah, apa yang akan kita list dan kita paging. Saya di sini akan memberi contoh tentang paging menggunakan PostgreSQL, dengan table orang dengan field2 nya id, nama, alamat, simple kan ? 🙂
OK, sekarang kita siapkan modelnya :

1. Kelas Koneksi

package beanpackage;
import java.sql.*;
/**
 *
 * @author samsonasik
 */
public class Koneksi {

 private Connection con=null;
 private Statement st=null;
 private ResultSet rs=null;

 public Koneksi()throws SQLException,ClassNotFoundException {
 Class.forName("org.postgresql.Driver");
 con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/ikhsandb","ikhsan","123456");
 st = con.createStatement();
 }

 public void seleksi(String s) throws SQLException{
 rs = st.executeQuery(s);
 }

 public boolean getNext() throws SQLException{
 return rs.next();
 }

 public String getText(String t) throws SQLException{
 return rs.getString(t);
 }

 public int getInt(String t) throws Exception {
 return rs.getInt(t);
 }
}

2. Kelas Pagination (library pagination nya )

package beanpackage;

/**
 *
 * @author samsonasik
 */
//dimodifikasi dari kelas paginationnya codeIgniter
public class Pagination {
    public int totalrows = 0;
    public int numlink   = 2;
    public int curpage   = 0;
    public int perpage = 2;
    public String firstlink = "First";
    public String nextlink = "Next";
    public String prevlink = "Previous";
    public String lastlink = "Last";

    public String createlinks(int halaman) {
        if ( (this.totalrows==0) || (this.perpage==0)) {
            return "";
        }

        int numpage = this.totalrows / this.perpage ;
        int sisa  = this.totalrows % this.perpage;
        if (sisa > 0 ){
            numpage = numpage + 1;
        }

        if (numpage==1) {
            return "";
        }

        try {
            this.curpage = halaman;
        } catch (Exception e) {
            this.curpage = 1;
        }

        try {
            this.curpage = (int) this.curpage;
        } catch (Exception e) {
            this.curpage = 1;
        }

        if (this.curpage > this.totalrows)
        {
            this.curpage = (numpage -1 ) * this.perpage ;
        }

        if (this.curpage < 1 ) {
            this.curpage = 1;
        }

        int uri_page_number = this.curpage ;
        int start = ((this.curpage - this.numlink) > 0 ) ? this.curpage - (this.numlink -1) : 1;
        int end   = ((this.curpage + this.numlink < numpage)) ? this.curpage + this.numlink : numpage;

        //inisialisasi ...
        String theoutput = "";
        //Render first link
        if (this.curpage > (this.numlink +1))
        {
            if (this.curpage <= numpage) {
                theoutput +="<a href=\"?page=1\">"+this.firstlink+"</a>&nbsp;";
            } else {
                theoutput +="";
            }
        } 

        //Render Previous Link
        if (this.curpage !=1) {
            if (this.curpage <= numpage) {
                theoutput +="<a href=\"?page="+(this.curpage-1)+"\">"+this.prevlink+"</a>&nbsp;";
            } else {
                theoutput +="";
            }
        }

        //render digit link

        for (int loop = start -1; loop<end;loop++) {
            if (this.curpage <= numpage) {
            if (this.curpage == (loop+1)) {
                theoutput += loop+1+"&nbsp;";
            } else {
                theoutput += "<a href=\"?page="+(loop+1)+"\">"+(loop+1)+"</a>&nbsp;";
            }
            } else {
                theoutput +="";

            }
        }

        //render the next link
        if (this.curpage < numpage) {
            theoutput += "<a href=\"?page="+(this.curpage+1)+"\">"+this.nextlink+"</a>&nbsp;";
        } else {
            theoutput +="";
        }

        //render the last link
        if ((this.curpage + this.numlink)<numpage) {
            theoutput += "<a href=\"?page="+numpage+"\">"+this.lastlink+"</a>";
        }

        return theoutput;
    }
}

3. Kelas Orang (Model dari table orang)

package beanpackage;

import java.sql.SQLException;
import java.util.ArrayList;
/**
 *
 * @author samsonasik
 */
public class Orang {
    private int id;
    private String nama, alamat;

    public Orang(){ }

    public Orang(int id, String n,String a){
       this.id = id;
       this.nama = n;
       this.alamat = a;
    }

    public void setNama(String n)
    {
        this.nama = n;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setAlamat(String al)
    {
        this.alamat = al;
    }

    public String getNama()
    {
        return nama;
    }

    public String getAlamat()
    {
        return alamat;
    }

    //seleksi offset limit
    public ArrayList<Orang> seleksi(int offset, int limit) throws SQLException, ClassNotFoundException
    {

        ArrayList<Orang> temp = new ArrayList<Orang>();
        try {
            Koneksi kon = new Koneksi();
            kon.seleksi("select * from orang offset '"+offset+"' limit '"+limit+"'");

            while (kon.getNext()) {
                temp.add(new Orang(kon.getInt("id"), kon.getText("nama"), kon.getText("alamat")));
            }
        } catch(Exception e) {}

        return temp;
    }

    public int getJml() {
        int jml  = 0;
        try {
            Koneksi kon = new Koneksi();
            kon.seleksi("select count(*) as jml from orang");
            if (kon.getNext()) jml = kon.getInt("jml");
        } catch (Exception e){}
        return jml;
    }
}

Nah, kalau sudah tuh, kita buat servletnya, ga akan saya tulis lengkap

deh kaya’nya, cuma isi method nya aja yang memanggil

model-model yang ada.

.............
        ArrayList<Orang> temp = new ArrayList<Orang>();
        PrintWriter out = response.getWriter();
        try {
            Orang  org = new Orang();
            int page = 0;
            try {
                page = Integer.parseInt(request.getParameter("page"));
            } catch (Exception e) {
                page = 1;
            }

            Pagination pgn = new Pagination();
            pgn.totalrows = org.getJml();

            temp = org.seleksi(page*pgn.perpage-pgn.perpage,pgn.perpage);
            request.setAttribute("temp", temp);
            request.setAttribute("perpage",pgn.perpage);
            request.setAttribute("paging", pgn.createlinks(page));

        } catch(Exception e) {

            out.print("terjadi kesalahan koneksi");
            out.close();
        }
        request.getRequestDispatcher("/testlist.jsp").forward(request, response);
................

Jangan lupa konfigurasi web.xml nya, udah bisa kan ? 🙂

Terakhir adalah view :

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
${paging}
<table border="1" cellpadding="1" cellspacing="1">
<tr>
<td>No</td>
<td>Id</td>
<td>Nama</td>
<td>Alamat</td>
</tr>
<c:catch var ="catchException">
    <c:if test="${param.page eq null || param.page eq '1'}">
        <c:set var="no" value="0"/>
    </c:if>
    <c:if test="${param.page gt '1'}">
        <c:set var="no" value="${param.page * perpage - perpage }"/>
    </c:if>
  </c:catch>

    <c:if test="${catchException !=null}">
        <c:set var="no" value="0"/>
    </c:if>

    <c:forEach var="testlist" items="${temp}">
        <c:set var="no" value="${no +1}"/>
<tr>
<td>${no} .</td>
<td>${testlist.id}</td>
<td>${testlist.nama}</td>
<td>${testlist.alamat}</td>
</tr>
</c:forEach></table>
${paging}

Simple kan ? selamat mencoba 🙂