Spring+Hibernate+Velocity pagination
Hm…penulis sdg melengkapi fitur CMS dg Java agar bisa menampilkan data dalam jumlah tertentu. Agar memudahkan user dalam melihat data, jangan sampai data di 1 tabel muncul semua ke dalam tampilan 1 halaman web.
Tampilan seperti pada hasil pencarian Google sangatlah bagus dan dinamis. Tetapi untuk kebutuhan navigasi dengan menyediakan link previous dan next saja sudah lebih dari cukup. Tujuannya kan memudahkan melihat data. Untuk itu pada tulisan kali ini akan dijelaskan cara paging halaman web dg Java.
Persyaratan:
- Anda sudah memahami konsep OR-Mapping (Hibernate), Spring dan Velocity. Kalau belum anda bisa membaca tulisan ini.
- Tulisan ini meneruskan tulisan sebelumnya.
Kita akan menyimpan List hasil query data yang sudah dibatasi dengan LIMIT dalam object class Page, dengan kode seperti berikut:
import java.io.Serializable;
import java.util.List;
import org.hibernate.Query;
public class Page implements Serializable{
private List results;
private int pageSize;
private int page;
public Page(Query query, int page, int pageSize) {
this.page = page;
this.pageSize = pageSize;
results = query.setFirstResult(page * pageSize).setMaxResults(
pageSize + 1).list();
}
public boolean isNextPage() {
return results.size() > pageSize;
}
public boolean isPreviousPage() {
return page > 0;
}
public List getList() {
return isNextPage() ? results.subList(0, pageSize - 1) : results;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
}
Sumber: Gavin King blog
Class Page di atas akan melakukan eksekusi query yang diberikan oleh DAO dan menampung hasilnya dalam List. Kemudian list hasil query ini akan dipakai buat navigasi next dan previous.
Contoh penggunaan dalam class DAO-nya seperti berikut ini. Modifikasi untuk class CategoryDAO:
@Repository(“categoryDaoHibernate”)
@Transactional@Autowired
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public Page getCategories(int start, int count){
Query query = sessionFactory.getCurrentSession().createQuery(“from Category”);
return new Page(query, start, count);
}
}
Nah, kemudian di Controller tinggal panggil object DAO dan eksekusi method getCategories(). Hasilnya ditaruh ke object map agar sampai ke View. Berikut modifikasi pada class CategoryController.
@Controller
public class CategoryController {
private ICategoryDAO categoryDAO;
@Autowired
public void setCategoryDAO(@Qualifier(“categoryDaoHibernate”) ICategoryDAO iCategoryDAO) {
this.categoryDAO = iCategoryDAO;
}
@RequestMapping(“/categorylist”)
public ModelMap list(@RequestParam(value="page", required=false) Integer start){
if(start == null) start = 1;
start--;
ModelMap map = new ModelMap();
Page page = categoryDAO.getCategories(start, 15);
map.addAttribute("page", page);
return map;
}
}
Dengan demikian maka object page bisa kita akses dari view. Berikut adalah modifikasi pada file categorylist.html ada tambahan kode pagination dg velocity template.
<div id="pagination"> #set($next = $page.page + 2) #if($page.isPreviousPage()) << <a href="categorylist?page=$!page.page"> previous</a> - #end #set($x = $page.page + 1) page: $x #if($page.isNextPage()) - <a href="categorylist?page=$!next"> next</a>>> #end </div> <table border=“0″ cellpadding=“2″ cellspacing=“2″> <tr> <th>Name</th> <th </th> <th>Number of Items</th> </tr>
#foreach($category in $page.list) <tr> <td>$category.Name</td> <td><a href=“categoryform?category_id=$category.Id”>edit</a> | <a href=“categorydel?category_id=$category.Id”>hapus</a></td> <td>numberOfSubCategories</td> </tr> #end <tr> <td><a href=“categoryform”>Add</a> </td> </tr> </table>
Seharusnya akan membentuk navigasi: <<previous page:3 next>>, menyesuaikan jumlah data.
Semoga bermanfaat;
DM














Wah, mantab nih tutorialnya.
Btw ko datanya hilang 1 record ya tiap page, misalnya total record 15, total dalam 1 page 5 record.
Logikanya di tiap page ada 5 record, nah yang terjadi di sini pada page 1 cuma ada 4(1-4) record(record ke 5 hilang), pada page 2(6-9) record(record k 10 hilang) dan seterusnya.
Terima kasih