Java」カテゴリーアーカイブ

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
には、記事が残らない。

Java開発環境構築7

※以下はJava開発環境構築1~6が終わった前提で話を進めている。

掲示板の作成

トップ画面と閲覧・投稿画面はJSPで作成し、トップ画面の「記事を読む」というリンクからのリクエストを受け取る閲覧サーブレットと閲覧・投稿画面の「投稿」ボタンからのリクエストを受け取る投稿サーブレットを作る。また、掲示板の1つの記事を保存するための(モデル)クラスと、そのデータとサーブレットとの間を取り持つ(コントローラ)クラスを作成する。SampleWeb0002と同じ手順でプロジェクトを作成する。
プロジェクトの種類は「動的Webプロジェクト」
名前は「SampleWeb0003」

〇「プロジェクト・エクスプローラー」ビューで、SampleWeb0003プロジェクトを選択、右クリック→[新規]→[サーブレット]を選択。次の画面で、
Javaパッケージ「blog」
クラス名「Topic」
と入力し、「完了」ボタンを押す。
掲示板の1記事を保存するための(モデル)クラスTopic.javaを作成する。
これは以下のプロパティー(フィールドおよび対応するセッタ・ゲッタ)を持つ単純なJavaクラスである。
・id 連番
・title タイトル
・content 内容
・postDate 投稿日時

Topic.java

package blog;

import java.util.Date;

/**
* トピックのビーン
*/
public class Topic {

/** 連番 */
private int id;
/** タイトル */
private String title;
/** 内容 */
private String content;
/** 投稿日 */
private Date postDate;

public String toString(){
return super.toString()
+ “,id=” + id
+ “,title=” + title
+ “,content=” + content
+ “,postDate=” + postDate
;
}

//
//単純なセッタ・ゲッタ
//
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getPostDate() {
return postDate;
}
public void setPostDate(Date postDate) {
this.postDate = postDate;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}

〇ビジネスロジックを書く
掲示板を処理するメインとなるコントローラクラスを作成する。このクラスでは、
・掲示板の一覧を取得する
・掲示板を投稿する
というビジネスロジックとなるメソッドを定義している。このクラスはnewが不要な唯一のインスタンスとなる、シングルトンクラスとして作っている。

BlogController.java

package blog;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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

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

/**
* 連番用のカウンタ
*/
private int idCounter;

/**
* 掲示板のリスト
*/
private List<Topic> topics = new ArrayList<Topic>();

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

private BlogController(){
}

/**
* トピックをポスト(登録)する
* @param topic トピック
*/
public void postTopic(Topic topic){
synchronized(this){
topic.setId(idCounter++);
topic.setPostDate(new Date()); //現在時間
topics.add(topic);
}
}

/**
* 全部のトピックを取得する
* @return トピックのリスト
*/
public List<Topic> getTopics() {
return new ArrayList<Topic>(topics);
}
}

〇サーブレットを作成する
次にユーザーからのリクエストを受け付けるサーブレットを作成する。ReadServletではトピックの一覧を取得し、リクエストスコープにtopicというキーで取得したデータをセットしている。画面遷移先は、/read.jsp
サーブレットのURLへのマッピングはweb.xmlファイルを使わずに、今まで同様@WebServletアノテーションで行う。

ReadServlet.java

package blog;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* トピックを購読するサーブレット
*/
@WebServlet(name = “read”, urlPatterns = “/read”)
public class ReadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
perform(request, response);
}

protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
perform(request, response);
}

protected void perform(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
BlogController ctrl = BlogController.getInstance();
List<Topic> topics = ctrl.getTopics();

request.setAttribute(“topics”, topics);

request.getRequestDispatcher(“/read.jsp”).
forward(request, response);
}
}

〇もう1つのPostServletでは、「投稿」ボタンのリクエストにより送られてくるデータからトピックを作成し投稿処理を行っている。その後、ReadServletにディスパッチ(遷移)している。

PostServlet.java

package blog;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* トピックの投稿を行うサーブレット
*/
@WebServlet(name = “post”, urlPatterns = “/post”)
public class PostServlet extends HttpServlet {

protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
perform(request, response);
}

protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
perform(request, response);
}

