JSP,SevletとからPostgreSQLをアクセス

apache-antとPostgresqlのインストール

apache-ant-1.5.4-bin.tar.bz2とpostgresql-7.3.4.tar.gzをDownload
$ cd /usr/local/src
$ tar jxvf apache-ant-1.5.4-bin.tar.bz2
$ su
# mv apache-ant-1.5.4 /usr/local/
# exit
$ tar postgresql-7.3.4.tar.gz

postgresというユーザを作成

$ su postgres

.bash_profileに以下の内容を追加

# PostgreQSL
export PATH="$PATH":/usr/local/pgsql/bin
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"

ANT_HOME=/usr/local/apache-ant-1.5.4
PATH=$PATH:$ANT_HOME/bin
export ANT_HOME PATH

export JAVA_HOME=/usr/local/java
export CATALINA_HOME=/usr/local/jakarta-tomcat
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
export classpath=".:/usr/local/pgsql/share/java/postgresql.jar"


$ source .bash_profile

$ su
# cd /usr/local/src
# chown -R postgres.postgres postgresql-7.3.4
# mksir /usr/loca/pgsql
# chown -R postgres.postgres /usr/loca/pgsq
# exit 
$ cd /usr/local/src/postgresql-7.3.4
$ ./configure --enable-multibyte=EUC_JP --with-java
$ make
$ make install
$ /usr/local/pgsql/bin/initdb
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale ja_JP.eucJP.
This locale setting will prevent the use of indexes for pattern matching
operations.  If that is a concern, rerun initdb with the collation order
set to "C".  For more information see the Administrator's Guide.

creating directory /usr/local/pgsql/data... ok
creating directory /usr/local/pgsql/data/base... ok
creating directory /usr/local/pgsql/data/global... ok
creating directory /usr/local/pgsql/data/pg_xlog... ok
creating directory /usr/local/pgsql/data/pg_clog... ok
creating template1 database in /usr/local/pgsql/data/base/1... ok
creating configuration files... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
initializing pg_depend... ok
creating system views... ok
loading pg_description... ok
creating conversions... ok
setting privileges on built-in objects... ok
vacuuming database template1... ok
copying template1 to template0... ok

Success. You can now start the database server using:

    /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
or
    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start



$ cd /usr/loca/pgsq/data

pg_hba.confで
  
  host   all   all	0.0.0.0    0.0.0.0    trust

を追加

さらに、このバージョンではポート5432がデフォルトで開かないため
postgresql.confで

tcpip_socket = true

のコメントをはずす。

# cd /usr/local/java/jre/lib/ext
# ln -s /usr/local/pgsql/share/java/postgresql.jar

起動は

/usr/local/pgsql/bin/pg_ctl -w start


/etc/rc.d/rc.localに
su - postgres -c "/usr/local/pgsql/bin/pg_ctl -w start"
を記述するとシステム起動時起動する。

動作確認

データベースの作成

$ createdb jtest

ファイル t_data.create

create table t_data
(
        No      varchar(8),
        ename   varchar(32),
        name    varchar(32)
);

ファイル t_data.csv

1,tanaka,田中良明
2,yamada,山田太郎
3,matsusaka,松阪花子

という2つのファイルを作成し、

$ psql jtest < t_data.create
$ psql jtest
jtest=#  copy t_data from'/home/postgres/jtest/t_data.csv' using delimiters ',';

jtest=# select * from t_data;
 no |   ename   |   name
----+-----------+----------
 1  | tanaka    | 田中良明
 2  | yamada    | 山田太郎
 3  | matsusaka | 松阪花子
(3 rows)

jtest=# \q

javaで動作確認


PostgreSQLのJDBCドライバでは、ResultSetで取得する
データは全てbyte型の2次元配列で取り出してます。
文字列型のデータは、byte型で取り出したデータを元に
Stringクラスを生成しています。この時、byte型データ
に格納されている2バイトコードの文字エンコーディング
が何かという事を、PostgreSQLのJDBCドライバ側では全く
考慮されいません。
Stringクラスを利用してbyte 型配列をくっつけて、一つ
の文字列にする。


文字コードは

String(バイトコード, "文字符号名")

で指定する

文字符号名 --> 通称
EUCJIS     --> Japanese EUC
JIS        --> JIS
SJIS       --> PC and Windows Japanese
UTF8       --> Standard UTF-8

等がある。

このとき、データベースアクセスには

try {

} catch(SQLException e) {

} catch (Exception e) {

}

又は

try {

} catch(Throwable t) {

}


でアクセスする必要がある(理由は不明)
そうしないとコンパイルすら通らない。


以下のファイルを作成

jtest.java

import java.sql.*;
import java.io.*;

