2016-09-10 1 views
-1

大きなファイルをチャンクで読み込んでJSONに変換してSpring MVCコントローラに送信するコードがあります。私のメソッドは次のようになります。オフセットで開始し、noBytesでチャンク、結果は私が私のコントローラファイルチャンクをJavaのページに変換

の次と前のページネーションの仕事をするために問題を抱えていJSONに変換することが渡され、私のコントローラ

public String readByteBlock(File file, int offset, int noBytes) throws IOException { 
    InputStream in = new FileInputStream(file); 
    byte[] result = new byte[noBytes]; 
    in.skip(offset); 
    in.read(result, 0, noBytes); 
    return FileSaver.byteArrayToString(result, noBytes); 
} 

に送信されます

@RequestMapping("/page/{id}") 
@ResponseBody 
    File file = new File("C:/teste.txt"); 
    FileSaver fs = new FileSaver(); 
    int byteblock = 100;   
    int offset = 0; 
    if(id.equals("next")){  
     offset = (int) req.getSession().getAttribute("prevEndPos"); 
     String s = fs.readByteBlock(file, offset, byteblock);  
     req.getSession().setAttribute("prevStartPos", offset);  
     req.getSession().setAttribute("prevEndPos", (offset + byteblock));  
     return s; 
    } 
    if(id.equals("prev")){ 
     offset = (int) req.getSession().getAttribute("prevStartPos") - byteblock ; 
     if(offset < 0){ 
      String s = fs.readByteBlock(file, 0, byteblock); 
       return s; 
     } 
     String s = fs.readByteBlock(file, offset, byteblock);   
     req.getSession().setAttribute("prevStartPos", (offset - byteblock));  
     return s; 
    } 
    String s = fs.readByteBlock(file, 0, byteblock); 
    req.getSession().setAttribute("prevStartPos", offset); 
    req.getSession().setAttribute("prevEndPos", (offset + byteblock)); 
    return s; 

ファイルの各チャンクはmのhtmlテーブルに入れられますyアプリケーションでは、現在のブロックstartByteとendByteをセッションに保存しましたが、ユーザーが前のページのボタンを押すと、前のブロックの開始と終了位置を知ることができますか?セッションは現在のページを保持し、前のページは保持しないため、

答えて

2

最初に、ページネーションについて少し一般的です。ページ番号

は、バックエンドの意志は、データと次のメタデータを送り返し

  1. ページサイズ
    1. 合計 シンプルなページネーションは、2つのプロパティのみを持っていますページ数
    2. 現在のページ番号
    3. 現在のページサイズ

    クライアントは、ページ番号とページサイズを送信することで、必要なデータのチャンクを要求し、バックエンドはオフセットを計算して終了します。注意すべき点は、ユーザーがページ・サイズを増やすと、前の呼び出しでクライアントが受け取ったページの総数はもはや有効ではなくなりますが、その場合はサーバーはデータを戻さないだけです。新しいメタデータ。 このアプローチは、バックエンドのSpring DataやフロントエンドのEXT JSなど、多くのフレームワークで使用されています。

    あなたが春を使用しているので、あなただけのデータとメタデータの両方を保持しているDTOクラスを作成する必要があります。

    Class PageResult { 
        String data; 
        int totalPageCount; 
        int currentPage; 
        int pageSize;  
    } 
    

    あなたにお電話する必要があることに注意して輸送データの文字列を使用していますJSON.parse()をフロントエンドで実行すると、JSONは文字列でエスケープされ、馬鹿に見えます。 Jacksons ObjectMapperを使用してデータを読んでいるのなら、JsonNodeを返すObjectMapper.readTree()を使用し、それをDTOクラスに入れることをお勧めします。

    フロントエンドでは、推奨ページサイズとページ番号の入力ボックスを使用してドロップダウンを行うことができます。次ページと前ページを必要とする場合は、現在のページ+/- 1とページサイズでリクエストを送信するだけで、バックエンドは開始ページ、終了ページ、合計ページを計算します。

-1

セッションに2つのint属性を追加するのではなく、適切な値を含む2つのint配列を追加しないでください。また、「ページ」属性を追加すると、次のようなことができます。

if(id.equals("prev") { 
    List<Integer> offsetStarts = req.getSession.getAttribute("offsetStarts); 
    List<Integer> offsetEnds = req.getSession.getAttribute("offsetEnds); 
    int lastPage = req.getSession.getAttribute("page"); 
    int desiredPage = lastPage -1; 
    int offsetStart = offsetStarts.get(desiredPage); 
    int offsetEnd = offsetEnd.get(desiredPage); 
    // get the chunk as desired, and return it 
    req.getSession().setAttribute("page", desiredPage); 
} 
// if it's a new chunk, append offsets to the arrays 
関連する問題