protected void perform(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String title = request.getParameter(“title”);
String content = request.getParameter(“content”);
Topic topic = new Topic();
topic.setTitle(title);
topic.setContent(content);
BlogController ctrl = BlogController.getInstance();
ctrl.postTopic(topic);
request.getRequestDispatcher(“/read”).
forward(request, response);
}
}

〇JSPファイルのテンプレートを日本語対応に設定する
アプリの画面表示内容を受け持つJSPを作成する。JSPファイルを作成するにあたって、テンプレートを利用できるが、デフォルトの設定では日本語の文字コードが使えるようになっていない。Eclipseでの設定を変更することにより対応できるので、まずこの設定を行う。
Eclipseのメニューから[ウィンドウ]→[設定]を選ぶと設定画面が表示されるので、左のリストから「Web」→「JSPファイル」を選ぶ。右側の設定画面の「エンコード」項目を「ISO 10646/Unicode(UTF-8)」に変更する(デフォルトでは「ISO Latin-1」になっている)。これで日本語(UTF-8)に対応したテンプレートが使えるようになる。

〇JSPを作成する
JSPを作成していく。index.jspはトップ画面。単に「掲示板を読む」という閲覧画面(ReadServlet)へのリンクがあるだけである。
「プロジェクト・エクスプローラー」ビューでSampleWeb0003プロジェクトのWebContentを選択し、右クリック→[新規]→[JSPファイル]を選択。次の画面でファイル名(index.jsp)を入力し「完了」を押す。表示されるJSPファイルの内容はUTF-8に対応したものとなっている。

index.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=”UTF-8″>
<title>掲示板を読む</title>
</head>
<body>
<a href=”read”>掲示板を読む</a>
</body>
</html>

同様に、投稿と閲覧を兼用しているread.jspを作成する。画面上の方に投稿用のフォームがあり、「投稿」ボタンを押してサブミットすると、PostServletが呼ばれる。画面の下の方には、ReadServletでセットされたトピックを取得し、一覧表示している。

read.jsp

<%@ page language=”java” contentType=”text/html; charset=UTF-8″
pageEncoding=”UTF-8″%>
<%@ page import=”blog.Topic,java.util.List”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=”UTF-8″>
<title>掲示板</title>
</head>
<body>
<h2>掲示板</h2>
<a href=”read”>リロード</a>
<form action=”post” method=”POST”>
<br> タイトル<input type=”text” name=”title” size=”40″>
<br>
<textarea name=”content” rows=”5″ cols=”40″></textarea>
<br> <input type=”submit” value=”投稿”>
</form>
<%
List<Topic> topics = (List<Topic>) request.getAttribute(“topics”);
if (topics != null) {
for (int i = topics.size() – 1; i >= 0; i–){
Topic topic = topics.get(i);
%>
<hr>
タイトル:<%=topic.getTitle()%>
(<%=topic.getPostDate()%>)
<pre><%=topic.getContent()%></pre>
<%
}
}
%>
</body>
</html>

〇エンコードフィルタ
基本的なプログラムはできたが、このままだと日本語が文字化けして表示されてしまう。これを回避し日本語のリクエストを正しく受け付けるために、エンコードフィルタのクラスを作成する。ここでは文字コードをUTF-8固定にしている。
フィルタとしてサーバから呼び出されるよう、クラスにWebFilterアノテーションを付加している。

EncordingFilter.java

