連載
» 2004年06月15日 10時00分 公開

JavaTips 〜JSP/サーブレット編:データベースの内容をCSV形式でダウンロードする

[山田祥寛,@IT]

 昨今では、データベースサーバに格納されているデータをHTML形式で出力し、ブラウザで参照するというシステムが一般的です。しかし、このようなHTML形式によるデータ出力は、データの閲覧には適していますが、再利用には不向きです。出力されたデータに対して何らかの加工や分析が必要な場合でも、HTMLファイルのままでは容易ではないからです。

 その点、CSV(Comma Separated Value:カンマ区切りテキスト)形式のデータなら、データベースへ取り込んで、容易に加工や分析を行うことができます。そこで、本稿ではデータベースから抽出したデータをCSV形式に整形し、クライアントからダウンロードできるようにする方法を紹介します。

 以下は、リクエストされたデータをデータベースサーバから取得し、CSV形式に整形するプログラムです。

Db2Csv.java
package to.msn.wings;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Db2Csv extends HttpServlet {
  public void doGet(HttpServletRequest request,HttpServletResponse response)
  throws ServletException,IOException {
    response.setContentType("application/octet-stream;charset=Windows-31J");
    response.setHeader("Content-Disposition","attachment; filename=db.csv");

    PrintWriter out=response.getWriter();
    Connection db=null;
    Statement objStt=null;
    try {
      Class.forName("org.gjt.mm.mysql.Driver");
      db=DriverManager.getConnection("jdbc:mysql://localhost/wings?
user=wings&password=wings&useUnicode=true&characterEncoding=Windows
-31J");
      objStt = db.createStatement();
      ResultSet rs=objStt.executeQuery("SELECT isbn,title,author,publish,price FROM books");
      ResultSetMetaData objRmd=rs.getMetaData();
       // タイトル行の出力
      out.println("ISBN,書名,著者,出版者名,価格");
       // 各行の内容を繰り返し出力
      while(rs.next()){
       // 各カラムの内容を繰り返し出力
        for(int i=1;i<=objRmd.getColumnCount();i++){
          out.print(rs.getString(i));
          out.print(i<=objRmd.getColumnCount() ? "," : "");
        }
        out.print(System.getProperty("line.separator"));
      }
    } catch (ClassNotFoundException e) {
      throw new ServletException(e);
    } catch (SQLException e) {
      throw new ServletException(e);
    } finally {
      try {
        if(objStt!=null){objStt.close();}
        if(db!=null){db.close();}
        if(out!=null){out.close();}
      } catch(Exception e) {
        throw new ServletException(e);
      }
    }
  }
}


 出力がHTMLではなく、ダウンロード用のデータであることを示しているのは、赤字の部分です。この2行の記述によって、クライアントは出力がダウンロード用のデータであることを認識し、デフォルトのファイル名を「db.csv」とします。もちろん、デフォルトのファイル名は自由に変更できます。

 なお、サーブレットクラスの動作にはデプロイメント・ディスクリプタ(web.xml)への登録が必要です。以下は、Tomcat 5におけるweb.xmlの記述例です。

web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
  version="2.4">
  <servlet>
    <servlet-name>Db2Csv</servlet-name>
    <servlet-class>javatips.Db2Csv</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Db2Csv</servlet-name>
    <url-pattern>/db.csv</url-pattern>/
  </servlet-mapping>
</web-app>


 この設定により、サーブレットクラス「Db2Csv」を以下のURLでリクエストできるようになります(ここでは、アプリケーション名を「javatips」としています)。

・http://localhost:8080/javatips/db.csv

 url-pattern要素を工夫すれば、あたかも静的なCSVファイルにアクセスしているようにクライアントの側に見せることも可能となります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。