ページの先頭行へ戻る
Interstage Studio Java EEワークベンチユーザーズガイド

4.2.3 開発手順

以下に、実際にアプリケーションを開発する手順を説明します。

1) データベースの準備

2) 永続ユニットの作成

3) Entityの作成

4) ロジッククラスの作成

5) EARプロジェクトの作成

6) Webアプリケーションの作成

7) Interstage Application ServerのJDBC設定

8) アプリケーションの動作確認

9) 運用環境へのアプリケーションの配布

1) データベースの準備

データベースはSymfoware Serverを使用します。国名と総人口のデータを格納するデータベースのテーブルを作成し、アプリケーションの実行に必要なデータを挿入します。また、ワークベンチからデータベースに接続できる環境を整える必要があります。
これらについては、"6.2 入門"で説明していますので、そちらを参照してください。

2) 永続ユニット作成

2-1) JPAプロジェクトの作成

メニューバーから[ファイル] > [新規] > [プロジェクト]を選択すると、[新規プロジェクト]ウィザードが表示されます。

新規プロジェクトウィザードから[JPA] > [JPA プロジェクト]を選択して、[次へ]をクリックします。

以下の設定項目を確認、入力してください。

設定項目

設定内容

プロジェクト名

JPASample

ターゲットランタイム

Interstage Application Server V9.2 IJServer Cluster (Java EE)

構成

Interstage Application Server V9.2 IJServer Cluster (Java EE) デフォルト構成

情報を設定後、[次へ]をクリックしてください。 [JPA ファセット]ページが表示されます。

以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックしてください。

設定項目

設定内容

プラットフォーム

汎用

接続

Symfoware_Studio

接続からデフォルトスキーマを上書きする

チェックしない

サーバランタイムが提供する実装を使用

チェックする

注釈されたクラスを自動的に検出する

チェックする

orm.xml の作成

チェックしない

ポイント

[接続]には、データベースに接続している接続プロファイルを指定することで、データベースのテーブルやカラムの情報をJPA詳細ビューなどで利用することができます。

2-2) persistence.xmlファイルの編集

Entityに関連付けるデータベースのJDBC Resourceをpersistence.xmlに記述します。
作成したプロジェクト(JPASample)を選択して、[src] > [META-INF] > [persistence.xml]をダブルクリックして永続化 XMLエディタで開きます。
永続化 XMLエディタの[接続]タブを選択して、JDBC Resourceの定義を以下のように設定します。

設定項目

設定内容

トランザクションタイプ

JTA

JTA データソース名

jdbc/Symfo

3) Entityの作成

データベースのテーブルとマッピングするEntityを作成します。

ポイント

以下では、JPA構造ビューとJPA詳細ビューの使用方法を説明するため、Javaクラスを作成して、それにデータベースを対応付ける方法を説明していますが、データベースのテーブルからEntityを生成することもできます。詳細は、"4.3.3.4 テーブルからエンティティクラスを生成する"を参照してください。

3-1)エンティティの作成

作成したプロジェクトを選択して、右クリックでコンテキストメニューから[新規] > [その他]を選択すると、新規ウィザードが表示されます。

新規ウィザードから[JPA] > [エンティティ]を選択して、[次へ]をクリックします。

以下の設定項目を確認、入力してください。

設定項目

設定内容

プロジェクト

JPASample

ソースフォルダ

¥JPASample¥src

Java パッケージ

sample

クラス名

CountryData

継承

エンティティ

XMLのエンティティマッピングに追加

チェックしない

情報を設定後、[次へ]をクリックしてください。[エンティティプロパティ]ページが表示されます。

以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックしてください。

設定項目

設定内容

エンティティ名

CountryData

デフォルトを使用

チェックしない

テーブル名

C_DATA

エンティティフィールド

以下のフィールドを追加します

アクセスタイプ

フィールドベース

キー

名前

チェックする

id

int

チェックしない

countryName

java.lang.String

チェックしない

totalPopulation

int

3-2) テーブルとの関連付け

EntityのCountryDataクラスとデータベースのC_DATAテーブルを関連付けます。[JPA構造]ビューでCountryDataクラスが選択されていることを確認します。[JPA詳細]ビューで[テーブル]グループの[名前]に"C_DATA"が設定されていることを確認します。

ポイント

データベースに接続していない場合にはコンボボックスに候補は表示されませんが、テーブル名を直接指定することはできます。

以下の設定項目を確認、選択してください。

設定項目

設定内容

名前

デフォルト (CountryData)

テーブル:名前

C_DATA