package blog;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
* リクエストエンコード用フィルタ
*/
@WebFilter(filterName = “EncordingFilter”, urlPatterns = {“/*”})

public class EncordingFilter implements Filter {
public void init (FilterConfig config)
throws ServletException {
}

public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException{
request.setCharacterEncoding(“UTF-8”);
chain.doFilter(request, response);
}

@Override
public void destroy(){
}
}

〇次に「サーバー」ビューでTomcat 9サーバを選択し、右クリック→[追加および除去]を選択。次の画面で使用可能なプロジェクトのSampleWeb0003を選択し、「追加」ボタンを押す。「完了」を押して画面を閉じる。

〇Tomcatを再起動し、
http://localhost:8080/SampleWeb0003/index.jsp
にアクセスしてみる。
閲覧・投稿画面でタイトルと内容を書き込み、「投稿」ボタンを押すと画面の下にそれらの情報が追加で表示されていくのがわかる。
しかし、現状では投稿されたデータをメモリ上に保持しているため、Tomcatを再起動するとデータが消えてしまう。次はデータをデータベースに保存できるようにする。

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

Java開発環境構築6

※以下はJava開発環境構築1~5が終わった前提で話を進めている。

JavaプログラムからMySQLとの接続

〇Javaアプリケーションから、MySQLにJDBCを利用してアクセスするにはJDBCドライバが必要。

〇JDBCドライバは以下の場所に配置されている。
C:\Program Files (x86)\MySQL\Connector J 5.1\mysql-connector-java-5.1.49-bin.jar

〇これをSampleWeb0002プロジェクトのWebContent/WEB-INF/libフォルダにコピーする。(Javaリソース/ライブラリー/Web AppライブラリーフォルダにもJDBCドライバが追加されているはず)

〇接続用クラスの作成
データベースと接続し、コネクションを取得するクラスを作成。mainメソッドも作成し、それを使って実際にデータを取り出すテストをしてみる。
SampleWeb0002プロジェクトのJavaリソース/srcのhogeパッケージに新規クラスConnectionManagerを以下のように作成する。

〇ConnectionManager
package hoge;

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;
}

/**
* 接続確認テスト
*/
public static void main(String[] args) throws SQLException {
Connection con = getConnection();
Statement smt = con.createStatement();
ResultSet rs = smt.executeQuery(“select * from account”);
while(rs.next()){
String s = “NAME=” + rs.getString(“NAME”)
+ “,MONEY=” + rs.getString(“MONEY”) ;
System.out.println(s);
}
smt.close();
con.close();
System.out.println(“END”);
}
}

〇接続確認のためにJSPからデータベースにアクセスする。
select_sample.jspという名前のファイルをWebContent直下に作成する。

<%@page contentType="text/plain; charset=Windows-31J"%>
<%@page import="hoge.ConnectionManager, java.sql.*"%>
<% try{ Connection con = ConnectionManager.getConnection(); Statement smt = con.createStatement(); ResultSet rs = smt.executeQuery("select * from account"); while(rs.next()){ String s = "NAME=" + rs.getString("NAME") +",MONEY=" + rs.getString("MONEY"); out.println(s); } smt.close(); con.close(); }catch(SQLException e){ e.printStackTrace(); } %>

Tomcatを起動し、ブラウザで
http://localhost:8080/SampleWeb0002/select_sample.jsp
にアクセスして、
NAME=サンディー,MONEY=3000
NAME=パトリック,MONEY=2000
NAME=ボブ,MONEY=1000
が表示されれば、OK。

※Java開発環境構築1でインストールした「JDK」「Eclipse」「Tomcat」「MySQL」が連携できることを確認しました。

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

Java開発環境構築5

※以下はJava開発環境構築1~4が終わった前提で話を進めている。

MySQLでデータベースを作る

〇Java開発環境構築1でデスクトップ上に作った[MySQL 8.0 Command Line Client]で、MySQLを起動し、パスワード「hoge」を入力。

mysql> CREATE DATABASE mydb;
mysql> USE mydb;
mysql> CREATE TABLE account (
-> NAME VARCHAR(100) PRIMARY KEY,
-> MONEY INTEGER
-> );
mysql> INSERT INTO account VALUES(‘ボブ’,1000);
mysql> INSERT INTO account VALUES(‘パトリック’,2000);
mysql> INSERT INTO account VALUES(‘サンディー’,3000);
mysql> EXIT

以上で、データベースの設定は完了。

Java開発環境構築4

※以下はJava開発環境構築1・2・3が終わった前提で話を進めている。

Javaサーブレットの作成

〇「プロジェクト・エクスプローラー」ビューで、SampleWeb0002プロジェクトを選択、右クリック→[新規]→[サーブレット]を選択。次の画面で、
Javaパッケージ「hoge」
クラス名「MyServlet」
と入力し、「次へ」ボタンを押す。

〇次の画面でサーブレットマッピングの指定を行う。
名前「myserv」
に変更すると、URLマッピングは自動的に「/myserv」に変更される。
「完了ボタン」を押す。

〇作成したMyServlet.javaのdoGetメソッドを次のコードに書き換える。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append(“Served at: “).append(request.getContextPath());←コメントアウトする
response.getWriter().println(“hello”);←書き加える
}

