IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（6.DBアクセスアプリケーションの準備 (java)）


#はじめに

「[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)」の　第6回です。
ここでは、 サンプルアプリケーションの準備ついて記載します。


実施内容は以下の通りです。

- コンパイル環境の概要
- ソースの準備
- war ファイルの出力

筆者自身がアプリケーション開発者ではないため、より良いやり方や
より品質の高いコードなどがあると思いますが、　当記事では動かすことを主目的とし、
品質やセキュリティ、エラー処理などは考慮しませんのでご注意ください。
個人的にテーブル名等をハードコードしているのも気に入りませんが、まぁ気にしないでください。

#コンパイル環境の準備

Java アプリケーションのソースからコンパイルするためには JDK を含む IDE (Integrated development Environment) が必要です。
（厳密には、JDK だけあればコンパイルできますが…）

IDE には Eclipse を利用します。（特に深い意味はありません。なんでもよいです）
Eclipse ですが、初心者ですので [Pleiades All in One パッケージ](https://mergedoc.osdn.jp/) を利用します。
オールインワンで Java EE まで対応できるようです。作ってくださった方には頭が下がります。。


[Pleiades All in One パッケージ](https://mergedoc.osdn.jp/)  から Windows 用のファイルをダウンロードします。
（今回は、下図 Eclipse 2020 を利用しています。）

![49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/66f255fc-d541-6523-8f2e-b2bb4b0ef7f6.png)

リンク先で、 Java の Full Edition からダウンロードします。

![50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/f5c3eda1-beec-352a-3954-72d4ebca7593.png)

ダウンロード後、 zip ファイルを展開します。
（パスが長いとエラーが出ることがありますので、できるだけパスの短いところに配置、展開してください）

展開後、 eclipse フォルダ内にある、 eclipse.exe をダブルクリックします。
ワークスペース選択画面では、デフォルトのままで「起動」ボタンを押します。

![51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/665f279b-074b-a842-5ffc-a563045e3875.png)

##ソースの準備

eclipse 起動後、パッケージ・エクスプローラー画面が表示されるため、
「プロジェクトの作成...」リンクを押します。
表示されるウィンドウの中から、「動的Webプロジェクト」を選択し、「次へ」を押します。

![52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/3e0b9f92-ccb4-5378-1920-c4458d2ff38c.png)

プロジェクト名（今回は LibertyCounter）を付け、　ターゲット・ランタイムは Java8 を選択します。
（Java8 でなくてもよいですが。。）
その後、「完了」ボタンを押します。

![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/1f487cfb-e645-63ff-c042-167a00958de7.png)

パッケージ・エクスプローラーが表示されるため、そこに表示されているプロジェクトツリーを展開し
src 部分で　右クリック　＞　「新規」　＞　「クラス・　を選択します。

![54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/7ca501ae-45b9-47f5-be4b-9fc2fa974b69.png)

ここでは、　パッケージ名を counter とし、クラス名を Counter としました。
そこまで指定し、「完了」を押します。

![55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/647cb288-9ec9-adeb-76c4-d73c306136c2.png)

パッケージ・エクスプローラーのツリーに Counter.java が表示され、右側のペインに、 Counter.java のソースが表示されます。

![56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/b32e6e74-5932-43bf-cc75-f23e73877672.png)
![57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/0104135f-08ae-7fbd-2762-35ff7ff36395.png)

そのソースウィンドウを、以下のソースで上書きします。
このソース自体は、[Liberty への既存の JDBC アプリケーションのデプロイ](https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_liberty/com.ibm.websphere.wlp.doc/ae/twlp_dep_jdbc.html) に記載されているものをベースに修正しています。
まず全文掲載しますが、この後ポイント部分はピックアップして補足します。

```java:Counter.java
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` を利用します。（ハードコード…）

```java
@WebServlet("/Counter")
public class Counter extends HttpServlet {
	@Resource(name = "jdbc/sample")
```

doGet メソッド内では、　private メソッドの getHostName を用いて、
ホスト名を取得しています。
また、 response として、 HTML をべた書きする形で文字列を格納しています。

```java
		hostname = getHostName();
		
	        response.setContentType("text/html");
	        PrintWriter out = response.getWriter();
	        out.println("<H1>Response from : "+ hostname +"</H1>\n");
```

DBへのコネクションを取得します。この辺りはもうおまじない的です。

```java
	        try {
	           con = ds1.getConnection();
	           Statement stmt = null;
	           stmt = con.createStatement();
```

まず最初に `select distinct ...`  のSQL 文を使い、 `hostname` がすでに登録されているかどうかを確認しています。
取得できなかった（つまりは初回アクセスの）場合、 `Insert`文で ホスト名と 1 というデータをテーブルに格納します。
取得できた場合は、 `Update` 文で count 列を +1 しています。

```java
	           // 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 形式で格納します。

```java
		   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 プロジェクトを右クリックし、「エクスポート」を選択します。

![58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/1e27b8a4-c30b-d8b9-2dec-394d0866a079.png)

Web のフォルダを開き、 「WARファイル」を選択し、「次へ」を押します。

![59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/071cd38e-4ac9-98a1-0e82-4f73a15ed112.png)

「参照」ボタンを押し、出力先フォルダ・ファイル名を指定したのち、「完了」を押します。
WAR ファイルが出力されます。

![60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310495/ff5ca735-f511-dfcb-05ed-623044ed629a.png)


---
お疲れ様でした。
今回はここまでとし、次回は [7.WebSphere Liberty コンテナの準備] を実施します。

←：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（5.Db2 on IBM Cloud の準備）](https://qiita.com/shimauma_Zzzzz/items/9d3234757bb1c70e98c5)
↑：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（1.概要）](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)
→：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（7.WebSphere Liberty コンテナの準備）](https://qiita.com/shimauma_Zzzzz/items/c586817099cf59abdc29)

---