読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

DBから値を取得して、Javaオブジェクトに詰め込んで、ブラウザにJSONで返すサンプル。

<スポンサーリンク>

サーブレットリクエストを処理し、DBから取得した値をJSONで返してみる。

昨日の記事で、株のイメージを持ったBeanなど作成した。
こいつらの情報はデータベース(MySQL)に格納してある。
さっきの記事で、このDBのConnectionを表示させるところまで作った。
次は、「DBから取得した値をJSONに変換し、サーブレット経由でブラウザに表示させる」というサンプルを作ってみる。

まずは、Connectionを返すstaticメソッドを作った。DBを管理するようなイメージのクラスだ。

package dao;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBManager {
    private static final String DATASOURCE_JNDI_NAME = "java:comp/env/jdbc/myds";
    public static Connection getConnection() {
        InitialContext ctx;
        Connection con = null;
        try {
            ctx = new  InitialContext();
            DataSource ds = (DataSource) ctx.lookup(DATASOURCE_JNDI_NAME);
            con = ds.getConnection();
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return con;
    }
}

次に、データを取得してBeanを返すクラス。
これは本来はもっとメソッドを充実させるところだけれど、今回はサンプルなのでこの程度に。

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import bean.StockBean;

//import com.mysql.jdbc.PreparedStatement;

public class StockDAO {
    private final String NAME = "name";
    private final String CODE = "code";
    private final String OPEN = "open";
    private final String HIGH = "high";
    private final String LOW = "low";
    private final String CLOSE = "close";
    private final String FINDBYNAME_SQL = "SELECT * FROM stock_value WHERE name = ?";
    
    private StockDAO() {
        //シングルトン
    }
    
    public static StockDAO getInstance() {
        return new StockDAO();
    }
    
    private StockBean resultSetBeanMapping(ResultSet rs) throws SQLException {
        StockBean bean = new StockBean();
        bean.setCode(rs.getString(CODE));
        bean.setName(rs.getString(NAME));
        bean.setOpenPrice(rs.getInt(OPEN));
        bean.setHighPrice(rs.getInt(HIGH));
        bean.setLowPrice(rs.getInt(LOW));
        bean.setClosePrice(rs.getInt(CLOSE));
        
        return bean;
        
    }
    
    public StockBean findByName(String name) throws SQLException {
        StockBean bean = new StockBean();
        Connection con = DBManager.getConnection();
        PreparedStatement ps = (PreparedStatement) con.prepareStatement(FINDBYNAME_SQL);
        
        ps.setString(1,name);
        ResultSet rs = ps.executeQuery();
        int count = 0;
        while (rs.next()) {
            count++;
        }
        //1行だけ選択できるか確認
        if (count == 1) {
            //カーソルを先頭行に移動
            rs.first();
            bean = resultSetBeanMapping(rs);
        } else {
            //本当はExceptionクラスを作るべき。
            throw new SQLException();
        }
        
        return bean;
        
    }    
}

リクエストを受け取るサーブレットはこんな感じ。
昨日作ったサンプルを作り替えている。
コメントアウトしてあえて残した。

package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;

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

import bean.StockBean;

import com.google.gson.Gson;

import dao.StockDAO;

public class ParameterTestServlet extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse res)
                    throws ServletException, IOException {
        System.out.println("This is doGetMethod");
        perform(req, res);
    }
    
    public void doPost(HttpServletRequest req, HttpServletResponse res) 
                    throws ServletException, IOException {
        System.out.println("This is doPostMethod");
        perform(req, res);
    }

    private void perform(HttpServletRequest req, HttpServletResponse res) 
                throws ServletException, IOException {
        //String message = req.getParameter("message");
        StockDAO dao = StockDAO.getInstance();
        StockBean bean = null;
        try {
            bean = dao.findByName("hoge");
            PrintWriter out = res.getWriter();
            Gson gson = new Gson();
            //out.println("Message=" + message);
            out.println(gson.toJson(bean));
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

DBから取得した値をbeanに詰め込み、そのbeanをGsonを使ってJSONに変換している。

で、ブラウザから「ttp://localhost:8082/rest/param」みたいにリクエストを投げると・・・

{"code":"1","name":"hoge","openPrice":509,"highPrice":254,"lowPrice":726,"closePrice":596}

JSONで値が返ってきた!
今日は寝るけど、次はこのJSONをJavaScriptで処理するサンプルかな。
リクエストで受け取った値も処理して、PreparedStatementに詰め込んだり。
だいぶ幅が広がってきた。

ちなみに、はじめにDBから値を取得しようとしたら、こんなエラーが。

org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement cannot be cast to com.mysql.jdbc.PreparedStatement

これはPreparedStatementがうまくキャストできていないって言ってるので、以下のようにimportするパッケージを変更した。

import java.sql.PreparedStatement;
//import com.mysql.jdbc.PreparedStatement;

参考文献

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)


まずはこれ一冊ちゃんと読むだけで、JSP/サーブレットがずいぶん理解できるようになったと思う。
はじめの一冊にぜひ。

感謝のプログラミング

今回で感謝のプログラミングは【477時間目】
10000時間まで、あと【9523時間】