〇上記の変更を保存し、サーバを再起動し、ブラウザから、
http://localhost:8080/SampleWeb0002/myserv
にアクセスする。「hello」とブラウザに出力されればOK。

Java開発環境構築3

※以下はJava開発環境構築1・2が終わった前提で話を進めている。

WTPでのWebアプリケーション開発

〇WTP(Web Tools Platform)は、eclipse.orgのプロジェクトで、WebやJavaEEアプリケーションの開発支援を行う各種ツールを提供している。WTPの開発は主にJava EEパースペクティブで行う。Eclipseのメニューから、[ウィンドウ]→[パースペクティブ]→[パースペクティブを開く]→[その他]を選択。次の画面でJava EEパースペクティブを選択。「Eclipse IDE for Java EE Developers」を利用している場合は、Java EEパースペクティブがデフォルトのパースペクティブなので、最初から開かれている。

〇まずはじめにプロジェクトを作成
Eclipseのメニューから[ファイル]→[新規]→[動的Webプロジェクト]を選択
〇プロジェクトの作成画面
プロジェクト名「SampleWeb0002」
ターゲット・ランタイム「Apache Tomcat v9.0」を選択
動的webモジュールバージョンはWebアプリケーションのバージョン「4.0」を選択
(web.xmlでマッピングを行う場合は「2.5」)
構成はプロジェクト・ファセットと呼ばれるプロジェクトの各種設定をひとまとめにして名前を付けたもの「Apache Tomcat v9.0 デフォルト構成」を選択
「完了」を押してプロジェクトの作成を完了
※ここで「次へ」を選択して、その他のオプションを設定することができる
「プロジェクト・エクスプローラー」ビューで、プロジェクトが作成されたことを確認
表示されない場合は、右クリック→「リフレッシュ」またはF5を実行
HTMLやJSPはWebContent以下に作成する。
JavaクラスのソースプログラムはJavaリソースの/src以下に作成していく。

〇次に「サーバー」ビューでTomcat 9サーバを選択し、右クリック→[追加および除去]を選択。次の画面で使用可能なプロジェクトのSampleWeb0002を選択し、「追加」ボタンを押す。「完了」を押して画面を閉じる。以上で、JSPやサーブレットを作成・実行するための下準備は完了。

Java開発環境構築2

JSPを使ったWebアプリケーションの作成手順

〇「Java開発環境構築1」の設定後、Eclipse内で、Tomcatを利用できるように設定する。
「ウィンドウ(W)」→「設定(P)」
「設定」ダイアログボックスを表示して、「サーバー」欄の「ランタイム環境」を選択。
右側に表示された「サーバー・ランタイム環境」にある「追加(A)」ボタンをクリック。
「新規サーバー・ランタイム環境」ダイアログボックスが表示されたら、「ランタイム環境のタイプを選択(R)」欄で「Apache Tomcat v9.0」を選択して、「次へ(N)」ボタンをクリックする。
「Tomcatサーバー」の画面では、「Tomcatインストール・ディレクトリー(D)」にあるインストール先の文字列をコピーして、「完了(F)」ボタンをクリックする。
画面が戻るので、「サーバー・ランタイム環境」欄に、選択したTomcatが表示されていることを確認したら、「適用して閉じる」ボタンをクリックする。
〇新規サーバーを作成する。
「サーバー」ビューの下記リンクをクリックする。
「新規サーバー」ダイアログボックスが表示されたら、「サーバーのタイプを選択(S)」欄の「Apache」フォルダーから、先に準備した「Tomcat v9.0」を選択し、「サーバーのホスト名(H)にサーバー名入力(ここではデフォルトの「localhost」)して、「完了(F)」ボタンをクリックする。
〇動的Webプロジェクトの作成
Eclipseのメニューから、「新規(N)」→「動的Webプロジェクト」を選択する。「新規動的Webプロジェクト」ダイアログボックスが表示されたら、「プロジェクト名(M)」欄に任意のプロジェクト名を入力(ここでは、SampleWeb0001)し、「ターゲット・ランタイム(U)」では、先ほど設定したTomcatの該当バージョン(Apache Tomcat v9.0)を選択して、「完了(F)」ボタンをクリックする。
「パッケージ・エクスプローラー」内に生成された「SampleWeb0001」プロジェクトにある「WebContent」フォルダを右クリックして、「新規(N)」→「JSPファイル」をクリックする。「新規JSPファイル」ダイアログボックスが表示されたら、「ファイル名(M)」に任意のファイル名を入力(ここではSample0001.jsp)して、「完了(F)」ボタンをクリックする。
生成されたJSPファイル(Sample0001.jsp)をダブルクリックして、エディターに表示されたソースプログラム内のタグ部分に「Hello JSP」と入力する。
〇Tomcatサーバーを起動する(デスクトップに作成したTomcat9.exeのショートカットは使わない)
「サーバー」ビューのTomcatサーバーを右クリックして、ショートカットメニューから、「追加および除去(A)」を選択する。「追加および除去」ダイアログボックスが表示されたら、、「使用可能(A)」欄にある現在編集中のプロジェクト(SampleWeb0001)を選択して、「追加(D)」ボタンをクリックし、「構成済み(C)」へ移動して、「完了(F)」ボタンをクリックする。
「サーバー」ビューのTomcatサーバーを右クリックして、ショートカットメニューから、「開始(S)」を選択してサーバーを起動する。
ブラウザを開き、以下のURLを入力する。
http://localhost:8080/SampleWeb0001/Sample0001.jsp
ブラウザに文字列「Hello JSP」が表示されたら完成。

