#はじめに
「IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた」の 第6回です。
ここでは、 サンプルアプリケーションの準備ついて記載します。
実施内容は以下の通りです。
- コンパイル環境の概要
- ソースの準備
- war ファイルの出力
筆者自身がアプリケーション開発者ではないため、より良いやり方や
より品質の高いコードなどがあると思いますが、 当記事では動かすことを主目的とし、
品質やセキュリティ、エラー処理などは考慮しませんのでご注意ください。
個人的にテーブル名等をハードコードしているのも気に入りませんが、まぁ気にしないでください。
#コンパイル環境の準備
Java アプリケーションのソースからコンパイルするためには JDK を含む IDE (Integrated development Environment) が必要です。
(厳密には、JDK だけあればコンパイルできますが…)
IDE には Eclipse を利用します。(特に深い意味はありません。なんでもよいです)
Eclipse ですが、初心者ですので Pleiades All in One パッケージ を利用します。
オールインワンで Java EE まで対応できるようです。作ってくださった方には頭が下がります。。
Pleiades All in One パッケージ から Windows 用のファイルをダウンロードします。
(今回は、下図 Eclipse 2020 を利用しています。)
リンク先で、 Java の Full Edition からダウンロードします。
ダウンロード後、 zip ファイルを展開します。
(パスが長いとエラーが出ることがありますので、できるだけパスの短いところに配置、展開してください)
展開後、 eclipse フォルダ内にある、 eclipse.exe をダブルクリックします。
ワークスペース選択画面では、デフォルトのままで「起動」ボタンを押します。
##ソースの準備
eclipse 起動後、パッケージ・エクスプローラー画面が表示されるため、
「プロジェクトの作成...」リンクを押します。
表示されるウィンドウの中から、「動的Webプロジェクト」を選択し、「次へ」を押します。
プロジェクト名(今回は LibertyCounter)を付け、 ターゲット・ランタイムは Java8 を選択します。
(Java8 でなくてもよいですが。。)
その後、「完了」ボタンを押します。
パッケージ・エクスプローラーが表示されるため、そこに表示されているプロジェクトツリーを展開し
src 部分で 右クリック > 「新規」 > 「クラス・ を選択します。
ここでは、 パッケージ名を counter とし、クラス名を Counter としました。
そこまで指定し、「完了」を押します。
パッケージ・エクスプローラーのツリーに Counter.java が表示され、右側のペインに、 Counter.java のソースが表示されます。
そのソースウィンドウを、以下のソースで上書きします。
このソース自体は、Liberty への既存の JDBC アプリケーションのデプロイ に記載されているものをベースに修正しています。
まず全文掲載しますが、この後ポイント部分はピックアップして補足します。
package counter;
import java.io.*;
import java.net.InetAddress;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.annotation.Resource;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.WebServlet;
import javax.sql.DataSource;
/**
* Servlet implementation class Counter
*/
@WebServlet("/Counter")
public class Counter extends HttpServlet {
@Resource(name = "jdbc/sample")
private DataSource ds1;
private Connection con = null;
private String hostname = null;
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Counter() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
hostname = getHostName();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<H1>Response from : "+ hostname +"</H1>\n");
try {
con = ds1.getConnection();
Statement stmt = null;
stmt = con.createStatement();
// check if hostname exists
ResultSet result = stmt.executeQuery("select distinct hostname from test01 where hostname='"+hostname+"'");
if( !result.next() ) {
out.println("Insert hostname into test01<br>\n");
stmt.executeUpdate("insert into test01 values ('"+hostname+"','1')");
} else {
out.println("Update hostname access count in test01<br>\n");
stmt.executeUpdate("update test01 set count=count+1 where hostname='"+hostname+"'");
}
ResultSet result2 = stmt.executeQuery("select * from test01");
while(result2.next()) {
out.println("<font size=\"+2\">"+result2.getString(1)+" : </font><font size=\"+2\" color=\"red\">"+result2.getInt(2)+"</font><br>\n");
}
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
if (con != null){
out.println("<H1>DB2 Output Completed</H1>\n");
try{
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/**
* getHostName
*
*/
public static String getHostName() {
try {
return InetAddress.getLocalHost().getHostName();
}catch (Exception e) {
e.printStackTrace();
}
return "UnknownHost";
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
以下、抜粋です。
/Counter
でアクセスします。 また、DB接続の際の JDBC リソースとして jdbc/sample
を利用します。(ハードコード…)
@WebServlet("/Counter")
public class Counter extends HttpServlet {
@Resource(name = "jdbc/sample")
doGet メソッド内では、 private メソッドの getHostName を用いて、
ホスト名を取得しています。
また、 response として、 HTML をべた書きする形で文字列を格納しています。
hostname = getHostName();
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<H1>Response from : "+ hostname +"</H1>\n");
DBへのコネクションを取得します。この辺りはもうおまじない的です。
try {
con = ds1.getConnection();
Statement stmt = null;
stmt = con.createStatement();
まず最初に select distinct ...
のSQL 文を使い、 hostname
がすでに登録されているかどうかを確認しています。
取得できなかった(つまりは初回アクセスの)場合、 Insert
文で ホスト名と 1 というデータをテーブルに格納します。
取得できた場合は、 Update
文で count 列を +1 しています。
// check if hostname exists
ResultSet result = stmt.executeQuery("select distinct hostname from test01 where hostname='"+hostname+"'");
if( !result.next() ) {
out.println("Insert hostname into test01<br>\n");
stmt.executeUpdate("insert into test01 values ('"+hostname+"','1')");
} else {
out.println("Update hostname access count in test01<br>\n");
stmt.executeUpdate("update test01 set count=count+1 where hostname='"+hostname+"'");
}
次に、テーブルの全データを取得し、 response 変数に HTML 形式で格納します。
ResultSet result2 = stmt.executeQuery("select * from test01");
while(result2.next()) {
out.println("<font size=\"+2\">"+result2.getString(1)+" : </font><font size=\"+2\" color=\"red\">"+result2.getInt(2)+"</font><br>\n");
ロジック的な部分は以上です。 他の部分は興味があればご確認ください。
#war ファイルの出力
本来であれば、eclipse に登録した tomcat 等でテストをするところではありますが、
そのあたりは飛ばして、 war ファイルを出力します。
LibertyCounter プロジェクトを右クリックし、「エクスポート」を選択します。
Web のフォルダを開き、 「WARファイル」を選択し、「次へ」を押します。
「参照」ボタンを押し、出力先フォルダ・ファイル名を指定したのち、「完了」を押します。
WAR ファイルが出力されます。
お疲れ様でした。
今回はここまでとし、次回は [7.WebSphere Liberty コンテナの準備] を実施します。
←:IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた(5.Db2 on IBM Cloud の準備)
↑:IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた(1.概要)
→:IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた(7.WebSphere Liberty コンテナの準備)