public class jtest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement  stat = null;
        ResultSet  rset = null;
        String     sql  = null;
        //        String     url  = "jdbc:postgresql:jtest";
        String     url  = "jdbc:postgresql://localhost/jtest";

        try {
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection(url,"postgres","");
            stat = conn.createStatement();
            sql  = "select * from t_data";
            rset = stat.executeQuery(sql);

            while (rset.next()) {
                //データが整数の処理
                int no  = rset.getInt("No");
                //データが半角の処理
                String ename = rset.getString("ename");
                //データが全角の処理
                String name = new String(rset.getBytes("name"),"EUCJIS");
                System.out.println("VALUES = " + no + "\t" + ename + "\t" + name
);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rset != null) rset.close();
                if (stat != null) stat.close();
                if (conn != null) conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
}

コンパイル

$ javac jtest.java

$ java jtest
VALUES = 1      tanaka  田中良明
VALUES = 2      yamada  山田太郎
VALUES = 3      matsusaka       松阪花子

で動作確認

JSPで動作確認

このとき作成者はismでPostgresqlのユーザはデフォルトのpostgres
しか登録の必要はない。(JSP,Servlet共)

JSPで動作確認

/usr/local/jakarta-tomcat/webapps/ismの下にjspファイルがおける
場合に以下の jtest.jspを作成する。

<%@page contentType="text/html; charset=EUC-JP"%>
<html>
<head><title>PostgreSQL TEST</title></head>
<body>
<%@page import="java.sql.*"%>
<h1>PostgreSQL アクセステスト</h1>
<%
    Class.forName("org.postgresql.Driver");
    String url = "jdbc:postgresql://localhost/jtest";
    Connection con = DriverManager.getConnection(url,"postgres","");
    Statement stmt = con.createStatement();
    ResultSet rset = stmt.executeQuery("select * from t_data");
    while(rset.next()){
        int no  = rset.getInt("No");
        String ename = rset.getString("ename");
        String name = new String(rset.getBytes("name"), "EUCJIS");
        out.println(no + ":" + ename + ":" + name + "<br>");
    }
%>
</body>
</html>

http://(サーバ名):8080/ism/jtest.jsp
or
http://(サーバ名)/ism/jtest.jsp(Apacheとの連携ができているとき)

でアクセス。

Servletで確認(無名サーブレットで)

/usr/local/jakarta-tomcat/webapps/ism/WEB-INF/classes
にjTest.javaを作成し、コンパイル。

import java.io.*;
import java.text.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class jTest extends HttpServlet
{
    private Connection handler;
    public void init(ServletConfig conf) throws ServletException {
        String url    = "jdbc:postgresql://localhost/jtest";
        String user   = "postgres";
        String passwd = "";
        try{
            Class.forName("org.postgresql.Driver");
            handler = DriverManager.getConnection(url, user, passwd);
        }
        catch (Exception ex){
            throw new ServletException("JDBC Error");
        }
    }

    public void doGet (HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException
    {
        try{
            Statement   stat  = handler.createStatement();
            String      query ="select * from t_data";
            ResultSet   rs    = stat.executeQuery(query);
            res.setContentType("text/html; charset=EUC-JP");
            PrintWriter out   = res.getWriter();
            out.println("<html>");
            out.println("<head>");
            out.println("<title>PostgreSQL Test</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<center><h1>PostgreSQL Test(Sevlet)</h1>");
            out.println("<table border=\"1\">");
            out.println("<tr><td>項番</td><td>Name</td><td>氏名</td></tr>");
            while(rs.next()){
                int no  = rs.getInt("No");
                String ename = rs.getString("ename");
                String name = new String(rs.getBytes("name"), "EUCJIS");
                out.println("<tr><td>" + no + "</td><td>" + ename + "</td><td>"
+ name + "</td></tr>");
            }
            out.println("</table>");
            out.println("</body>");
            out.println("</html>");
            stat.close();
        }
        catch (Exception ex){
            PrintWriter out = res.getWriter();
            out.println("<html><head>");
            out.println("<title>PostgreSQL_Servlet error</title>");
            out.println("</head>");
            out.println("<body>");
            out.println(ex.getMessage());
            out.println("</body></html>");
            return;
        }
    }
}

$ javac jTest.java

(このときユーザの環境変数は.bash_profileに設定しておき
読み込ませておこうこと)

アクセスは

http://(サーバ名):8080/ism/servlet/jTest
or
http://(サーバ名)/ism/servlet/jTest(Apacheとの連携ができているとき)

                        2003/09 DE JE2ISM

サンプル

JSPで Postgresqlをアクセス(DBはリモート)
ServletでPostgresqlをアクセス(DBはリモート)