2020/10/30 Updated by

Tomcat: JDBC

サーブレットからデータベースにアクセスをする


[Up] Japanese English

[前提条件]

データベースについて
java環境について

Tomcat の webapps 'entry' 内のサーブレットにMariaDBデータベースサーバにアクセスする機能を追加する

  1. MariaDBの公式サイト https://mariadb.com/kb/en/about-mariadb-connector-j/ から、MariaDB用jarファイルをダウンロードする。
  2. MariaDB用 jar ファイルを、開発するWebapps(今の例では entry)の WEB-INF/lib/の下に配置する。これはそのwebアプリケーションに含まれるサーブレットが動作した時にMariaDBデータベースにアクセスするのに必要な設定である。
  3. Tomcatが C:\Users\nitta\Documents\tomcat8\ にインストールされていて、 entry というwebapps 内のサーブレットでMariaDBデータベースにアクセスする場合は 以下の場所に mariadb-java-client-version.jar を配置する。

        tomcatのパス:            C:\Users\nitta\Documents\tomcat8
        webapps 'entry' のパス:  C:\Users\nitta\Documents\tomcat8\webapps\entry
        connector/J のパス:      C:\Users\nitta\Documents\tomcat8\webapps\entry\WEB-INF\lib\mariadb-java-client-2.7.0.jar
    
  4. MariaDB用jarファイルへのパスが、CLASSPATH環境変数に含まれていることを確認する。これはサーブレットのソースファイル .java をコンパイルして .classファイルを生成するために必要な設定である。
  5. システムの詳細設定 → システムのプロパティ → 環境変数 → 「システム環境変数」に対して「新規」または「編集」 → 「CLASSPATH」変数に ';' でつないで(フォルダまたはjarファイルへの)パスを指定する。複数の値を設定する場合は ; でつないで表現する。先頭に . (カレントディレクトリを表す)を必ず含めておくこと。

        変数名: CLASSPATH
        変数値: .;C:\Users\nitta\Documents\java\lib\mariadb-java-client-2.7.0.jar;C:\xampp\tomcat\lib\servlet-api.jar
    

掲示板サーブレットを作成する

データベースを利用した掲示板サーブレットを作成する。 基本的な動作は以下の通り。

  1. データベースと接続する。
  2. URLのパラメータの処理
  3. もしもform文で入力したパラメータがあれば、データベースに 送って記憶する。

  4. データベースからデータを読み込んで、(もしあれば)表示する。
  5. form文を出力する
  6. データベースと切断する。

緑色の文字の部分 は自分の環境に合わせて書き換えること。

[ファイルの置き場所]
  ${CATALINA_HOME}/entry/webdb/WEB-INF/src/TinyBBS.java
${CATALINA_HOME}/webapps/entry/WEB-INF/src/TinyBBS.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.sql.*;

@WebServlet(name="TinyBBS",urlPatterns={"/TinyBBS"})
public class TinyBBS extends HttpServlet {
    String host="localhost";
    String db = "nittaDB";
    String user = "nitta";
    String pass = "PasswordOfNitta";
    String tbl = "article";
    String url=null;
    Connection con=null;
    Statement st=null;
    String selectSql = "insert into "+tbl
	+" (cdate,title,uname,contents) values(now(),?,?,?)";
    PreparedStatement pst=null;
	String insertSql = "insert into "+tbl
	    +" (cdate,title,uname,contents) values(now(),?,?,?)";

    public void doGet(HttpServletRequest request,
		      HttpServletResponse response) 
	throws ServletException, IOException {
	request.setCharacterEncoding("utf-8");
	response.setContentType("text/html; charset=utf-8");
	PrintWriter out= response.getWriter();
	StringBuffer sb = new StringBuffer();
	sb.append("<html><body><h2>TinyBBS</h2>");

	try {
	    Class.forName("org.mariadb.jdbc.Driver");
	    url = "jdbc:mysql://"+host+"/"+db
		+"?useUnicode=true&characterEncoding=utf8";
	    con = DriverManager.getConnection(url,user,pass);
	    st = con.createStatement();
	    pst = con.prepareStatement(insertSql);
	} catch (Exception e) {
	    e.printStackTrace();
	    try{
		Thread.sleep(60000);
	    } catch(InterruptedException ee) {}
	    System.exit(1);
	}

	String titleParam = request.getParameter("title");
	String unameParam = request.getParameter("uname");
	String contentsParam = request.getParameter("contents");
	if (titleParam!=null && unameParam!=null && contentsParam!=null) {
	    try {
		pst.setString(1,titleParam);
		pst.setString(2,unameParam);
		pst.setString(3,contentsParam);
		pst.executeUpdate();
		sb.append("<p>posted</p>\n");
	    } catch (Exception e) {
		e.printStackTrace();
	    }
	}

	try {
	    ResultSet rs = st.executeQuery("select * from "+tbl);
	    while (rs.next()) {
		int id = rs.getInt("id");
		java.util.Date cd = rs.getDate("cdate");
		String ti = rs.getString("title");
		String un = rs.getString("uname");
		String co = rs.getString("contents");
		sb.append("<p>"+id+":"+cd+":"+ti+"["+un+"]<br />\n");
		sb.append(co+"</p>\n");
	    }
	} catch (Exception e) {
	    e.printStackTrace();
	}

	try {
	    if (pst != null) { pst.close(); pst = null; }
	    if (con != null) { con.close(); con = null; }
	} catch (Exception e) {}


	sb.append("<form action=\""
		  + request.getRequestURI() +"\">");
	sb.append("title: <input type=\"text\" name=\"title\">\n");
	sb.append("name: <input type=\"text\" name=\"uname\"><br />\n");
	sb.append("contents:<br />\n");
	sb.append("<textarea name=\"contents\" cols=\"70\" rows=\"7\">\n");
	sb.append("</textarea><br />\n");
	sb.append("<input type=\"submit\" value=\"Send\">\n");
	sb.append("<input type=\"reset\" value=\"Reet\">\n");
	sb.append("</form>\n");
	out.print(sb.toString());
    }
}
TinyBBS.javaのコンパイル
> cd %CATALINA_HOME%  
> cd webapps/entry/WEB-INF  
> javac -encoding utf8 src\TinyBBS.java -d classes -sourcepath src  



[注意] 新しいサーブレットをアノーテーションで追加した場合は、tomcatを再起動する必要がある。 また、このサーブレットを動作させるときは MariaDBデータベースを動作させておくこと (MariaDBが動作していないとTomcatがエラーで異常終了してしまう)。

[ブラウザでアクセスするURL]
  http://localhost:8080/entry/TinyBBS