2011-12-29 6 views
0

사용자 제출을 기반으로 모든 항목을 표시하는 jsp (itemSearch.jsp)가 있습니다. JDBC 연결Java 응용 프로그램에서 CSV 파일에 데이터를 쓰는 방법

public ArrayList getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate) { 
ArrayList p_items=new ArrayList(); 
Connection connection = null; 
String sqlStatement = null; 

try { 
      connection = DBManager.getConnection(DBManager.EPM_DATASOURCE_NAME); 
      if(set==1) { 

       sqlStatement = "SELECT I.lineid, I.date,S.STATUS, S.DATETIME, "; 
       sqlStatement += "S.TOTAL FROM ITEM I, LITEM LI, ITEM_STATUS S "; 
       sqlStatement += "WHERE I.LINEID=LI.ID AND I.ITEMID=? "; 

       if (fromDate !=null && toDate!=null){ 
        SimpleDateFormat fd = new SimpleDateFormat("MM/dd/yyyy"); 
        String fromdateString = fd.format(fromDate); 
        String todateString = fd.format(toDate); 
        sqlStatement += " AND I.PDATE BETWEEN RANGE_DATE('" + fd.format(fromDate) + "','MM/DD/YYYY') AND RANGE_DATE('" + fd.format(toDate) + "','MM/DD/YYYY')"; 

       }   
       sqlStatement += "ORDER BY I.PDATE DESC"; 
      } 

      PreparedStatement ps = connection.prepareStatement(paginationBegin+sqlStatement+paginationEnd); 
      ps.setInt(1, ID); 
      ResultSet rs = ps.executeQuery(); 
      while(rs.next()) { 
       if(items.contains(new Integer(rs.getInt("itemid")))==false) { 
       items.add(new Integer(rs.getInt("itemid"))); 
       ReportItem ri = new ReportItem(); 
       ri.setLineItemID(rs.getInt("lineid")); 
       ri.setTransmitted(rs.getTimestamp("idate")); 
       ri.setStatus(rs.getString("status")); 
       ri.setStatusDateTime(rs.getTimestamp("s_datetime")); 
       p_items.add(ri); 
       } 
       } 
      rs.close(); 
      ps.close(); 
     } catch (SQLException e) { 
      log("ERROR"); 
     } catch (NamingException e) { 
      log("ERROR"); 
     } finally { 
      DBManager.closeConnection(connection); 
     } 

     return p_items; 
} 

를 사용하여 내가 데이터를 가져 오는하고 getProcessedItems 여기에

submitItems = itemManager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate); 

아래와 같이 사용자을 제출하면 내가이 제대로 itemSearch.jsp에 데이터를 표시하지만 지금 모든 매개 변수를 제출 자바 메소드를 호출하고 다운로드를 위해 파일에 표시된 데이터가 들어있는 CSV 파일 (JSP의 하이퍼 링크)을 추가하고 싶습니다.

<div align="right" class="TableRows" style="padding-right:10px"><a href="" class="TableRowLinks">CSV File</a></div> 

질문 1. 어떻게 쿼리 결과에서 CSV 파일을 생성하는 방법? 2. jsp 파일에서 동일한 링크를 지정하는 방법은 무엇입니까?

답변

4

당신은 왜 당신이 JSP 파일에 쓰고 싶어 SuperCSV

를 사용할 수 있습니까? 서블릿을 사용하려면 확장자가 .csv 인 파일을 만들고 응답을 작성하십시오.

코드 샘플 :

class Order { 
    Integer orderNumber; 
    Integer parentOrder; 
    Integer productNumber; 
    String userComment; 

    public Integer getOrderNumber() { 
     return orderNumber; 
    } 
    public void setOrderNumber(int orderNumber) { 
     this.orderNumber = orderNumber; 
    } 
    public Integer getParentOrder() { 
     return parentOrder; 
    } 
    public void setParentOrder(int parentOrder) { 
     this.parentOrder = parentOrder; 
    } 
    public Integer getProductNumber() { 
     return productNumber; 
    } 
    public void setProductNumber(int productNumber) { 
     this.productNumber = productNumber; 
    } 
    public String getUserComment() { 
     return userComment; 
    } 
    public void setUserComment(String userComment) { 
     this.userComment = userComment; 
    } 
} 

를 CSV에 일부 개체를 작성

