サンプルコード2

次にServletでデータベースにアクセスするプログラムのサンプルを表示する。このプログラムはブラウザから直接(フォームを介さずに)呼ばれた時には全レコードの内容を表示し、フォームの送信によって呼び出された時は、送信内容に応じた操作(レコード新規登録、更新処理)を行ってから全レコードの内容を表示する。見て分かるとおり、JDBCの扱いに関しては先ほどのサンプルと特に変わりはない。

jdbcServletSample.java


import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;
import java.io.PrintWriter;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class jdbcServletSample extends HttpServlet{

    //initメソッドのオーバーライド
    public void init(ServletConfig config)throws ServletException{
	    super.init(config);

        //ドライバのロード
        try{
            Class.forName("org.postgresql.Driver");
        }catch (ClassNotFoundException cnfe){
            throw new ServletException("Failed to load JDBC driver.");
        }
    }

    //doGetメソッド
    public void doGet(HttpServletRequest request,HttpServletResponse response)
	    throws ServletException,IOException{

        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;

        response.setContentType("text/html; charset=Shift_JIS");
        //ブラウザにキャッシュを使わせないための工夫らしい。
        response.setHeader("Expires", "Sat, 01 jan 2000 00:00:00 GMT");

        try{
            con = DriverManager.getConnection(
                "jdbc:postgresql://サーバ名/データベース名", "ユーザ名","パスワード"
            );
            stmt = con.createStatement();

            PrintWriter out = response.getWriter();
            out.println("<html><head>");
            out.println("<title>JDBCによるインデックス/索引システム</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h3>JDBCによるインデックス/索引システム(?)</h3>");
            out.println("<hr>");
            out.println("<table align=center>");

            //SELECT文の実行
            rs = stmt.executeQuery("SELECT * FROM t99xxxxx_tbl1");
            while(rs.next()){
                String button0 = rs.getString("button0");
                String name0 = rs.getString("name0");
                String textarea0 = rs.getString("textarea0");
                out.println("<tr><td><b>URL:</b></td>");
                out.println("<td><b><a href=\""+ name0 +"\">"
                                  + name0 +"</a></b></td></tr>");
                out.println("<tr><td>概念:</td>");
                out.println("<td>" + button0 + "</td></tr>");
                out.println("<tr><td>コメント:</td>");
                out.println("<td>" + textarea0 + "</td></tr>");
                out.println("<tr><td colspan=2><hr></td></tr>");
            }

            out.println("</table>");


            //以下、登録用フォーム
            out.println("<hr>");
            out.println("<form action=\"./jdbcServletSample\" method=post>");
            out.println("<ul>");
            out.println("<li>");
            out.println("<select name=select0>");
            out.println("<option value=1 selected>新規登録</option>");
            out.println("<option value=2>更新</option>");
            out.println("</select>");
            out.println("<li>登録したい概念");
            out.println("<input type=radio value=Concept name=button0>概念");
            out.println("<input type=radio value=method name=button0>");
            out.println("メソッド");
            out.println("<input type=radio value=class checked name=button0>");
            out.println("クラス");
            out.println("<li>対応URL");
            out.println("<input name=name0>");
            out.println("<li>注釈内容<br>");
            out.println("<textarea name=textarea0 rows=5 cols=50></textarea>");
            out.println("</ul><input type=submit value=\"堤出\">");
            out.println("</form>");

            out.println("</body></html>");
            out.close();

            rs.close();
            stmt.close();
            con.close();

        }catch(SQLException se){
            throw new ServletException("Cannot Connect Database. " +
                   "Please contact webmaster with the below message." +
                   "\nSQLException: " + se.getMessage() +
                   "\nSQLState: " + se.getSQLState() + 
                   "\nVendorError: " + se.getErrorCode());
        }finally{
            try{
                if(rs != null){
   	                rs.close();
                }
                if(stmt != null){
                    stmt.close();
                }
                if(con != null){
                    con.close();
                }
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
    }

    //doPostメソッド
    public void doPost(HttpServletRequest request,HttpServletResponse response)
        throws ServletException,IOException{

        Connection con = null;
        Statement stmt = null;

        response.setContentType("text/html; charset=Shift_JIS");

        try{
            con = DriverManager.getConnection(
                "jdbc:postgresql://サーバ名/データベース名", "ユーザ名","パスワード"
            );

            stmt = con.createStatement();

            //フォームからのパラメータ取得
            String form_select0 = request.getParameter("select0");
            String form_button0 = request.getParameter("button0");
            String form_name0 = request.getParameter("name0");
            //日本語文字コード対策
            String form_textarea0 = new String(
                request.getParameter("textarea0").getBytes("8859_1"),"SJIS"
            );

            //フォームのselect0が1の時は新規登録を行う。INSERT文の実行。
            if(form_select0.equals("1")){
            int count = stmt.executeUpdate("INSERT INTO t99xxxxx_tbl1"
                                       +" VALUES("
                                       +"'" + form_button0 + "',"
                                       +" '" + form_name0 + "',"
                                       +" '" + form_textarea0 + "')");
            }
            //フォームのselect0が2の時はレコードの更新。UPDATE文の実行。
            else if(form_select0.equals("2")){
                int count = stmt.executeUpdate("UPDATE t99xxxxx_tbl1 SET"
                                  +" textarea0 = '" + form_textarea0  + "'" 
                                  +" WHERE name0 = '" + form_name0 +  "'"
                                  +" AND button0 = '" + form_button0 + "'");
            }

            stmt.close();
            con.close();

        }catch(SQLException se){
            throw new ServletException("Cannot Connect Database. " +
                   "Please contact webmaster with the below message." +
                   "\nSQLException: " + se.getMessage() +
                   "\nSQLState: " + se.getSQLState() + 
                   "\nVendorError: " + se.getErrorCode());
        }finally{
            try{
                if(stmt != null){
                    stmt.close();
                }
                if(con != null){
                    con.close();
                }
            }catch(SQLException se){
                se.printStackTrace();
            }
        }
        doGet(request,response);
    }
}



解説

initメソッドのオーバーライド
サーブレットの基礎のとおり、initメソッドはプログラムのクラスファイルがサーブレットコンテナに読み込まれるときに実行される。ここではこのクラスの継承元のHttpServletクラスのinitメソッドにJDBCドライバを読み込ませる機能を追加させた。これはクライアントがブラウザからdoGetやdoPostを呼び出すたびにドライバを読み込みなおす必要はないからである。
doGetメソッド
doGetメソッドの役割は、

データベースとの接続 → SELECT文によるデータの取り出し&表示 → 投稿フォームの表示→データベースから切断

だけである。

doPostメソッド
doPostメソッドの役割は、

データベースとの接続 → フォームで送信されたパラメータの取得
→ フォームから取ってきたselect0(新規登録か更新かの選択)の値に応じたSQL文の実行 → データベースからの切断
→ doGetメソッドの呼び出し

である。

UPDATE文の実行
このUPDATE文の意味は、「form_select0とform_button0の両方の値が、t9935089_tbl1表のselect0列とbutton0列の値と一致するレコードのtextarea0列の値をform_textarea0の値に置き換えなさい」という意味である。WHERE条件はSELECT文でレコードを抽出するときにもよく使われる。



実行結果

こんな感じ




→サンプルコードその3
←もどる
ホームへ