Webアプリケーションでは、検索した結果を一定件数ごとに区切って、前後に連続したデータを取得したい場合があります。
このような場合、setRequestメソッドのパラメタである取得開始位置、または、取得終了位置に、その直前の検索処理によって取得した最終位置情報、または、先頭位置情報を指定してXML文書を連続して取得します。
条件に一致するXML文書を連続して取得する場合の流れについて、以下の図に示します。
図K.10 条件に一致するXML文書を連続して取得する場合の流れ
記述例
ビジネスクラス
// 次のページのデータの検索 public void next(DispatchContext context, shunProduct.ShunProductBean dataBean) { execute(context, dataBean, ShunAccessController.FORWARD); } // 前のページのデータの検索 public void back(DispatchContext context, shunProduct.ShunProductBean dataBean) { execute(context, dataBean, ShunAccessController.BACKWARD); } // 検索実行 private void execute(DispatchContext context, shunProduct.ShunProductBean dataBean, int direction) { String key = dataBean.getKey(); ShunConnection connection = null; ShunsakuAccessController accessController = null; : //Shunsakuサーバへ接続 connection = new ShunConnection("localhost", 23101); accessController = new ShunsakuAccessController(connection); //検索の準備 accessController.search(key); //データの取得位置を取得 String dataPosition = null; if(direction == ShunsakuAccessController.FORWARD) { dataPosition = dataBean.getLastPosition(); } else if(direction == ShunsakuAccessController.BACKWARD) { dataPosition = dataBean.getFirstPosition(); } //検索を実行 Object[] resultData = accessController.getResultData(ShunAccessController.SORT_1, dataPosition, 30, direction); int hit = resultData.length; //データBeanに、ヒット件数、取得開始位置、取得終了位置を設定 dataBean.setHitCount(hit); dataBean.setFirstPosition(accessController.getFirstPosition()); dataBean.setLastPosition(accessController.getLastPosition()); accessController.close(); connection.close(); : //結果データを作成、設定し、次の画面へ遷移 ShunProductListModel listData = new ShunProductListModel(resultData); dataBean.setResultList(listData); dataBean.setVerb("output"); context.setResponseBean("body", dataBean); : } |
ソート式
public class ShunsakuAccessController { : public static final String SORT_NONE = ""l; public static final String SORT_1 = "val(/document/base/price/text()) DESC"; : } |
Shunsakuアクセスクラス
public void search(String keys) throws ShunException { : queryString = "/document/base/prefecture == '" + keys + "'"; returnString = "/"; : getPreparedStatement(queryString, returnString); : } private void getPreparedStatement(String queryString, String returnString) { : pstmt = con.preparedSearch(queryString, returnString); : } public Object[] getResultData(String sortString, String dataPosition, int requestCount, int direction)throws ShunException { ShunResultSet resultSet; Object[] resultData = null; // 検索の実行 resultSet = getResultSet(sortString, dataPosition,requestCount,direction); this.lastPosition = resultSet.getLastPosition(); this.firstPosition = resultSet.getFirstPosition(); : resultData = parseResultSet(resultSet); : return resultData; } public ShunResultSet getResultSet(String sortString, String dataPosition, int requestCount, int direction)throws ShunException { ShunResultSet resultSet; Object[] resultData = null; //ソート式を指定 if (!sortString.equals(SORT_NON)) { this.fPreparedStatement.setSort(sortString); } //返信要求件数を設定 this.fPreparedStatement.setRequest(dataPosition, requestCount, direction); //検索を実行し、ShunResultSetオブジェクトを作成 return this.fPreparedStatement.executeSearch(); } public String getFirstPosition() { return firstPosition; } public String getLastPosition() { return lastPosition; } |