ページの先頭行へ戻る
Interstage Shunsaku Data Manager アプリケーション開発ガイド
Interstage

K.3.8 条件に一致するXML文書を連続して取得する

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