はじめに
BluemixのランタイムとしてLiberty for Javaを使用するための、開発環境の準備について記載します。
ローカルPCでWebSphere Application Server Liberty Profile(WAS Liberty)を稼働させ、ローカルPCで稼働確認したものをBluemixにPushすることを想定して記載します。
本内容は、以下の3回に分けて投稿する予定です。今回は、第2回目の「シンプルなJSPとServletのプログラムの開発」です。
前提
以下の内容が完了しているものとして記載します。
- IBM Bluemixのアカウント取得
- アカウント未取得の方は、「IBM Bluemixフリートライアルアカウント作成手順」を参考に、フリートライアル用アカウントを取得ください
- Eclipse IDE for Java EE Developersのダウンロード
- 今回は、Eclipse Neonを利用します
- Eclipseのダウンロードはこちらから
- Java JDK 1.8のインストール
- Liberty for Javaが使用するバージョンに合わせ、JDK 1.8を使用します
- Bluemix Liberty for Javaの開発環境を整える(1/3)に記載された、EclipseのセットアップとWAS Libertyの導入
作業の流れ
以下の流れで、作業を進めていきます。
- EclipseのDynamic Web Projectを作成し、JSPとServletからなるサンプル・アプリケーションを作成します
- サンプル・アプリケーションが稼働するように、WAS Libertyの設定を変更します
- ローカルPCでサンプル・アプリケーションを稼働させ、稼働を確認します
- サンプル・アプリケーションを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」をクリックし、表示される一覧から選択してください。
「Project name:」に、「BookListApplication」を入力します。続いて、「Target runtime」に、「WebSphere Application Server Liberty」が選択され、「Add project an EAR」のチェックボックスが外れていることを確認し、「Finish」をクリックします。
「BookListApplication」プロジェクトが作成されていることと、Java EEパースペクティブを開いていることを確認してください。別のパースペクティブになっている場合は、下図の青色の枠内のボタンをクリックして、Java EEパースペクティブを開きます。
Beanの作成
本の情報を保持するModel用クラスであるBook.javaを作成します。
Book.javaを格納するための、パッケージを作成します。「BookListApplication」の「Java Resources」の下にある「src」を右クリックし、「New」→「Package」を選択します。
「Name:」に「booklist.bean」と入力し、「Finish」をクリックします。
「booklist.bean」を右クリックし、「New」→「Class」を選択します。
「Name:」に「Book」と入力し、「Finish」をクリックしてください。
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」を選択します。
「Class name:」に「BookListServlet」と入力し、「Finish」をクリックします。
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」を選択します。
「File name:」に「result.jsp」を入力し、「Finish」をクリックします。
result.jspの文字コードが「ISO-8859-1」になっているため「UTF-8」に修正します。
result.jspを右クリックし、「Properties」を選択します。「Text file encoding」の「Other」にチェックを入れ、「UTF-8」を選択し、「OK」をクリックします。
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)」の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」をダブルクリックします。
WAS Libertyの設定変更ツールが起動します。「フィーチャー・マネージャー」をクリックし、右側に表示されるフィーチャーから「javaee-7.0」を選択し、「Remove」をクリックします。
続いて、同じ「フィーチャー・マネージャー」から「Add」をクリックし、表示されるフィーチャー選択画面の検索バーに「Webprofile」と入力します。表示される「webProfile-7.0」を選択し、「OK」をクリックしてください。
この作業で、WebProfileのみを使用するように構成できました。Ctrl-sで変更したファイルを保存します。
最後に、WAS Libertyのサーバーとサンプル・アプリケーションを関連付けます。
WAS Libertyのサーバーを右クリックし、「Add and Remove...」をクリックします。
「Available:」にある「BookListApplication」を選択し、「Add >」をクリックして「Configured:」に移動させます。
最後に「Finish」をクリックすれば、関連付けは完了です。
ローカルPCでの稼働確認
EclipseのServerビューで、WAS Libertyのサーバーを選択し、Serverビューの右上の実行ボタン(再生マークの絵)をクリックします。
以下のようなログが出力され、エラーコード(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」にアクセスします。以下の通り、サンプルデータが表示されれば、稼働確認は完了です。
Bluemixへのデプロイと稼働確認
BluemixへのデプロイをEclipseから実施します。WAS Libertyのサーバーと同じように、Eclipse上にBluemixのサーバーを作成することで、EclipseからBluemixに対してアプリケーションをデプロイできるようになります。
EclipseのServerの空白のスペースの部分を右クリックし、「New」→「Server」と選択します。
作成するサーバーの種類を、「Select the server type:」から選択します。「IBM」フォルダにある「Bluemix」を選択し、「Next」をクリックしてください。
Bluemixにログインする際に利用するメールアドレスを「Email:」に、パスワードを「Password:」に入力し、「Next」をクリックしてください。
「URL:」の部分は、Bluemixのデプロイ先の「地域(Region)」です。デフォルトで米国南部に相当するhttps://api.ng.bluemix.netが選択されています。デフォルトのままでよいですが、英国を利用したい方は、プルダウンより「IBM Bluemix (United Kingdom)」を、シドニーを利用したい方は、プルダウンより「IBM Bluemix (Sydney)」を選択してください。
デプロイ先のスペースの選択画面が表示されます。複数のスペースを作成されている方は、デプロイしたいスペースを選択し「Finish」をクリックします。1つしかスペースがない方は、そのまま「Finish」をクリックします。
サンプル・アプリケーションをBluemixに関連付けます。WAS Libertyでの関連付けと同様に、サーバーを右クリックし、「Add and Remove...」より、サンプル・アプリケーションを関連付けしてください。
関連付けを実施すると、Bluemixが必要とする情報の入力を求められます。
まず最初に、Bluemix上のアプリケーション名を入力します。Bluemix上ですでに同じ名前のアプリケーションを使っていなければ、変更する必要はありません。「Next」をクリックします。
続いてホスト名を指定します。デフォルトでアプリケーション名が使用されますが、このままでは他のユーザーの方とURLが同じになってしまい、デプロイに失敗します。ユーザー名や適当な文字列を追加するなどして、一意の名前となるように変更してください。入力後、「Finish」をクリックします。
なお、ここで表示されている「Deployed URL:」の値が、アプリケーションのURLとなります。後ほどの稼働確認で利用しますので、確認しておいてください。
Bluemixへのデプロイとアプリケーションの起動が始まりますので、しばらく待ちます。Serverビューに切り替わり、サンプル・アプリケーションが「Deployed [started, Synchronized]」と表示されていれば、Bluemixへのデプロイとアプリケーションの起動が正常終了しています。
アプリケーションの稼働を確認します。
ブラウザを起動し、先ほど確認した「Deployed URL:」の後ろに、「/BookList」をつけたURLにアクセスします。
今回の例ですと「http://booklistapplication-20151120.mybluemix.net/BookList」となります。
WAS Libertyの稼働確認の際は、「/BookListApplication」というコンテキスト・ルートになっていましたが、Bluemixの稼働確認の際には不要です。これは、WAS Libertyの設定として、プロジェクト名がコンテキスト・ルートになるように、デフォルトで自動設定されるためです。
WAS Libertyでの稼働確認と同じ画面が表示されれば、稼働確認は完了です。
最後に
以上で、シンプルなJSPとServletのプログラムの開発と確認は完了です。
今回は、テスト・データをプログラムに記載ましたが、次回は、このテスト・データをBluemix上のSQL Databaseより取得するように修正します。
(2016/01/08 追記)
第3回目のデータベースサービスを利用するプログラムの開発を投稿しました。
(2016/09/22 追記)
Libertyの最新版リリースに合わせて一部表現と画面キャプチャを修正しました。