Java開発環境構築8(挫折)

※Java開発環境構築7で「次はデータをデータベースに保存できるようにする。」と言ったが、結果的に実現できなかった。
理由は、MySQLがデフォルトでSSL接続を要求しているためだということはわかっている。試行錯誤の上、いったんあきらめることとした。
失敗に終わっている過程を示しておく。皆様に自分のスキル不足をお詫びする。申し訳ございません。

Java開発環境構築5に作成したデータベースmydbに、記事の保存用のtopicという名前のテーブルを作成する。

Enter password: hoge
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 8.0.21 MySQL Community Server – GPL

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

〇テーブルの作成
MySQLのクライアントを起動し、「USE mydb」でデータベースmydbを選択し、次のCREATE文を実行する。また動作確認用に1行データをINSERTしておく。

mysql> USE mydb;
Database changed
mysql> CREATE TABLE topic(
-> ID INTEGER NOT NULL AUTO_INCREMENT,
-> TITLE VARCHAR(100),
-> CONTENT VARCHAR(200),
-> POST_DATE TIMESTAMP NOT NULL,
-> PRIMARY KEY(ID)
-> );
Query OK, 0 rows affected (1.21 sec)

mysql> INSERT INTO topic(TITLE, CONTENT) VALUES(‘テスト’, ‘テストです’);
ERROR 1364 (HY000): Field ‘POST_DATE’ doesn’t have a default value
mysql>

「ERROR 1364」はMySQLのバージョンが変わったために起きたエラーなので、
設定ファイルを見つけようとしましたが、私には見つからず、ここでは

mysql> INSERT INTO topic(TITLE, CONTENT, POST_DATE) VALUES(‘テスト’, ‘テストです’, ‘2020-08-27 14:32:00’);
Query OK, 1 row affected (0.09 sec)

というように、仮の値を入れて対応してみた。

mysql> SELECT * FROM topic;
+—-+——–+————+———————+
| ID | TITLE | CONTENT | POST_DATE |
+—-+——–+————+———————+
| 1 | テスト | テストです | 2020-08-27 14:32:00 |
+—-+——–+————+———————+
1 row in set (0.03 sec)

mysql>exit

〇保存処理の追加
ここでは、Java開発環境構築7に作成した「SampleWeb0003」プロジェクトをコピー・ペーストして作業を進める。「パッケージ・エクスプローラー」ビュー上で、「SampleWeb0003」プロジェクトを右クリック→[コピー]する。そして、同ビュー上で右クリック→[貼り付け]する。プロジェクト名を「SampleWeb0004」として「コピー」を押す。

コンテキスト設定が「SampleWeb0003」プロジェクトと同じにならないよう、「SampleWeb0004」プロジェクト上で右クリック→[プロパティー]を選択し、「Webプロジェクトの設定」パネルで、「コンテキスト・ルート」を「SampleWeb0004」に変更する。

Webアプリケーションをサーバ上で動作させるために、このプロジェクトをWTPのサーバに設定する必要がある。「サーバー」ビューで「ローカル・ホストの Tomcat v9.0」サーバを選択し、右クリック→[追加および除去]を選択。次の画面で使用可能なプロジェクトの「SampleWeb0004」を選択し、「追加」ボタンを押す。「完了」を押して画面を閉じる。この操作を行わないと、このWEBアプリケーションは動作しないので、注意する。

〇変更するファイルの概要
「SampleWeb0004」プロジェクトに変更・追加するファイルは「JDBCドライバ」と「データベースとの接続処理を行うクラス」と「保存処理を追加するクラス」となる。

〇JDBCドライバの配置
「C:\Program Files (x86)\MySQL\Connector J 5.1\mysql-connector-java-5.1.49-bin.jar」をコピーし、「SampleWeb0004/WebContent/WEB-INF/lib」以下に配置する。

〇ConnectionManager.java
Java開発環境構築6で作成したものと同じで、パッケージ名だけ、「hoge」から「blog」となる。

package blog;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
* シンプルなコネクション管理クラス
*/
public class ConnectionManager {
/**
* JDBCドライバのクラス名
*/
final static String DRIVER = “com.mysql.jdbc.Driver”;

/**
* データベースのURL
*/
final static String URL = “jdbc:mysql://localhost/mydb”;

/**
* データベースのユーザー
*/
final static String USER = “root”;

/**
* データベースのパスワード
*/
final static String PASS = “hoge”;

/**
* Connectionを取得
*/
public static Connection getConnection()
throws SQLException {
try{
Class.forName(DRIVER);
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new IllegalStateException (
“fail to class load :”
+ e.getMessage());
}
Connection con = DriverManager.getConnection(URL, USER, PASS);
return con;
}
}

〇BlogControllerクラスの変更
Listでtopicsを保持するのをやめ、DBに保持してアクセスする。postTopic()メソッドとgetTopics()メソッドの中が大きく変わっている。

変更後のBlogController.java

package blog;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
// import java.util.Date;
import java.util.List;

