PostgreSQLにJDBCで接続するJavaサーブレットをTomcat上で動かす

Java
スポンサーリンク

JavaのサーブレットからPostgreSQLのデータを取得して、 HTMLのテーブルとして出力してみました。JavaサーブレットはTomcatで動かして、PostgreSQLはDockerで構築します。

PostgreSQLに接続するJavaサーブレットの作成

1. プロジェクトを作成

% mvn archetype:generate -DgroupId=com.example -DartifactId=jdbc-sample -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

mavenのコマンドでjdbc-sampleという名前のプロジェクトを作成します。
-DarchetypeArtifactIdにはmaven-archetype-webappを指定します。

作成したプロジェクトのフォルダ構成は下のようになると思います。

.
├── pom.xml
└── src
    └── main
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

2. 依存ライブラリ情報を追加

pom.xmlのdependenciesにjakarta.servlet-apiとpostgresqlドライバーを追加します。

<dependencies>
  <dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
  </dependency>
  <dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.3.1</version>
  </dependency>
</dependencies>

pluginsにmaven-war-pluginを追加します。

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>3.3.2</version>
  </plugin>
</plugins>

Javaのバージョンには11を指定しました。

<properties>
  <java.version>11</java.version>
  <maven.compiler.target>${java.version}</maven.compiler.target>
  <maven.compiler.source>${java.version}</maven.compiler.source>
</properties>

全体は以下のような感じです。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>jdbc-sample</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>jdbc-sample Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>jakarta.servlet</groupId>
      <artifactId>jakarta.servlet-api</artifactId>
      <version>5.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>42.3.1</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>jdbc-sample</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
      </plugin>
    </plugins>
  </build>
  <properties>
    <java.version>11</java.version>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <maven.compiler.source>${java.version}</maven.compiler.source>
  </properties>
</project>

3. Javaサーブレットの作成

src/main/java/com/example配下にDBServlet.javaを作成します。

.
├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           └── DBServlet.java
        ├── resources
        └── webapp
            ├── WEB-INF
            │   └── web.xml
            └── index.jsp

サーブレットでは、DBのデータを取得してHTMLのテーブルで出力します。

package com.example;

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

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

@SuppressWarnings("serial")
public class DBServlet extends HttpServlet {
    static final String DB_URL = "jdbc:postgresql://localhost:5432/docker";
    static final String DB_USER = "user";
    static final String DB_PASS = "pass";
    static final String QUERY = "SELECT id,name FROM book";

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        response.setContentType("text/html; charset=UTF-8");
        try {
            Class.forName("org.postgresql.Driver");
            try(Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
                Statement stmt = conn.createStatement();
                ResultSet rs = stmt.executeQuery(QUERY);
                PrintWriter pw = response.getWriter();) {
                pw.println("<html>");
                pw.println("<head><title>show table</title></head>");
                pw.println("<body><table border=1>");
                pw.println("<tr><th>id</th><th>name</th></tr>");
                while (rs.next()) {
                    pw.println("<tr>");
                    pw.println("<td>" + rs.getInt("id") + "</td>");
                    pw.println("<td>" + rs.getString("name") + "</td>");
                    pw.println("</tr>");
                }
                pw.println("</table></body>");
                pw.println("</html>");
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}

dockerというDBに接続して、bookテーブルからidとnameのカラムデータを取得します。

4. web.xmlにサーブレットを設定

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>DBServlet</servlet-name>
    <servlet-class>com.example.DBServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DBServlet</servlet-name>
    <url-pattern>/DBServlet</url-pattern>
  </servlet-mapping>
</web-app>

DBServletを次のURLで呼び出すことができるように設定します。

http://localhost:8080/jdbc-sample/DBServlet

5. DBの起動

今回は、DockerでPostgreSQLのコンテナを立ち上げて、初期セットアップでデータを登録します。

こちらの記事で作成したDBを使用します。

6. Tomcatで起動して動作チェック

どんな方法でもいいのですが、今回はEclipseでTomcatにデプロイします。

ServersにTomcat10を登録して、Add and Removeから今回作成したプロジェクトjdbc-sampleをConffiguredに追加します。

StartでTomcatを起動して、次のURLにアクセスできること確認します。

http://localhost:8080/jdbc-sample/DBServlet

DBのデータがHTMLのテーブルで出力されればOKです。

以上。終わりです。

↓↓Javaの基本はこの1冊でマスターできる!!↓↓

コメント

タイトルとURLをコピーしました