Java開発環境構築1

01. JDK のインストール

「Java SE – Downloads Oracle Technology Network Oracle」ウェブサイト
http://www.oracle.com/technetwork/java/javase/downloads/index.html
にて、「Java Platform, Standard Edition」の「JDK DOWNLOAD」をクリックし、
「Java SE Development Kit 14」の欄の「Accept License Agreement」をチェックして、
「Windows x64」のJDK、「jdk-14_windows-x64_bin.exe」をダウンロードし、インストールする。
※インストール先のオプションはデフォルトで、変更しない。
環境変数 JAVA_HOME と Path に通しておく。
エクスプローラー内のPCを右クリックし、プロパティを選択。
システムの画面中のシステムの詳細設定を選ぶ。
システムのプロパティの画面中の環境変数ボタンを押す。
システムの環境変数内に「JAVA_HOME」を作成し、
「JAVA_HOME」→「C:¥Program Files¥Java¥jdk-14」
とする。
同じくシステムの環境変数内の「Path」を編集する。
「Path」→「%JAVA_HOME%¥bin」
とする。

02. Eclipse のインストール

フォルダ「C:¥eclipse」とさらにその中に、
フォルダ「C:¥eclipse¥workspace」を作成しておく。
「Eclipse 日本語化 | MergeDoc Project」ウェブサイト
http://mergedoc.osdn.jp/
より、Eclipse 2020 の Ultimate の Full Edition をダウンロードする。
「Pleiades All in One Eclipse ダウンロード」→「pleiades-2020-03-ultimate-win-64bit-jre_20200322.zip」
https://sevenzip.osdn.jp/
より、7-Zip 20.00 alpha (2020-02-06)をダウンロード・インストールする。
上記のPleiadesのファイルを「C:¥eclipse」フォルダ内にコピーし、7-Zipで、展開。
※他の解凍ツールを使う場合は、ファイル名が長くなり、使えなくなることに注意する。
「C:¥eclipse¥pleiades¥eclipse¥eclipse.exe」を管理者権限で実行すれば、Eclipseが起動する。
Eclipseの起動時に workspace の場所を求められるので、「C:¥eclipse¥workspace」を指定する。
「C:¥eclipse¥pleiades¥eclipse¥eclipse.exe」のショートカットをデスクトップ上に作成し、管理者権限で実行出来るようにする。

03. Tomcat のインストール