テーブル:カタログ

デフォルト ()

テーブル:スキーマ

STUDIO

3-3) カラムとの関連付け

エンティティフィールドとテーブルのカラムを関連付けます。

各フィールドは、以下の表のようにカラムと対応付けます。

フィールド

対応付け

カラム:名前

id

Id

ID

countryName

基本(デフォルト)

C_NAME

totalPopulation

基本(デフォルト)

T_POP

これまでの手順で以下のようなソースが作成されます。

CountryDataクラス

package sample;

import java.io.Serializable;
import java.lang.String;
import javax.persistence.*;
 
/**
 * Entity implementation class for Entity: CountryData
 *
 */
@Entity
@Table(name="C_DATA", schema = "STUDIO")
public class CountryData implements Serializable {

    @Id
    @Column(name="ID")
    private int id;
    @Column(name="C_NAME")
    private String countryName;
    @Column(name="T_POP")
    private int totalPopulation;
    private static final long serialVersionUID = 1L;

    public CountryData() {
        super();
    }
    public int getId() {
        return this.id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getCountryName() {
        return this.countryName;
    }
    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }
    public int getTotalPopulation() {
        return this.totalPopulation;
    }
    public void setTotalPopulation(int totalPopulation) {
        this.totalPopulation = totalPopulation;
    }

}

4) ロジッククラスの作成

データベースへの問合せなどを行うPopulationRankingクラスを作成します。

4-1) クラス作成

作成したプロジェクトを選択して、右クリックでコンテキストメニューから[新規] > [クラス]を選択します。新規Javaクラスウィザードが表示されます。

以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックしてください。

設定項目

設定内容

ソースフォルダ

JPASample/src

パッケージ

sample

名前

PopulationRanking

4-2) ロジッククラスの実装

Entityは、javax.persistence.EntityManagerクラスにより管理されています。このクラスを作成するjavax.persistence.EntityManagerFactoryクラスを引数にしたコンストラクタを追加します。PopulationRankingクラスはWebアプリケーションのサーブレットクラスで使用されるので、この引数はサーブレットクラスから渡されます。以下のコードをPopulationRankingクラスに追加します。

コンストラクタの追加

package sample;
import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; public class PopulationRanking { private EntityManager em; public PopulationRanking(EntityManagerFactory factory) { this.em = factory.createEntityManager(); } }

ポイント

必要な実装をコーディングした後にJavaエディタ上で右クリックし、コンテキストメニューから[ソース] > [インポートの編成]を行うと、プロジェクトに設定されたクラスパスに従った適切なimport文が挿入できます。

C_DATAテーブルからIDに対する総人口ランキングを取得するメソッドを追加します。C_DATAテーブルとマッピングしているCountryDataクラスを取得するには、EntityManagerインスタンスのfindメソッドを使用します。テーブルのデータが総人口の多い順番に格納されているので、順位とIDは同じ値になります。

以下のコードをPopulationRankingクラスに追加します。

総人口ランキングを取得するメソッドの追加

public CountryData getCountryData(int rank) {
    if (rank < 1 || rank > 10) {
        return null;
    }
    CountryData country = em.find(CountryData.class, rank);
    return country;
}

5) EARプロジェクトの作成

メニューバーから[ファイル] > [新規] > [プロジェクト]を選択すると、[新規プロジェクト]が表示されます。

新規プロジェクトウィザードから[Java EE] > [エンタープライズアプリケーションプロジェクト]を選択して、[次へ]をクリックします。

以下の設定項目を確認、入力してください。

設定項目

設定内容

プロジェクト名

JPAEARSample

ターゲットランタイム

Interstage Application Server V9.2 IJServer Cluster (Java EE)

EAR バージョン

5.0

構成

Interstage Application Server V9.2 IJServer Cluster (Java EE) デフォルト構成

情報を設定後、[次へ]をクリックしてください。 [エンタープライズアプリケーション]ページが表示されます。

以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックしてください。

設定項目

設定内容

Java EE モジュール依存関係

JPASample

コンテンツフォルダ

EarContent

Deployment Descriptorの生成

チェックしない

6) Webアプリケーションの作成

本来であればWebアプリケーションをクライアントとして作成するための手順が必要ですが、ここではサンプルをインポートしてJPAを使用する場合に重要なポイントを確認していきます。Webアプリケーションの作成についての詳細な手順を知りたい場合は、Webアプリケーションの"2.2 入門"を参照してください。

