7.8. Writing the Application Code
We will display the data of our application using the JavaScript component jqGrid. Currently, jqGrid is distributed under a commercial licence, but it is free for non-commercial purposes. You can use the free-jqGrid fork instead.
To display data and page-by-page navigation elements in this grid, we need to return data in the JSON format, the structure of which looks like this:
{
total: 100,
page: 3,
records: 3000,
rows: [
{id: 1, name: "Ada"},
{id: 2, name: "Smith"},
…
]
}
where
total | the total number of pages |
page | the number of the current page |
records | the total number of records |
rows | the count of records on the current page array |
The following code creates a class demonstrating this structure:
package ru.ibase.fbjavaex.jqgrid;
import java.util.List;
import java.util.Map;
/**
* A class describing the structure that is used in jqGrid
* Designed for JSON serialization
*
* @author Simonov Denis
*/
public class JqGridData {
/**
* Total number of pages
*/
private final int total;
/**
* The current page number
*/
private final int page;
/**
* Total number of records
*/
private final int records;
/**
* The actual data
*/
private final List<Map<String, Object>> rows;
/**
* Constructor
*
* @param total
* @param page
* @param records
* @param rows
*/
public JqGridData(int total, int page, int records,
List<Map<String, Object>> rows) {
this.total = total;
this.page = page;
this.records = records;
this.rows = rows;
}
/**
* Returns the total number of pages
*
* @return
*/
public int getTotal() {
return total;
}
/**
* Returns the current page
*
* @return
*/
public int getPage() {
return page;
}
/**
* Returns the total number of records
*
* @return
*/
public int getRecords() {
return records;
}
/**
* Return list of map
* This is an array of data to display in the grid
*
* @return
*/
public List<Map<String, Object>> getRows() {
return rows;
}
}
Now we will write an abstract class that will return that structure depending on the search and sorting conditions. It will be a parent class for the entity-specific classes that return similar structures.
/*
* Abstract class for working with JqGrid
*/
package ru.ibase.fbjavaex.jqgrid;
import java.util.Map;
import java.util.List;
import org.jooq.DSLContext;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Working with JqGrid
*
* @author Simonov Denis
*/
public abstract class JqGrid {
@Autowired(required = true)
protected DSLContext dsl;
protected String searchField = "";
protected String searchString = "";
protected String searchOper = "eq";
protected Boolean searchFlag = false;
protected int pageNo = 0;
protected int limit = 0;
protected int offset = 0;
protected String sIdx = "";
protected String sOrd = "asc";
/**
* Returns the total number of records
*
* @return
*/
public abstract int getCountRecord();
/**
* Returns the structure for JSON serialization
*
* @return
*/
public JqGridData getJqGridData() {
int recordCount = this.getCountRecord();
List<Map<String, Object>> records = this.getRecords();
int total = 0;
if (this.limit > 0) {
total = recordCount / this.limit + 1;
}
JqGridData jqGridData = new JqGridData(
total,
this.pageNo,
recordCount,
records);
return jqGridData;
}
/**
* Returns the number of records per page
*
* @return
*/
public int getLimit() {
return this.limit;
}
/**
* Returns the offset to retrieve the first record on the page
*
* @return
*/
public int getOffset() {
return this.offset;
}
/**
* Returns field name for sorting
*
* @return
*/
public String getIdx() {
return this.sIdx;
}
/**
* Returns the sort order
*
* @return
*/
public String getOrd() {
return this.sOrd;
}
/**
* Returns the current page number
*
* @return
*/
public int getPageNo() {
return this.pageNo;
}
/**
* Returns an array of records as a list of maps
*
* @return
*/
public abstract List<Map<String, Object>> getRecords();
/**
* Returns field name for search
*
* @return
*/
public String getSearchField() {
return this.searchField;
}
/**
* Returns value for search
*
* @return
*/
public String getSearchString() {
return this.searchString;
}
/**
* Returns the search operation
*
* @return
*/
public String getSearchOper() {
return this.searchOper;
}
/**
* Sets the limit on the number of display records
*
* @param limit
*/
public void setLimit(int limit) {
this.limit = limit;
}
/**
* Sets the number of records to skip
*
* @param offset
*/
public void setOffset(int offset) {
this.offset = offset;
}
/**
* Sets the sorting
*
* @param sIdx
* @param sOrd
*/
public void setOrderBy(String sIdx, String sOrd) {
this.sIdx = sIdx;
this.sOrd = sOrd;
}
/**
* Sets the current page number
*
* @param pageNo
*/
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
this.offset = (pageNo - 1) * this.limit;
}
/**
* Sets the search condition
*
* @param searchField
* @param searchString
* @param searchOper
*/
public void setSearchCondition(String searchField, String searchString,
String searchOper) {
this.searchFlag = true;
this.searchField = searchField;
this.searchString = searchString;
this.searchOper = searchOper;
}
}
Notice that this class contains the |