「Apache TomcatR – Welcome!」ウェブサイト
http://tomcat.apache.org/
にて、最新版のTomcat(Tomcat 9.0.34 Released)をダウンロードする。
「32-bit/64-bit Windows Service Installer (pgp, sha512)」を「C:¥eclipse」にダウンロードし、インストールする。
JDKのインストール先として「C:¥Program Files¥Java¥jdk-14」を指定。
フォルダー「C:¥eclipse¥Tomcat」を作成し、Apache Tomcat Destination Folder として、「C:¥eclipse¥Tomcat」を指定。
Tomcat を起動するには、環境変数「CATALINA_HOME」を定義し、
インストール場所「C:¥eclipse¥Tomcat」を指定する。
環境変数「Path」に「%CATALINA_HOME%¥bin」を追記する。
さらに、環境変数「Path」に「C:¥eclipse¥Tomcat¥lib¥tomcat-coyote.jar」を追記する。
「C:¥eclipse¥Tomcat¥bin¥Tomcat9.exe」を管理者権限で起動して、
「Server startup in XXXX ms」の行がコマンドプロンプトに表示されたら起動。
http://localhost:8080/
で起動を確認。コマンドプロンプトの画面を消すと、Tomcatは終了。
「Tomcat9.exe」はデスクトップ上にショートカットを置いておくと便利。

04. MySQLのインストール

MySQL  MySQL Downloads ウェブサイト
http://www.mysql.com/downloads/
から、MySQL Community (GPL) Downloads
→MySQL Community Server
→MySQL Community Server 8.0.19
→Windows(x86,32 & 64-bit),MySQL Installer MSI
→MySQL Installer 8.0.19
→Windows (x86, 32-bit), MSI Installer」
=「mysql-installer-community-5.7.14.0.msi」
をダウンロードする。その際、下方の「No thanks, just start my download.」を選ぶ。
「mysql-installer-community-8.0.19.0.msi」を「C:¥eclipse」に格納し、ダブルクリック
○Choosing a Setup Type
「Custom」→「Next」
○Select Products and Feature
「MySQL Servers」→「MySQL Server 8.0.19 – X64」を選択
さらに、
「MySQL Connectors」→「Connector/J 5.1」X86版を選択し、
※「Connector/J 5.1」は32bit版しかない。
さらに、
「MySQL Connectors」→「Connector/ODBC 8.0.19 – X64」を選択しておき、
「Next」
○Installation
「Execute」し、製品名の左側に緑のチェックがついたら「Next」
○Product
インストールの準備ができるので「Execute」
完了したら「Next」
○「Next」
○「High Availability」で「Standalone MySQL Server / Classic My SQL
replication」を選択して「Next」
○デフォルトで「Next」
○「Authentication Method」で「Use Strong Password Encryption」を選んで「Next」
○Acconts and Roles
MySQLのROOTユーザーのパスワード「hoge」を入力して「Next」 ※1
○Windows Service
デフォルトで「Next」
○Apply Server Configration
設定処理の一覧が表示されるので「Execute」
処理が終わると一覧の右に緑のチェックがつくので「Finish」
○Product Configration
再度、この画面が表示されるので「Next」
○Install Complete
「Finish」
以上で、MySQLのインストールは終了。
スタートメニューの[MySQL]→[MySQL 5.7 Command Line Client]が、
MySQLを操作するツールなので、ショートカットをスタート画面に置く。

※個々の動作確認はできましたが、うまく連携しているか否かはわかりません。
今後、アプリケーションを作ることで確認したいと思います。

【追記】2020年08月01日(土)

「MySQL Installer」の画面で、Microsoft Windows用の「MySQL Installer 8.0.21」、「Windows (x86, 32-bit), MSI Installer」には、「mysql-installer-web-community-8.0.21.0.msi」と「mysql-installer-community-8.0.21.0.msi」が選べるようになった。私は「mysql-installer-community-8.0.21.0.msi」をダウンロードすることにした。

MySQLインストール終了後、スタートメニューの[MySQL]→[MySQL 8.0 Command Line Client]のショートカットを作るには、スタートメニューの[MySQL]→[MySQL 8.0 Command Line Client]を右クリックして「その他」→「ファイルの場所を開く」とショートカットがあるので、それをデスクトップ上にコピーした。

【改訂】2020年08月19日(水)
文中の※1:MySQLのROOTユーザーのパスワードを「hoge」とした。

AmaterasUML

UMLを記述するためのツールは多々あります。Eclipseプラグインとしても様々なものが提供されています。Javaプログラミングの開発環境として利用されることの多いEclipseですが,プラグインを入れることにより,UMLモデリングを行う環境としても利用できるようになります。