サンプルのインポートは次の手順で行います。
メニューから[ファイル] > [インポート]を選択します。表示されたインポートウィザードで[一般] > [既存プロジェクトをワークスペースへ]を選択します。[アーカイブファイルの選択]をチェックし、[参照]ボタンを押して、以下のファイルを選択します。

<Java EEワークベンチのインストールフォルダ>¥sample¥JPASample.zip

[プロジェクト]から[JPAClientSample]を選択し、[完了]をクリックしてください。
JPAClientSampleプロジェクトのインポート後に、JPAEARSampleプロジェクトを選択して、右クリックでコンテキストメニューから[プロパティ]を選択します。プロパティダイアログボックスの[Java EEモジュール依存関係]を選択し、JPAClientSampleをチェックしてEARにクライアントを追加します。

6-1) 動的Webプロジェクトの作成

クライアントとして動的Webプロジェクトを作成します。サンプルのインポートで代替済みのため、詳細は省略します。設定項目は以下を参考にしてください。

設定項目

設定内容

プロジェクト名

JPAClientSample

ターゲットランタイム

Interstage Application Server V9.2 IJServer Cluster (Java EE)

構成

Interstage Application Server V9.2 IJServer Cluster (Java EE) デフォルト構成

EARにプロジェクトを追加

チェックする

EARプロジェクト名

JPAEARSample

6-2) ビルドパスの設定

エンティティクラス(CountryData)やロジッククラス(PopulationRanking)を参照するためのビルドパス(クラスパス)を設定します。インポートしたサンプルプロジェクトでは設定済みです。
設定内容を確認するには、作成したプロジェクト(JPAClientSample)を選択して、右クリックでコンテキストメニューから[プロパティ]を選択します。プロパティダイアログボックスの[Java EEモジュール依存関係]を選択して、[Java EEモジュール]タブを表示します。

以下がチェックされていることを確認します。

設定項目

設定内容

JAR/モジュール

JPASample.jar

6-3) サーブレットクラスの作成

サーブレットクラスを作成します。インポートしたサンプルプロジェクトでは以下のような設定項目で作成済みです。

設定項目

設定内容

Java パッケージ

sample

クラス名

ServletController

スーパークラス

javax.servlet.http.HttpServlet

作成するメソッドスタブの選択

スーパークラスからのコンストラクタ
継承された抽象メソッド
doPost(doGetのチェックを外す)

6-4) Dependency Injection指定

ロジッククラスを呼び出すための実装をサーブレットクラスに行います。インポートしたサンプルプロジェクトのサーブレットソースには実装済みです。
PopulationRankingクラスを作成するためには、コンストラクタにjavax.persistence.EntityManagerFactoryが必要になります。EntityManagerFactoryのフィールドを作成して、以下のようにPersistenceUnitアノテーションを設定し、Dependency Injectionの指定を行います。

PersistenceUnitアノテーションの定義

@PersistenceUnit
private EntityManagerFactory emf;

ポイント

J2EE1.4までのlookupメソッドの代わりに、Java EEではDependency Injectionを利用することで、オブジェクトを取得して使用することができます。(オブジェクトは実行時に自動的にJava EEコンテナによってフィールドに設定されます。)

6-5) サーブレットクラス実装

以下のようにロジッククラスのインスタンスを作成し、メソッドを呼び出します。インポートしたサンプルプロジェクトのサーブレットソースには実装済みです。

Entityの呼び出しメソッドの定義

PopulationRanking ranking = new PopulationRanking(emf);
CountryData country = ranking.getCountryData(rank);

実装を行ったサーブレットクラスは以下のようになります。(インポートしたプロジェクトのサーブレットソースは、この形式になっています。)
太字の部分が追加した定義になります。

サーブレットクラス(ServletController.java)

package sample;

import java.io.IOException;

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.RequestDispatcher;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 

/**
 * Servlet implementation class ServletController
 */
public class ServletController extends javax.servlet.http.HttpServlet {
    private static final long serialVersionUID = 1L;

    //@PersistenceUnit
    @PersistenceUnit
    private EntityManagerFactory emf;

   /**
    * @see HttpServlet#HttpServlet()
    */
    public ServletController() {
        super();
        // TODO Auto-generated constructor stub
    }

