2016-09-10 4 views
-1

대용량 파일을 청크로 읽고 JSON으로 변환하여 Spring MVC 컨트롤러에 전송하는 코드가 있습니다. 내 메소드는 다음과 유사합니다. 원하는 위치로 전달합니다. noBytes에서 오프셋과 chunksize 영역에서 시작, 결과는 전달은 JSON로 변환하고파일 청크를 Java 페이지로 변환

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. 있는 페이지 크기
  2. 페이지 번호

백 엔드 의지가 데이터 다음과 같은 메타 데이터를 다시 보냅니다

  1. 총 페이지 수
  2. 현재 페이지 번호
  3. 현재 페이지 크기

클라이언트는 페이지 번호와 페이지 크기를 전송하여 원하는 데이터 덩어리를 요구하면 백엔드가 오프셋을 계산하고 종료합니다. 주의해야 할 점은 사용자가 페이지 크기를 늘리면 이전 호출에서 클라이언트가받은 총 페이지 수는 더 이상 유효하지 않지만이 경우 서버는 아무런 데이터도 반환하지 않으며 새로운 메타 데이터. 이 접근법은 백엔드의 스프링 데이터와 프론트 엔드의 EXT JS와 같은 많은 프레임 워크에서 사용됩니다. 당신이 봄을 사용하고 있기 때문에

, 당신은 단지 데이터와 메타 데이터를 모두 보유하고 DTO 클래스를 생성해야합니다 : 당신은 당신이 전화를 할 수 있다는 것을 알고, 반송 데이터 문자열을 사용하는에서

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

프론트 엔드에서 JSON.parse()를 호출하면 JSON은 어리석은 문자열로 이스케이프 처리됩니다. Jacksons ObjectMapper를 사용하여 데이터를 읽는 경우 JsonNode를 반환하는 ObjectMapper.readTree()를 사용하여 DTO 클래스에 넣는 것이 좋습니다.

프런트 엔드에서 제안 된 페이지 크기와 페이지 번호 입력 상자를 사용하여 드롭 다운을 할 수 있습니다. 다음 페이지와 이전 페이지를 원할 경우 현재 페이지 +/- 1 및 페이지 크기로 요청을 보내면 백엔드에서 시작, 끝 및 총 페이지를 계산합니다.

-1

세션에 두 개의 int 속성을 추가하는 대신 적절한 값을 포함하는 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 
관련 문제