Bluemix Liberty for Javaの開発環境を整える（2/3）

# はじめに
BluemixのランタイムとしてLiberty for Javaを使用するための、開発環境の準備について記載します。
ローカルPCでWebSphere Application Server Liberty Profile（WAS Liberty）を稼働させ、ローカルPCで稼働確認したものをBluemixにPushすることを想定して記載します。

本内容は、以下の3回に分けて投稿する予定です。今回は、第2回目の「シンプルなJSPとServletのプログラムの開発」です。

 1. [EclipseのセットアップとWAS Libertyの導入](http://qiita.com/asmanabu/items/a95dec97aabddd69acd8)
 2. [シンプルなJSPとServletのプログラムの開発](http://qiita.com/asmanabu/items/7d157b326175e4f58b17)
 3. [データベースサービスを利用するプログラムの開発](http://qiita.com/asmanabu/items/6d44803c38e3769bb42f)

# 前提
以下の内容が完了しているものとして記載します。

 * IBM Bluemixのアカウント取得
  * アカウント未取得の方は、[「IBM Bluemixフリートライアルアカウント作成手順」](http://qiita.com/KenichiSekine/items/6ad49b25167b3f4cdb63)を参考に、フリートライアル用アカウントを取得ください
 * Eclipse IDE for Java EE Developersのダウンロード
  * 今回は、Eclipse Neonを利用します
  * Eclipseのダウンロードは[こちら](https://eclipse.org/downloads/)から
 * Java JDK 1.8のインストール
  * Liberty for Javaが使用するバージョンに合わせ、JDK 1.8を使用します
 * [Bluemix Liberty for Javaの開発環境を整える（1/3）](http://qiita.com/asmanabu/items/a95dec97aabddd69acd8)に記載された、EclipseのセットアップとWAS Libertyの導入

# 作業の流れ
以下の流れで、作業を進めていきます。

 1. EclipseのDynamic Web Projectを作成し、JSPとServletからなるサンプル・アプリケーションを作成します
 2. サンプル・アプリケーションが稼働するように、WAS Libertyの設定を変更します
 3. ローカルPCでサンプル・アプリケーションを稼働させ、稼働を確認します
 4. サンプル・アプリケーションをBluemixにPushし、稼働を確認します

# サンプル・アプリケーションの作成
サンプル・アプリケーションとして、所有している本の一覧を表示するアプリケーションを作成します。本稿では、まだデータベースを使用しないため、Servletの中でダミーデータを生成し、JSPで表示するようにします。

本稿では、以下の3つのプログラムを作成します。

 * Book.java : 本の情報を保持するModel用クラスです
 * BookListServlet.java : クライアントからのリクエストを受け、ダミーデータを作成し、result.jspに結果を渡すServletです
 * result.jsp : 所有する本の一覧を表示するJSPです

## Dynamic Web Projectの作成
Eclipseのメニューより、「File」→「New」→「Dynamic Web Project」を選択します。「Dynamic Web Project」が見つからない場合は、「Other」をクリックし、表示される一覧から選択してください。
![EclipseProject-01.png](https://qiita-image-store.s3.amazonaws.com/0/73397/42b84fd2-2e98-ecd6-19fa-af7a30707f13.png "EclipseProject-01.png")

「Project name:」に、「BookListApplication」を入力します。続いて、「Target runtime」に、「WebSphere Application Server Liberty」が選択され、「Add project an EAR」のチェックボックスが外れていることを確認し、「Finish」をクリックします。
![EclipseProject-02.png](https://qiita-image-store.s3.amazonaws.com/0/73397/db9703ea-b4b9-7a07-2c83-423c7a687f09.png "EclipseProject-02.png")

「BookListApplication」プロジェクトが作成されていることと、Java EEパースペクティブを開いていることを確認してください。別のパースペクティブになっている場合は、下図の青色の枠内のボタンをクリックして、Java EEパースペクティブを開きます。
![EclipseProject-03.png](https://qiita-image-store.s3.amazonaws.com/0/73397/9be5387e-14e0-f387-7c81-6c949f5a91f8.png "EclipseProject-03.png")


## Beanの作成
本の情報を保持するModel用クラスであるBook.javaを作成します。
Book.javaを格納するための、パッケージを作成します。「BookListApplication」の「Java Resources」の下にある「src」を右クリックし、「New」→「Package」を選択します。
![EclipseProject-04.png](https://qiita-image-store.s3.amazonaws.com/0/73397/26496197-3a35-d157-b6d1-7e97626e9389.png "EclipseProject-04.png")

「Name:」に「booklist.bean」と入力し、「Finish」をクリックします。
![EclipseProject-05.png](https://qiita-image-store.s3.amazonaws.com/0/73397/7b732ef8-9327-9772-4c02-13c3ec017481.png "EclipseProject-05.png")

「booklist.bean」を右クリックし、「New」→「Class」を選択します。
![EclipseProject-06.png](https://qiita-image-store.s3.amazonaws.com/0/73397/82edb199-a8c3-9fca-83ae-adf7f87ae497.png "EclipseProject-06.png")

「Name:」に「Book」と入力し、「Finish」をクリックしてください。
![EclipseProject-07.png](https://qiita-image-store.s3.amazonaws.com/0/73397/ad8e0ca1-6736-6fc6-4b69-9b37afafce50.png "EclipseProject-07.png")

Book.javaの内容として、以下を入力してください。

```Book.java
package booklist.bean;

public class Book {
	private String title;
	private String type;
	private int price;
	private String isbn;
	
	public Book(String title, String type, int price, String isbn) {
		this.title = title;
		this.type = type;
		this.price = price;
		this.isbn = isbn;
	}
	
	public String getTitle() {
		return title;
	}

	public String getType() {
		return type;
	}

	public int getPrice() {
		return price;
	}

	public String getIsbn() {
		return isbn;
	}

	@Override
	public int hashCode() {
		return title.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Book) {
			return this.equals((Book)obj);
		} else {
			return false;
		}
	}
	
	public boolean equals(Book obj) {
		if (this == obj) {
			return true;
		} else {
			if ((this.title.equals(obj.title)) && (this.type.equals(obj.type)) &&
				(this.price == obj.price) && (this.isbn.equals(obj.isbn))) {
				return true;
			} else {
				return false;
			}
		}
	}
}
```

## Servletの作成
クライアントからのリクエストを受け、ダミーデータを作成し、result.jspに結果を渡すServletであるBookListServlet.javaを作成します。
Beanの作成の冒頭と同じ要領で、BookListServlet.javaを格納するパッケージ「booklist.servlet」を作成してください。

「booklist.servlet」を右クリックし、「New」→「Servlet」を選択します。
![EclipseProject-08.png](https://qiita-image-store.s3.amazonaws.com/0/73397/4aefc089-9d48-e299-22c2-98f517a0c08d.png "EclipseProject-08.png")

「Class name:」に「BookListServlet」と入力し、「Finish」をクリックします。
![EclipseProject-09.png](https://qiita-image-store.s3.amazonaws.com/0/73397/23359d92-0cf9-0a85-8e47-bbc5d813313d.png "EclipseProject-09.png")

BookListServlet.javaの内容として、以下を入力してください。

``` BookListServlet.java
package booklist.servlet;

import java.io.IOException;
import java.util.ArrayList;

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

import booklist.bean.Book;

@WebServlet("/BookList")
public class BookListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	public BookListServlet() {
		super();
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		Book book1 = new Book("WebSphere Application Server 構築・運用バイブル", "WebSphere", 4800, "978-4774153193");
		Book book2 = new Book("DB2 10 エバリュエーション・ガイドブック", "DB2", 3200, "978-4798131894");
		Book book3 = new Book("スマートマシンがやってくる", "Cognitive", 1600, "978-4822250324");
		
		ArrayList<Book> bookList = new ArrayList<Book>();
		bookList.add(book1);
		bookList.add(book2);
		bookList.add(book3);
		
		request.setAttribute("bookList", bookList);
		
		RequestDispatcher rd = request.getRequestDispatcher("./result.jsp");
		rd.forward(request, response);
	}
}
```

## JSPの作成
所有する本の一覧を表示するJSPであるresult.jspを作成します。
「WebContent」を右クリックし、「New」→「JSP File」を選択します。
![EclipseProject-10.png](https://qiita-image-store.s3.amazonaws.com/0/73397/70e15168-364a-d6d4-920a-dad7a51f480b.png "EclipseProject-10.png")

「File name:」に「result.jsp」を入力し、「Finish」をクリックします。
![EclipseProject-11.png](https://qiita-image-store.s3.amazonaws.com/0/73397/79f7e4ab-2dc4-7ad0-22ec-8814e3c9df49.png "EclipseProject-11.png")

result.jspの文字コードが「ISO-8859-1」になっているため「UTF-8」に修正します。
result.jspを右クリックし、「Properties」を選択します。「Text file encoding」の「Other」にチェックを入れ、「UTF-8」を選択し、「OK」をクリックします。
![EclipseProject-12.png](https://qiita-image-store.s3.amazonaws.com/0/73397/f1910239-1611-be70-1267-da1f2ad653f5.png "EclipseProject-12.png")

result.jspの内容として、以下を入力します。

``` result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="booklist.bean.Book" %>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Book List</title>
  </head>
  
  <body>
    <h1>蔵書一覧</h1>
    
    <table border="1">
      <thead>
        <tr><th>タイトル</th><th>種類</th><th>価格</th><th>ISBN</th></tr>
      </thead>
      <tbody>
        <%
          ArrayList<Book> bookList = (ArrayList<Book>)request.getAttribute("bookList");
          for (int i = 0; i < bookList.size(); i++) {
            Book book = bookList.get(i);
            out.println("<tr>");
            out.println("<td>" + book.getTitle() + "</td>");
            out.println("<td>" + book.getType() + "</td>");
            out.println("<td>" + book.getPrice() + "</td>");
            out.println("<td>" + book.getIsbn() + "</td>");
            out.println("</tr>");
          }
        %>
      </tbody>
    </table>
  </body>
</html>
```

# WAS Libertyの設定変更

「[Bluemix Liberty for Javaの開発環境を整える（1/3）](http://qiita.com/asmanabu/items/a95dec97aabddd69acd8)」のWAS Libertyの際に、Eclipse上でのサーバー作成が完了しています。この状態でもサンプル・アプリケーションを稼働させることができるのですが、実際にサーバーを起動させようとすると、基本ユーザー認証の構成やSSLの構成を求められます。これらを構成しないと正しくサーバーが起動しません。これは、デフォルトのサーバー構成では、「Java EE 7 Full Platform」と呼ばれる、Java EE 7のすべての仕様を使える構成になっているためです。このまま、基本ユーザー認証やSSLを構成しても良いのですが、どうせなら使わない機能は無効化し、サンプル・アプリケーション稼働に必要なWeb Profileのみを利用するように設定します。このように、必要な仕様のみを利用するように構成することで、アプリケーション・サーバー起動時のオーバヘッドを軽減することが、WAS Libetyでは可能です。
（今回は、Web Profileを利用するように構成しますが、サンプル・アプリケーションの稼働には、JSP-2.1とServerlet-3.1の仕様さえあれば稼働可能です。この2つの仕様のみを構成することも可能です。）

Eclipseより、「Server」ビューを開き、作成したWAS Libetyのサーバーの「Server Configuration」をダブルクリックします。
![Liberty-01.png](https://qiita-image-store.s3.amazonaws.com/0/73397/8c85dd6a-a27d-e93e-d132-72228412e8e3.png "Liberty-01.png")

WAS Libertyの設定変更ツールが起動します。「フィーチャー・マネージャー」をクリックし、右側に表示されるフィーチャーから「javaee-7.0」を選択し、「Remove」をクリックします。
![Liberty-02.png](https://qiita-image-store.s3.amazonaws.com/0/73397/8ddf5b2d-d33d-b099-9471-4608635455dd.png "Liberty-02.png")

続いて、同じ「フィーチャー・マネージャー」から「Add」をクリックし、表示されるフィーチャー選択画面の検索バーに「Webprofile」と入力します。表示される「webProfile-7.0」を選択し、「OK」をクリックしてください。
![Liberty-03.png](https://qiita-image-store.s3.amazonaws.com/0/73397/2b4d00f3-6315-f19a-8f7f-01ff86f0998e.png "Liberty-03.png")

![Liberty-04.png](https://qiita-image-store.s3.amazonaws.com/0/73397/c9b71836-50f6-43e8-8603-dd90fc2bab69.png "Liberty-04.png")

この作業で、WebProfileのみを使用するように構成できました。Ctrl-sで変更したファイルを保存します。
![Liberty-05.png](https://qiita-image-store.s3.amazonaws.com/0/73397/f7cb3dd5-2671-ba06-4f10-4515d58e2ad1.png "Liberty-05.png")

最後に、WAS Libertyのサーバーとサンプル・アプリケーションを関連付けます。
WAS Libertyのサーバーを右クリックし、「Add and Remove...」をクリックします。
![Liberty-06.png](https://qiita-image-store.s3.amazonaws.com/0/73397/94627bec-6240-e7b9-252b-049f6c46247e.png "Liberty-06.png")

「Available:」にある「BookListApplication」を選択し、「Add >」をクリックして「Configured:」に移動させます。
![Liberty-07.png](https://qiita-image-store.s3.amazonaws.com/0/73397/2c0fe2af-018a-4afe-a7a8-ad3b50a30c1a.png "Liberty-07.png")

最後に「Finish」をクリックすれば、関連付けは完了です。
![Liberty-08.png](https://qiita-image-store.s3.amazonaws.com/0/73397/b0ea78f5-c364-fb60-9d8f-c8d6af9e19cd.png "Liberty-08.png")


# ローカルPCでの稼働確認
EclipseのServerビューで、WAS Libertyのサーバーを選択し、Serverビューの右上の実行ボタン（再生マークの絵）をクリックします。
![Local-01.png](https://qiita-image-store.s3.amazonaws.com/0/73397/971e1066-3bb9-b6a7-8b98-d25caf827057.png "Local-01.png")

以下のようなログが出力され、エラーコード（CWで始まる10桁のコード）がInfoレベル（10桁目がI）のみとなっていれば、エラーなく正常にWAS Libertyのサーバーとアプリケーションを起動できています。

```
Java HotSpot(TM) 64-Bit Server VM バージョン 1.8.0_102-b14 (ja_JP) で、server1 (WebSphere Application Server 16.0.0.3/wlp-1.0.14.cl160320160831-1555) を起動しています
[AUDIT   ] CWWKE0001I: サーバー server1 が起動されました。
[AUDIT   ] CWWKE0100I: この製品は、開発使用向け、および限定的な実動使用向けにライセンスが交付されています。 全ライセンス条項は以下で表示可能です: https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/wasdev/license/base_ilan/ilan/16.0.0.3/lafiles/ja.html
[警告      ] CWWKS3103W: ID com.ibm.ws.security.registry.basic.config[basic] の BasicRegistry 構成に定義されたユーザーがありません。
[AUDIT   ] CWWKZ0058I: アプリケーションの dropins をモニター中です。 
[AUDIT   ] CWWKS4104A: LTPA 鍵が 0.523 秒で作成されました。 LTPA 鍵ファイル: C:/IBM/WebSphere/Liberty/usr/servers/server1/resources/security/ltpa.keys
[AUDIT   ] CWWKT0016I: Web アプリケーションが使用可能です (default_host): http://localhost:9080/BookListApplication/
[AUDIT   ] CWWKZ0001I: アプリケーション BookListApplication が 0.387 秒で開始しました。
[AUDIT   ] CWWKF0012I: サーバーは次のフィーチャーをインストールしました。[jsp-2.3, ejbLite-3.2, managedBeans-1.0, jsf-2.2, beanValidation-1.1, servlet-3.1, ssl-1.0, jndi-1.0, localConnector-1.0, jsonp-1.0, appSecurity-2.0, jdbc-4.1, jaxrs-2.0, jaxrsClient-2.0, el-3.0, json-1.0, cdi-1.2, distributedMap-1.0, webProfile-7.0, websocket-1.1, jpa-2.1]。
[AUDIT   ] CWWKF0011I: サーバー server1 は、Smarter Planet に対応する準備ができました。
```

ブラウザを起動し、「[http://localhost:9080/BookListApplication/BookList](http://localhost:9080/BookListApplication/BookList)」にアクセスします。以下の通り、サンプルデータが表示されれば、稼働確認は完了です。
![Local-02.png](https://qiita-image-store.s3.amazonaws.com/0/73397/70e47bac-ee71-dfc8-c70e-7bedae43aee8.png "Local-02.png")


# Bluemixへのデプロイと稼働確認
BluemixへのデプロイをEclipseから実施します。WAS Libertyのサーバーと同じように、Eclipse上にBluemixのサーバーを作成することで、EclipseからBluemixに対してアプリケーションをデプロイできるようになります。

EclipseのServerの空白のスペースの部分を右クリックし、「New」→「Server」と選択します。
作成するサーバーの種類を、「Select the server type:」から選択します。「IBM」フォルダにある「Bluemix」を選択し、「Next」をクリックしてください。
![Bluemix-01.png](https://qiita-image-store.s3.amazonaws.com/0/73397/d10d48d7-da9c-c5b5-16b4-db03a7cbdaaf.png "Bluemix-01.png")

Bluemixにログインする際に利用するメールアドレスを「Email:」に、パスワードを「Password:」に入力し、「Next」をクリックしてください。
「URL:」の部分は、Bluemixのデプロイ先の「地域（Region）」です。デフォルトで米国南部に相当する[https://api.ng.bluemix.net](https://api.ng.bluemix.net)が選択されています。デフォルトのままでよいですが、英国を利用したい方は、プルダウンより「IBM Bluemix (United Kingdom)」を、シドニーを利用したい方は、プルダウンより「IBM Bluemix (Sydney)」を選択してください。
![Bluemix-02.png](https://qiita-image-store.s3.amazonaws.com/0/73397/944c5d2a-80cc-67dc-eb66-8bb50e894e2d.png "Bluemix-02.png")

デプロイ先のスペースの選択画面が表示されます。複数のスペースを作成されている方は、デプロイしたいスペースを選択し「Finish」をクリックします。1つしかスペースがない方は、そのまま「Finish」をクリックします。
![Bluemix-03.png](https://qiita-image-store.s3.amazonaws.com/0/73397/4f615014-c269-8311-aec4-56c61b94e600.png "Bluemix-03.png")

EclipseにBluemixのサーバーが登録されました。
![Bluemix-04.png](https://qiita-image-store.s3.amazonaws.com/0/73397/6465d179-463c-ba05-5a1a-79fb7a19d710.png "Bluemix-04.png")

サンプル・アプリケーションをBluemixに関連付けます。WAS Libertyでの関連付けと同様に、サーバーを右クリックし、「Add and Remove...」より、サンプル・アプリケーションを関連付けしてください。

関連付けを実施すると、Bluemixが必要とする情報の入力を求められます。
まず最初に、Bluemix上のアプリケーション名を入力します。Bluemix上ですでに同じ名前のアプリケーションを使っていなければ、変更する必要はありません。「Next」をクリックします。
![Bluemix-05.png](https://qiita-image-store.s3.amazonaws.com/0/73397/8b23a5f1-dc80-fad1-82ad-0dc2c2e9736f.png "Bluemix-05.png")

続いてホスト名を指定します。デフォルトでアプリケーション名が使用されますが、このままでは他のユーザーの方とURLが同じになってしまい、デプロイに失敗します。ユーザー名や適当な文字列を追加するなどして、一意の名前となるように変更してください。入力後、「Finish」をクリックします。
なお、ここで表示されている「Deployed URL:」の値が、アプリケーションのURLとなります。後ほどの稼働確認で利用しますので、確認しておいてください。
![Bluemix-06.png](https://qiita-image-store.s3.amazonaws.com/0/73397/9f9b5bfd-dc5a-0afa-e257-2b2ccd6db69d.png "Bluemix-06.png")

Bluemixへのデプロイとアプリケーションの起動が始まりますので、しばらく待ちます。Serverビューに切り替わり、サンプル・アプリケーションが「Deployed [started, Synchronized]」と表示されていれば、Bluemixへのデプロイとアプリケーションの起動が正常終了しています。
![Bluemix-07.png](https://qiita-image-store.s3.amazonaws.com/0/73397/17c9c576-da78-559c-97ea-51a0ad9dccfc.png "Bluemix-07.png")

アプリケーションの稼働を確認します。
ブラウザを起動し、先ほど確認した「Deployed URL:」の後ろに、「/BookList」をつけたURLにアクセスします。
今回の例ですと「[http://booklistapplication-20151120.mybluemix.net/BookList](http://booklistapplication-20151120.mybluemix.net/BookList)」となります。
WAS Libertyの稼働確認の際は、「/BookListApplication」というコンテキスト・ルートになっていましたが、Bluemixの稼働確認の際には不要です。これは、WAS Libertyの設定として、プロジェクト名がコンテキスト・ルートになるように、デフォルトで自動設定されるためです。

WAS Libertyでの稼働確認と同じ画面が表示されれば、稼働確認は完了です。


# 最後に

以上で、シンプルなJSPとServletのプログラムの開発と確認は完了です。
今回は、テスト・データをプログラムに記載ましたが、次回は、このテスト・データをBluemix上のSQL Databaseより取得するように修正します。

（2016/01/08 追記）
第3回目の[データベースサービスを利用するプログラムの開発](http://qiita.com/asmanabu/items/6d44803c38e3769bb42f)を投稿しました。

（2016/09/22 追記）
Libertyの最新版リリースに合わせて一部表現と画面キャプチャを修正しました。