   /**
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("Windows-31J");
        ServletContext sc = getServletContext();

        // 呼び出すファイル種別取得
        String mode = request.getParameter("mode");
        if (mode != null && mode.equals("top")) {
            // 入力画面のHTMLファイル呼出し
            RequestDispatcher inRd = getServletContext().getRequestDispatcher("/default.jsp");
            inRd.forward(request, response);
            return;
        }

        int rank;

        // 入力チェック
        try{
            rank = Integer.parseInt(request.getParameter("rank"));
        } catch (NumberFormatException e){
            RequestDispatcher errRd = sc.getRequestDispatcher("/error.jsp");
            errRd.forward(request, response);
            return;
        }

        PopulationRanking ranking = new PopulationRanking(emf);
        CountryData country = ranking.getCountryData(rank);

        //取得した値の確認
        if(country == null){
            RequestDispatcher errRd = sc.getRequestDispatcher("/error.jsp");
            errRd.forward(request, response);
            return;
        }

        sc.setAttribute("ranking", country);

        RequestDispatcher outRd = sc.getRequestDispatcher("/result.jsp");
        outRd.forward(request, response);
    }
}

ポイント

必要な実装をコーディングした後にJavaエディタ上で右クリックし、コンテキストメニューから[ソース] > [インポートの編成]を行うと、プロジェクトに設定されたクラスパスに従った適切なimport文が挿入できます。

6-6) 入出力画面の作成

入出力画面のJSPを作成します。インポートしたサンプルプロジェクトでは以下のようなファイルを作成済みです。

入力画面(default.jsp)

<%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!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=windows-31j">
<title>世界総人口ランキング</title>
</head>
<body>
<h1>入力画面</h1>
<p>1~10の間で順位を入力してください。</p>
<p></p>
<form action="ServletController" method="post">
    順位:<br>
    <input name="rank" type="text" size="10">位<br>
    <p></p>
    <input type="submit" value="OK">
    <input type="reset" value="クリア">
</form>

</body>
</html>

出力画面(result.jsp)

<%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!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=windows-31j">
<title>世界総人口ランキング</title>
</head>
<body>
<h1>出力画面</h1>

総人口ランキング${param.rank}位は「${applicationScope.ranking.countryName}」です。<br>
総人口は${applicationScope.ranking.totalPopulation}人です。
<br>
<hr>
<form action="ServletController" method="post">
    <input type="submit" value="入り口に戻る">
    <input type="hidden" name="mode" value="top">
</form>
</body> </html>

エラー画面(error.jsp)

<%@ page language="java" contentType="text/html; charset=windows-31j"
    pageEncoding="windows-31j"%>
<!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=windows-31j">
<title>世界総人口ランキング</title>
</head>
<body>

<h1>エラー画面</h1>
指定された範囲内の順位が入力されていないか、またはサーバエラーです。<br>
<br>
<hr>
<form action="ServletController" method="post">
    <input type="submit" value="入り口に戻る">
    <input type="hidden" name="mode" value="top">
</form>

</body>
</html>

7) Interstage Application ServerのJDBC設定

Java EEコンテナからSymfowareデータベースを使用できるように、Interstage Application Serverの管理コンソールでJDBCの設定をします。

Interstage管理コンソールの起動の仕方および使用方法については、Interstage Application ServerのJava EE実行環境の使用方法を別途ご確認ください。

7-1) JDBC Console Poolの作成

SymfowareのJDBC Connection Poolを作成します。左のペインから[リソース] > [JDBC] > [接続プール]を選択すると、[接続プール]ページが表示されます。

[新規...]をクリックして、以下の設定項目を入力してください。

設定項目

設定内容

名前

SymfoPool

リソースタイプ

javax.sql.ConnectionPoolDataSource

データベースベンダー

空白

情報を設定後、[次へ]をクリックしてください。

次のページでは、以下の設定項目を入力してください。

設定項目

設定内容

データソースクラス名

com.fujitsu.symfoware.jdbc2.SYMConnectionPoolDataSource

最後の行にある[追加プロパティ]で、プロパティを追加します。プロパティの追加は[プロパティを追加]をクリックします。以下の設定項目の入力が完了したら、[完了]をクリックします。

設定項目

設定内容

User

データベースにアクセスするためのユーザIDを指定します

Password

ユーザ名に対するパスワードを指定します

PortNumber

2050

networkProtocol

symford

DatabaseName

COUNTRYDATA

serverName

myhost

7-2) JDBC Resourceの作成

作成したJDBC Console Poolに対応するJDBC Resourceを作成します。左のペインから[リソース] > [JDBC] > [JDBCリソース]を選択すると、[JDBCリソース]ページが表示されます。[新規...]をクリックすると、[新しい JDBC リソース]ページが表示されます。

以下の設定項目を入力してください。

設定項目

設定内容

JNDI 名

jdbc/Symfo

プール名

SymfoPool

ターゲット(選択したターゲット)

MyDebugJEE

7-3) JDBCドライバのクラスパスの設定

Symfoware JDBCドライバをクラスパスに設定します。左のペインから[設定] > [MyDebugJEE-config] > [JVM 設定]を選択すると、[JVM 一般設定]ページが表示されます。[パス設定]タブをクリックして、以下の設定をします。

以下の設定項目を入力してください。

設定項目

設定内容

クラスパスのサフィックス

C:/SFWCLNT/JDBC/fjjdbc/lib/fjsymjdbc2.jar

ネイティブライブラリのサフィックス

C:/SFWCLNT/JDBC/fjjdbc/bin

8) アプリケーションの動作確認

8-1) プロジェクトとサーバの関連付け

サーバビューでサーバを選択し、コンテキストメニューから[プロジェクトの追加および除去]を選択してください。
使用可能なプロジェクトから作成したEARプロジェクトを選択し、[追加]をクリックしてください。構成プロジェクトにEARプロジェクトが追加されていることを確認してください。

以下の情報を確認後、[完了]をクリックしてください。

設定項目

設定内容

構成プロジェクト

JPAEARSample

ポイント

サーバビューに配備先となるサーバが登録されていない場合は、サーバを追加する必要があります。サーバを追加する方法については、"7.2.6 アプリケーションの動作確認"を参照してください。

8-2) ブレークポイントの設定

ロジッククラスのgetCountryData()メソッドの先頭行にブレークポイントを設定します。ブレークポイントは、エディタの左側のルーラー部分をダブルクリックして、設定もしくは解除します。

8-3) サーバの起動

サーバビューでサーバを選択し、コンテキストメニューから[デバッグ]を選択してください。

ポイント

デバッガを使用せず単純にアプリケーションを起動したい場合には、コンテキストメニューから[開始]を選択します。

サーバが起動する前に自動的にEARファイルが配備されます。

サーバビューで以下の情報を確認してください。

確認項目

確認内容

サーバの状態

始動済み

サーバの状況

同期済み

EARファイル(JPAEARSample)の状況

同期済み

EARファイル配下のJARファイル(JPASample)の状況

同期済み

EARファイル配下のWARファイル(JPAClientSample)の状況

同期済み

8-4) アプリケーション実行

サーバビューで、配備されているWebプロジェクト(JPAClientSample)を選択して、コンテキストメニューから[Webブラウザ]を選択します。Webブラウザが起動されて、入力画面が開きます。

設定項目

設定内容

入力画面のURL

http://localhost/JPAClientSample/

[順位:]の入力フィールドに人口ランキングの順位を入力して、[OK]をクリックします。

ポイント

プロジェクトを選択し、コンテキストメニューから[実行] > [サーバで実行]または[デバッグ] > [サーバでデバッグ]を選択することで、サーバの追加、プロジェクトの追加、サーバの起動、クライアントの起動をまとめて行うことができます。
また、クライアントとして使用するWebブラウザは、メニュー [ウィンドウ] > [Web ブラウザ] から変更することができます。

8-5) アプリケーションのデバッグ

アプリケーションが動作し、ブレークポイントで中断されます。変数ビューの表示を確認します。メニューから[実行] > [ステップオーバ]を選択し、変数ビューでプログラムの状況を確認します。デバッグについては、"7.2.6.1 デバッグする"を参照してください。

ポイント

変数ビューでは値の確認だけでなく、変更も行うことができます。

デバッガで中断している処理は、メニューから[実行] > [再開]を選択することで再開され、サーバ側での処理が終了し、Webブラウザに出力画面が表示されます。入力した順位の国名と総人口が表示されることを確認してください。

9) 運用環境へのアプリケーションの配布

アプリケーションを運用環境に配布するには、EARファイルを作成する必要があります。作成したEARファイルは、サーバの配備機能を利用して、サーバに配備します。

9-1) アプリケーションエクスポート

EARファイルの作成は、エクスポートウィザードから行います。エクスポートウィザードを起動するには、[ファイル] > [エクスポート]を選択してください。[エクスポート]から[Java EE] > [EARファイル]を選択してください。

EARファイルエクスポートウィザードが表示されます。

以下の設定項目を確認、入力してください。以下の情報を設定後、[完了]をクリックしてください。

設定項目

設定内容

EARアプリケーション

エンタープライズアプリケーションプロジェクトを指定します。

宛先

EARファイルの作成先を指定します。

9-2) 運用環境に配備する

運用環境のInterstage管理コンソールにログインし、ローカルにあるEARファイルを指定することにより、リモート環境から運用環境に配備を行うことができます。