public void should_partial_write() throws Exception { 
    // The data to write 
    Order mainOrder = new Order(); 
    mainOrder.setOrderNumber(1); 
    mainOrder.setProductNumber(42); 
    mainOrder.setUserComment("some comment"); 
    Order subOorder = new Order(); 
    subOorder.setOrderNumber(2); 
    subOorder.setParentOrder(1); 
    subOorder.setProductNumber(43); 

    // for testing write to a string rather than a file 
    StringWriter outFile = new StringWriter(); 

    // setup header for the file and processors. Notice the match between the header and the attributes of the 
    // objects to write. The rules are that 
    // - if optional "parent orders" are absent, write -1 
    // - and optional user comments absent are written as "" 
    String[] header = new String[] { "orderNumber", "parentOrder", "productNumber", "userComment" }; 
    CellProcessor[] Processing = new CellProcessor[] { null, new ConvertNullTo(-1), null, new ConvertNullTo("\"\"") }; 

    // write the partial data 
    CsvBeanWriter writer = new CsvBeanWriter(outFile, CsvPreference.EXCEL_PREFERENCE); 
    writer.writeHeader(header); 
    writer.write(mainOrder, header, Processing); 
    writer.write(subOorder, header, Processing); 
    writer.close(); 

    // show output 
    System.out.println(outFile.toString()); 
} 
+0

나는 데이터를 생성/작성할 수있는 솔루션을 찾고 있습니다. o csv를 사용하여 JDBC 쿼리가 끝나면 pojo를 생성하지 않고 결과 세트를 저장하지 않아도됩니다. –

3

<a href="CsvServlet" class="TableRowLinks">CSV File</a> 

하자 아래 그림과 같이 CSV를 생성 할 수 서블릿에 대한 링크를 제공 파일 서블릿은 CSV에 대한 MIME 유형을 text/comma-separated-values or text/csv으로 설정합니다. 오픈 소스 라이브러리를 사용하여 CSV 파일을 만듭니다 : CSV API for Java.

클릭에 CSVDowlaod를 호출하기 전에 JSP로에서

public class CsvServlet extends HttpServlet 
{ 
    public void doPost(HttpServletRequest req, HttpServletResponse res) 
         throws ServletException, IOException 
    { 
      res.setContentType("text/csv"); 
      res.setHeader("Cache-Control", "public"); 
      res.setHeader("Pragma", "public"); 
      res.setHeader("Content-Disposition", "attachment; filename= \"test.csv"+ "\""); 

      //create csv out of data from db and stream it to res.getOutputStream() 
    } 
} 
+0

죄송합니다. 사용 방법을 잘 모르겠습니다. 좀 더 정확하게 할 수 있습니까? –

+0

@ Mad-D 서블릿은 바이너리 컨텐츠를 생성하는 데 사용해야합니다. 그래서 서블릿 (href를 통해)을 호출하고 CSV 파일을 생성 한 다음 서블릿 출력 스트림에 써주도록 제안했습니다. –

+0

이것은 내가 한 일입니다. 'CSV File '너무 지나치게 매개 변수를 전달하십시오. 그러나'doPost' 요청에서 이것을 어떻게 retreview 할 수 있을지 모르겠습니다. 나는'request.getAttribute ("reportItems")'와'request.getParameter ("reportItems")'를 시도했다. 내가 도대체 ​​뭘 잘못하고있는 겁니까 ? –

1

샘플 코드. 내가 CSV 파일 링크

<div align="right" class="TableRows" style="padding-right:10px"><a href="/CSVDownlaod.epm?typeParam=<%=typeParam%>&idParam=<%=idParam%>&startPage=<%=startPage%>&endPage=<%=endPage%>&fromDate=<%=fDate%>&toDate=<%=tDate%>" class="TableRowLinks">CSV File</a></div> 

내부 CSVDownlaod.epm에 JSP에서 매개 변수를 보내기

typeParam = 1; 
idParam = itemID; 
startPage= startPage; 
endPage= endPage; 
fromDate= fromDate; 
toDate = toDate; 

로 데이터를 저장 한, 나는 두 단계를 수행했다. 1. JSP에서 요청 왔는지 및

int typeParam = Integer.parseInt(request.getParameter("typeParam")); 
String fDate = request.getParameter("fromDate").trim(); 

reportData = Manager.getProcessedItems(1, itemID, startPage, endPage, fromDate, toDate); 
  1. Need to define before try-catch 
    String fileName = name.csv 
    String filePath = directory path 
    
    try {     
         CSVWriter writer = new CSVWriter(filePath); 
         writer.setQuoteMode(CSVWriter.DQUOTE_CONDITIONAL); 
         writer.setHeader(newHeader); 
         writer.write(data); 
         file_written = true; 
         data = null; 
         HashMap model = new HashMap(); 
         model.put("fileName", fileName); 
         model.put("filePath", filePath); 
         model.put("delete_after", new Boolean(true)); 
         model.put("content_type", "application/vnd.ms-excel");    
         return new ModelAndView("fileView", model); 
        } catch (IOException io) { 
         System.out.println("ERROR :" + io.toString()); 
        } 
    
    CSV

    벡터 데이터

  2. 쓰기 데이터를 저장하는 데이터 & 반복 (예를 들어) 데이터를 얻을 getProcessedItems 방법에 매개 변수 전달

관련 문제