/**
* Blogを操作するビジネスロジック
*/
public class BlogController {

/**
* シングルトンのインスタンス
*/
private static BlogController controller = new BlogController();

/**
* このクラスのインスタンスを取得
* @return BlogControllerのインスタンス
*/
public static BlogController getInstanse(){
return controller;
}
private BlogController(){
}

/**
* トピックをポスト(登録)する
* @param topic トピック
*/
public void postTopic(Topic topic){
String sql = “INSERT INTO TOPIC(TITLE, CONTENT)”
+ ” VALUES(” + “‘” + topic.getTitle() + “‘”
+ “,'” + topic.getContent() + “‘” + “)”;
Connection con = null;
Statement smt = null;
try{
con = ConnectionManager.getConnection();
smt = con.createStatement();
smt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (smt != null){
try {
smt.close();
} catch (Exception ignore) {
}
}
if (con != null){
try {
con.close();
} catch (Exception ignore) {
}
}
}
}

/**
* 全部のトピックを取得する
* @return トピックのリスト
*/
public List<Topic> getTopics() {
String sql = “SELECT * FROM TOPIC”;
List<Topic> topics = new ArrayList<Topic>();

Connection con = null;
Statement smt = null;
ResultSet rs = null;
try{
con = ConnectionManager.getConnection();
smt = con.createStatement();
rs = smt.executeQuery(sql);
while (rs.next()) {
Topic topic = new Topic();
topic.setId(rs.getInt(“ID”));
topic.setPostDate(rs.getTimestamp(“POST_DATE”));
topic.setTitle(rs.getString(“TITLE”));
topic.setContent(rs.getString(“CONTENT”));
topics.add(topic);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception ignore) {
}
}
if (smt != null) {
try {
smt.close();
} catch (Exception ignore) {
}
}
if (con != null) {
try {
con.close();
} catch (Exception ignore) {
}
}
}
return topics;
}
public static void main (String[] args) {
BlogController ctrl = BlogController.getInstanse();
List <Topic> topics = ctrl.getTopics();
for (int i = 0; i < topics.size(); i++) {
System.out.println(topics.get(i));
}
System.out.println(“END”);
}
}

動作確認用にmainメソッドを組み込んである。BlogController.javaを実行してみる。Eclipse上で、「””」が「””」と認識されたり、BlogController.javaの111行目のgetInstance()が正しく認識されないことや、PostServlet.javaやReadServlet.javaのgetInstance()正しく認識されないことがあったが、訂正した。また、index.jspやread.jspの文字列「掲示板」を「シンプルBlog」に訂正した。

〇Tomcatを再起動し、
http://localhost:8080/SampleWeb0004/index.jsp
にアクセスしてみる。

タイトルに「テスト2」
記事に「DBに残るか、テスト」
とし、投稿ボタンを押す。
しかし、記事は投稿できない。

【参考文献】
JavaデベロッパーのためのEclipse完全攻略[4.x対応版]
石黒 尚久 (著), 永井 正昭 (著), テクニカル書籍編集部 (著)

〇何とか、進めてみる。
https://qiita.com/KOJI-YAMAMOTO/items/55c2b08357082a72cda3 参照
「C:\eclipse\tmp」を作っておく。
「C:\WINDOWS\system32>cd C:\Program Files\Java\jdk-14.0.2\bin」の中に、「keytool.exe」が格納されていることを確認して、コマンドプロンプトを起動し、カレントディレクトリをJavaインストールフォルダ\binに移動し、
keytool -genkey -alias tomcat -keyalg RSA -keystore C:\eclipse\tmp\.keystore
を実行する。
***********************************************************
C:\Program Files\Java\jdk-14.0.2\bin>keytool -genkey -alias tomcat -keyalg RSA -keystore C:\eclipse\tmp\.keystore
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
姓名は何ですか。
[Unknown]: test
組織単位名は何ですか。
[Unknown]: test
組織名は何ですか。
[Unknown]: test
都市名または地域名は何ですか。
[Unknown]: tokyo
都道府県名または州名は何ですか。
[Unknown]: tokyo
この単位に該当する2文字の国コードは何ですか。
[Unknown]: 81
CN=test, OU=test, O=test, L=tokyo, ST=tokyo, C=81でよろしいですか。
[いいえ]: はい
90日間有効な2,048ビットのRSAのキー・ペアと自己署名型証明書(SHA256withRSA)を生成しています
ディレクトリ名: CN=test, OU=test, O=test, L=tokyo, ST=tokyo, C=81
C:\Program Files\Java\jdk-14.0.2\bin>
***********************************************************
作成したkeystoreファイルを適当なフォルダに配置する。
tomcatフォルダ配下にsslフォルダを作成してその中に格納する。
C:\eclipse\Tomcat\ssl

「server.xml」をテキストエディタで開く。
C:\eclipse\Tomcat\conf\server.xml

77行目に以下を記述する。
*****************************
<Connector
protocol=”org.apache.coyote.http11.Http11NioProtocol”
port=”8443″
maxThreads=”200″
scheme=”https”
secure=”true”
SSLEnabled=”true”
keystoreFile=”C:/eclipse/Tomcat/ssl/.keystore”
keystorePass=”hogehoge”
clientAuth=”false”
sslProtocol=”TLS”
/>
*****************************

tomcatを起動してhttpsでアクセスする。
https://localhost:8443/

※証明書不正のメッセージが表示されるが、そのまま続行する。
「詳細設定」ボタン→「localhost にアクセスする(安全ではありません)」をクリックする。Tomcatの画面が表示されれば、TomcatでのSSLを有効にする手順は完了。

「サーバー」ビューの下記リンクを右クリックし、削除する。
あらたにできた、下記リンクをクリックする。
「新規サーバー」ダイアログボックスが表示されたら、「サーバーのタイプを選択(S)」欄の「Apache」フォルダーから、先に準備した「Tomcat v9.0」を選択し、「サーバーのホスト名(H)にサーバー名入力(ここではデフォルトの「localhost」)して、「完了(F)」ボタンをクリックする。

Mon Aug 31 06:17:02 JST 2020 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

どうしても、MySQLがSSL接続を要求するために、現時点で、
https://localhost:8443/dbblog/
https://localhost:8443/dbblog/read
が表示されるが、MySQLとの接続ができていないので、
https://localhost:8443/dbblog/post
には、記事が残らない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です