「AmaterasUML」は,Project Amaterasで開発されているプラグインです。主な機能は以下の通りです。
・主なUML図の記述(クラス図,シーケンス図,アクティビティ図,ユースケース図)
・画像として保存
・Javaクラスのフォワード/リバース・エンジニアリング
・XMI形式のエクスポート/インポート(拡張コンポーネント)

◆導入(インストール)

AmaterasUMLのWebサイトから入手できます(執筆時点の最新はAmaterasUML Version1.3.4)。入手したアーカイブを解凍してできたjarファイルを,Eclipseのプラグイン・フォルダにコピーします。

動作にはGEF(Graphical Editing Framework)が必要です。GEFは,連載第5回「Europa(Eclipse 3.3)の注目機能はこれだ!」で紹介した「Europa」ディスカバリー・サイトに登録されています。また,「Eclipse IDE for Java EE Developers」にはあらかじめ同梱されていますので,別途入手する必要はありません。

◆モデリング

まず,プロジェクトを作成します(メニュー[ファイル]→[新規]→[プロジェクト]で[Java]→[Javaのプロジェクト]を選択)。次に,[ファイル]→[新規]→[その他]で[AmaterasUML]→[クラス図]を選択して,クラス図を作成するためのファイル(ここではsample.cld)を作成します。

クラス図の作成は,パレットから追加したいエンティティを選んで配置し,関連の線でつないでいきます。モデルをダブルクリックするか,プロパティビューで名前や修飾子を編集できます。

属性・操作はエンティティの右クリックメニューから追加します。名前や修飾子の変更はモデル上をダブルクリックか,プロパティビューで行います。

関連の線には,プロパティビューで多重度が設定できるようになっています。

http://itpro.nikkeibp.co.jp/article/COLUMN/20071115/287312/?rt=nocnt 参照

JDBC

Java database connectivity の略。Javaのプログラムからデータベースにアクセスするためのインタフェースの仕様。実際にデータベースにアクセスするためにはJDBCドライバーが必要になる。JDBCドライバーは米オラクルなどのデータベースソフトメーカーなどが提供している。JDBCには、このJDBCドライバーの仕様は含まれていない。JavaのプログラムからJDBCドライバーを呼び出すためにはJDBC APIを利用する。

API

Application Program Interface の略で、ある特定のOSやミドルウェア用のソフトウェア開発時に利用できる命令や関数の集合のこと。また、それらを利用するために定めた規約のこと。ソフトウェアが共通して利用できる機能をOSやミドルウェアのかたちでまとめて提供し、プログラマはそれを「呼び出す」だけで、自分でプログラミングしなくても、その機能を利用したソフトウェアを作成できる。

Java

1995年5月に米サン・マイクロシステムズが開発・発表したオブジェクト指向のプログラミング言語。C++がベースになっている。パソコンやプリンター、携帯電話、テレビなどの家電製品、などさまざまな分野での利用が考えられ、既にNTTドコモやKDDIの携帯電話などで利用されている。Javaという言葉自体が単にプログラミング言語よりも広い概念になっている。
プログラミング言語としては、動的に確保したメモリーが参照されなくなると自動的に解放されるガベージコレクション機能を備え、ポインターの概念がないという特徴がある。
ネットワーク上にあるプログラムをダウンロードしてWebブラウザー上で動かすことができるのも特徴の一つ。このプログラムをJavaアプレットという。これに対し、Webブラウザーなしに単体で動作するものをJavaアプリケーションと呼ぶ。
Javaで作ったプログラムを実行するにはJava VM(Java仮想マシン)というソフトが必要になる。Javaで記述したプログラムをコンパイルすると、Java VM用のバイトコードが生成される。そのため、Java VMを搭載していれば、どのプラットフォームでもJavaで作ったプログラムを動かすことができる。これが、Javaの特徴である「Write Once, Run Anywhere」(一度作成すればどのプラットフォームでも動く)のゆえんである。
OSや機種ごとのプラットフォームに依存しない半面、実行速度はそのプラットフォームに最適化されたソフトに比べて遅くなる。そのためJavaのバイトコードを実行するときに、プラットフォーム依存のコードに変換して実行速度を高速化するJIT(just in time)コンパイラーという技術が使われている。