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;
} |