10. JPAアプリケーションの開発

10.1. チュートリアル

WebOTX Developerでは、以下のプロジェクトで、JPAモジュールが利用できます。
本節では 以下の作成例について記述しています。 本手順を行う前に、 [アプリケーション開発ガイド(概要) > 1. Developer(with Developer's Studio) > 1.2. 環境設定] および、[10.1.1. JPA環境の準備] の設定を行ってください。

10.1.1. JPA環境の準備

本節で取り扱う事例で利用する、 について説明します。
アプリケーションを作成するプロジェクトに対する操作ですので、あらかじめ、プロジェクトを作成しておく必要があります。 その作成手順については、後述の各アプリケーションでの説明を参照してください。

10.1.1.1. JPAライブラリーのコンフィグレーション

本章のコンフィグレーションは[10.2.1.1. JPAライブラリーのコンフィグレーション]をご覧くらだい。

10.1.1.2. データベース接続の作成

「新規Derby」という接続が自動的に作成されるので通常は手動での作成は不要です。 任意の操作で新規Derbyを削除した場合、手動での作成方法は[10.2.1.2. データベース接続の新規作成]を参照してください。

10.1.1.3. テーブルの生成

テーブル定義用の SQL ファイルを作成し、実行することでテーブル定義を行います。
プロジェクト・エクスプローラーで、プロジェクト名の右クリックメニューの 新規 > ファイル を選択して、 新規ファイル 画面を開きます。
親フォルダーを入力または選択 と、 ファイル名 へ入力後、 完了 をクリックします。
なお、ここでの指定は、テーブル定義用に一時的に用いるSQL ファイルについての情報です。 テーブル作成後のプロジェクトの動作には影響しないので、適当なものを指定してください。
以下の記述では、 親フォルダーを入力または選択:TestWeb4JPA/src/test/jpa、ファイル名:createTable.sql を指定したものとして、 説明します。


図10.1.1.1-1

JPAプロジェクトTestWeb4JPAに作成された、 createTable.sqlがエディタで開かれます。


図10.1.1.1-2

createTable.sqlファイルの接続プロファイルに、
表3.1.16.4-1
属性
タイプ Derby_10.x
名前 新規 Derby
データベース MyDB
を設定し、 状態接続であることを確認し、以下の内容を入力します。
drop table STUDENT;
create table STUDENT (
  ID integer not null primary key,
  MYLOCK integer,
  NAME VARCHAR(30),
  SPORT VARCHAR(30)
);
insert into STUDENT values(100, 10, 'WangHaidong', 'BasketBall');


図10.1.1.1-3

エディタで、createTable.sqlファイルの、create、insert のSQL文命令を順次選択して、右クリックメニュー の 選択したテキストを実行 を選択します。


図10.1.1.1-4

実行後、テーブルが作成されています。


図10.1.1.1-5

10.1.2. コンソールアプリケーションの作成

10.1.2.1. テスト用JPAプロジェクトの作成

新規 JPA プロジェクトウィザードを利用して、JPAプロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト 画面を開きます。
JPA を選択し JPAプロジェクト を選択し、 次へ をクリックします。


図10.1.2.1-1

JPAプロジェクト 画面が表示されます。

プロジェクト名 に新規プロジェクト名 JpaConsoleSampleを入力します。
ターゲット・ランタイムで WebOTX Application Server v9(Local Default) を選択します。
JPA バージョン が自動的に 2.0 となるのを確認した後、次へ をクリックします。

ターゲット・ランタイムが存在しない場合、 [アプリケーション開発ガイド(概要) > 1. Developer(with Developer's Studio) > 1.2. 環境設定 > 1.2.4. テスト用サーバの設定 > 1.2.4.1. WebOTXランタイムの設定]を参照の上、設定を行ってください。

Java 画面で次へ をクリックすると、 JPA ファセット 画面が表示されます。


図10.1.2.1-2

プラットフォームを WebOTX JPA2.0 にします。
JPA実装ユーザ・ライブラリーを選択して、 WebOTX JPA を選択します。
接続 に 新規Derby を選択します。
ビルド・パスドライバー・ライブラリーを追加を ON にして、 ドライバーに Derby 組み込みド JDBC ライバー 10.2 デフォルト を選択します。

Memo
ユーザー・ライブラリーに何もリストされていない場合、 [10.2.1.1. JPAライブラリーのコンフィグレーション]を参照してWebOTX JPAライブラリーを追加してください。

完了ボタンをクリックすると、JpaConsoleSampleプロジェクトが作成されます。


図10.1.2.1-3

10.1.2.2. エンティティークラスの生成

プロジェクトでの エンティティークラスの作成方法について説明します。

プロジェクト・エクスプローラーで、プロジェクトの右クリックメニューの JPA ツール > テーブルからエンティティーを生成 を選択します。


図10.1.2.2-1

テーブルの選択 画面が表示されるので、 接続 コンボボックスから 新規 Derby を選択します。
スキーマを選択し、 テーブル リストの STUDENT を ON にします。
Update class list in persistence.xml も ON にします。


図10.1.2.2-2

完了をクリックすると、エンティティークラス Student.javaが作成されます。


図10.1.2.2-3

Memo
データベースの準備が前提となりますので、[10.1.1.3. テーブルの生成] が実施済みである必要があります。 他のプロジェクトなどで、既に実施済みの場合は不要です。

10.1.2.3. コンソールアプリケーションの作成

コンソールアプリケーションの作成方法について説明します。
プロジェクト・エクスプローラーで、エンティティークラス Student.javaの右クリックメニューのJPA ツール > エンティティーからコンソールアプリケーションを生成 を選択します。


図10.1.2.3-1

コンソールアプリケーションの作成 画面が表示されます。
プロジェクトに JpaConsoleSample が選択され、 エンティティークラスに model.Student が選択され、 トランサンクションに EntityTransction が選択され、 エンティティーマネジャーファクトリーに 生成する が選択されることを確認します。


図10.1.2.3-2

完了をクリックして、接続の選択画面が表示されます。


図10.1.2.3-3

新規Derbyを選択し、完了をクリックすると、JPAコンソールアプリケーションが作成されます。


図10.1.2.3-4

10.1.2.4. persistence.xmlの設定

Memo
コンソールアプリケーションの作成ウィザード等で、既にDB接続を設定している場合、再度、persistence.xmlへDB接続を設定する必要はありません。その場合、次の[10.1.2.5. ビルド・パスの変更及びライブラリーの追加]の節に進んでください。

プロジェクト・エクスプローラーで、プロジェクトの右クリックメニューのJPA ツール > persistence.xmlへDB接続を設定 を選択します。


図10.1.2.4-1

トランサンクション・タイプに リソース・ローカル を選択し、 DB接続に 新規 Derby を選択して、完了をクリックします。

設定後の、persistence.xmlファイルの例は以下の通りです。
"javax.persistence.jdbc.driver" 以外の指定は、環境設定により異なりますので、適宜、適切な値を指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JpaConsoleSample" transaction-type="RESOURCE_LOCAL">
    <class>model.Student</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:C:\MyDB;create=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
    </properties>
  </persistence-unit>
</persistence>

10.1.2.5. ビルド・パスの変更及びライブラリーの追加

Memo
プロジェクトの作成時に、ビルド・パスにドライバー・ライブラリーを追加を選択している場合、 再度、データベースのドライバーを追加する必要はありません。その場合、プロジェクト・ツリーに、Derby 組み込み JDBC ドライバーが表示されている事を確認の上、 次の、[10.1.2.6. テストの実行]の節に進んでください。

プロジェクト・エクスプローラーで、プロジェクトJpaConsoleSampleの右クリックメニューで プロパティー を選択します。
表示された画面で Java のビルド・パスを選択し、 ライブラリー タブを開き、 ライブラリーの追加 をクリックします。
ライブラリーの追加 画面のリストから 接続ドライバー定義を選択し、 次へをクリックします。


図10.1.2.5-1

接続ドライバー定義 画面で 使用可能なドライバー定義 から Derby 組み込み JDBC ドライバー 10.2 デフォルト を選択し、 完了をクリックします。


図10.1.2.5-2

ライブラリー タブに Derby 組み込み JDBC ドライバー が追加されているのを確認後、 OKをクリックします。


図10.1.2.5-3

パッケージ・エクスプローラーでも Derby 組み込み JDBC ドライバー ライブラリーが追加されたことを確認します。


図10.1.2.5-4

10.1.2.6. テストの実行

データ・ソース・エクスプロラーで、新規 Derby を切断します。
その後で、StudentConsole.javaの右クリックメニューの実行 > Javaアプリケーションをクリックします。


図10.1.2.6-1

コンソールアプリケーションは正しく実行されると、下記の結果が表示されます。


図10.1.2.6-2

10.1.3. Web アプリケーションの作成

10.1.3.1. テスト用Webプロジェクトの作成

動的 Web プロジェクト生成ウィザードを利用して、動的Webプロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト 画面を開きます。
Web > 動的Web プロジェクト を選択して、 次へをクリックします。


図10.1.3.1-1

新規動的 Web プロジェクト 画面が表示されます。

プロジェクト名 に新規プロジェクト名 TestWeb4JPAを入力します。
ターゲット・ランタイムで WebOTX Application Server v9(Local Default) を選択します。
ターゲット・ランタイムが存在しない場合、 [アプリケーション開発ガイド(概要) > 1. Developer(with Developer's Studio) > 1.2. 環境設定 > 1.2.4. テスト用サーバの設定 > 1.2.4.1. WebOTXランタイムの設定]を参照の上、設定を行ってください。

構成変更... をクリックします。


図10.1.3.1-2

プロジェクト・ファセット 画面が表示されます。
動的 Web モジュールファセットのバージョンを 3.0にします。
Java ファセットのバージョンを 1.7にします。
JPA ファセットを ONにして、バージョンを 2.0にします。
OKをクリックします。


図10.1.3.1-3

新規動的 Web プロジェクト画面に戻ります。
次へをクリックすると、 Java画面が表示されます。


図10.1.3.1-4

次へをクリックすると、 JPA ファセット 画面が表示されるので以下を指定します。


図10.1.3.1-5

表10.1.3.1-1
属性
プラットフォーム WebOTX JPA 2.0
JPA 実装 WebOTX JPA を選択
接続 新規 Derby
ビルド・パスにドライバー・ライブラリーを追加 非選択
注釈つきクラスをpersistence.xml に記述 選択
Create mapping file 非選択

Memo
ユーザー・ライブラリーの何もリストされていない場合、 [10.2.1.1.JPAライブラリーのコンフィグレーション]を参照してWebOTX JPAライブラリーを追加してください。

次へをクリックすると、 Web モジュール画面が表示されます。
web.xmlデプロイメント記述子の生成 をONにします。
完了をクリックします。 


図10.1.3.1-6

WebプロジェクトTestWeb4JPAが作成されます。


図10.1.3.1-7

10.1.3.2. エンティティークラスの生成

ここで利用する Entity クラスは、 [10.1.2.2. エンティティークラスの生成] で作成したものと同じです。

10.1.3.3. エンティティーオペレータの作成

エンティティークラス Student.javaの右クリックメニューの JPAツール > エンティティーオペレータクラスを作成 をクリックし、 エンティティーオペレータクラスの作成画面が表示されます。

プロジェクトに TestWebJPA が選択され、 エンティティークラスに model.Student が選択され、 トランサンクションに EntityTransaction が選択され、 エンティティーマネージャーファクトリーに 生成する が選択されるを確認します。


図10.1.3.3-1

完了をクリックし、接続の選択画面が表示されます。


図10.1.3.3-2


完了をクリックし エンティティーオペレータクラスが作成されます。


図10.1.3.3-3


10.1.3.4. JSPファイルの作成

JSP生成ウィザードを使って、テスト用index.jspファイルを作成します。
パッケージ・エクスプローラーで、プロジェクトTestWeb4JPAの右クリックメニューの 新規 > その他... を選択します。
ウィザードを選択 画面が表示されます。
Web > JSP を選択して、 次へをクリックします。


図10.1.3.4-1

新規 JSP ファイル画面が表示されます。
親フォルダーを入力または選択 にTestWeb4JPA\WebContentを入力します。
ファイル名 にindex.jspを入力します。
完了をクリックします。


図10.1.3.4-2

TestWeb4JPAプロジェクトにindex.jspファイルが追加されます。


図10.1.3.4-3

動作時の index.jspの外観は以下の通りです。


図10.1.3.4-4

また、以下の JavaScript の関数を実装しています。
表3.1.19.4-1
処理 javascript ボタン
一覧表示 getDbInfo() Inquire
データの挿入 insertInfoToDb() insert
データの削除 deleteInfoFromoDb() Delete
初期化 initialize() -
結果出力 updatePage() -
ボタン押下時の、各データベース操作は独立した処理で、それらを一つの JSP に記載した結果、 index.jspの全体像は、以下のようになります。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>TestWeb4JPA</title>
<script language="javascript" type="text/javascript">

   var request = false;
   
   function initialize(){
      try {
        request = new XMLHttpRequest();
      } catch (trymicrosoft) {
        try {
          request= new ActiveXObject("Msxml2.XMLHTTP");
        } catch (othermicrosoft){
          try {
            request= new ActiveXObject("Microsoft.XMLHTTP");
          }catch (failed) {
            request=false;
        }
      }
    }
    if (!request) alert("Error initializing XMLHttpRequest!");
  }
  
  /* Insert Button */
  function insertInfoToDb() {
    var idForInert =document.getElementById("idForInert").value;
    var myLock =document.getElementById("myLock").value;
    var name =document.getElementById("name").value;
    var sport =document.getElementById("sport").value;
    if (isNaN(idForInert) || idForInert == null || idForInert=="") {
      alert("Id must is a number");
      return;
    }
    if (isNaN(myLock) || myLock == null || myLock =="") {
      alert("my Lock must is a number");
      return;
    }
    var commonad = "<request><command name=\"insert\">" + "<param id=\"" +
    idForInert + "\" myLock=\"" + myLock + "\" name=\"" +
    name + "\" sport=\"" + sport + "\" /></command></request>";
    var url = "TestServlet";
    request.open("POST",url, true);
    request.onreadystatechange =updatePage;
    request.send(commonad);
  }
  
  /* Inquire Button */
   function getDbInfo() {
    var myLock =document.getElementById("myLock").value;
    var name= document.getElementById("name").value;
    var sport= document.getElementById("sport").value;
    var commonad= "<request><command  name=\"inquire\">"+
                 "<parammy  Lock=\"" + myLock + "\"  name=\"" + name +
                 "\"  sport=\"" + sport + "\"/></command></request>";
    var url= "TestServlet";
    request.open("POST",url,true);
    request.onreadystatechange =updatePage;
    request.send(commonad);
  }
  
  /* Delete Button */
  function deleteInfoFromoDb() {
    var studentId =document.getElementById("studentId").value;
    if(isNaN(studentId)|| studentId == null || studentId==""){
      alert("IDmust is a number");
      return;
    }
    var commonad ="<request><command name=\"delete\">" +
                "<param studentId=\"" + studentId + "\"/></command></request>";
    var url = "TestServlet";
    request.open("POST",url, true);
    request.onreadystatechange =updatePage;
    request.send(commonad);
  }
  
  /* View Update */
  function updatePage() {
   if (request.readyState== 4) {
      if (request.status== 200) {
        var response =request.responseText;
        document.getElementById("resultFromDb").innerHTML= response.replace(/\n/g, "");
        document.getElementById("studentId").disabled=false;
        document.getElementById("deleteButton").disabled=false;
      }else {
        alert("status is " + request.status);
      }
    }
  }
</script>
</head>

<body onLoad="initialize();">
<h1>TestWeb4JPA</h1>
    <table>
      <tr>
        <th bgColor="palegreen"></th>
        <th bgColor="palegreen">ID</th>
        <th bgColor="palegreen">MYLOCK</th>
        <th bgColor="palegreen">NAME</th>
        <th bgColor="palegreen">SPORT</th>
      </tr>
      <tr>
        <td colspan="5">
          <input type="button" style="width: 80px" value="Inquire" onclick="getDbInfo();">
        </td>
      </tr>
      <tr>
         <td>
           <input type="button" style="width: 80px" value="Insert" onclick="insertInfoToDb();">
         </td>
         <td><input type="text" id="idForInert" size="5" maxlength="5"></td>
         <td><input type="text" id="myLock" size="5" maxlength="5"></td>
         <td><input type="text" id="name" size="15" maxlength="15"></td>
         <td><input type="text" id="sport" size="15" maxlength="15"></td>
      </tr>
      <tr>
        <td>
          <input type="button" id="deleteButton" style="width: 80px" value="Delete" onclick="deleteInfoFromoDb();" disabled="disabled">
        </td>
        <td  colspan="4"><input type="text" id="studentId" disabled="disabled" size="5" maxlength="5"></td>
      </tr>
    </table>
    <div id="resultFromDb"></div>
</body>
</html>

10.1.3.5. サーブレットの作成

サーブレット生成ウィザードを使って、テスト用サーブレットを作成します。
パッケージ・エクスプローラーで、プロジェクトTestWeb4JPAの右クリックメニューの 新規 > その他... を選択します。
ウィザードを選択 画面が表示されます。
Web > サーブレットを選択して、 次へをクリックします。


図10.1.3.5-1

サーブレット作成画面が表示されます。
Web プロジェクトでTestWeb4JPAを選択します。
ソース・フォルダーに\TestWeb4JPA\srcを入力します。
Java パッケージにtest.jpa.servletを入力します。
クラス名にTestServletを入力します。
スーパークラスはjavax.servlet.http.HttpServletのままにしてください。
既存サーブレット・クラスまたはJSPを使用をOFFにします。
完了をクリックします。


図10.1.3.5-2

TestWeb4JPAプロジェクトにTestServlet.javaファイルが追加されます。


図10.1.3.5-3

実装の概要
JSP からの処理要求は、まず、

void doPost(HttpServletRequest request, HttpServletResponse response)

に渡されます。doPost 内では、その要求を判別し、JSP 側のそれぞれのボタンに対応する、以下の処理へ振り分けます。 データベース操作の結果は、 で、html 記述に整形され、JSP に返送されます。
最終的な、TestServlet.javaの内容は、以下のようになります。
package test.jpa.servlet;

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

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
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 javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import model.Student;
import model.operator.StudentOperator;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/StudentServlet")
public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private StudentOperator operator = new StudentOperator();
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TestServlet() {
        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
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                .newInstance();
        try {
            DocumentBuilder documentBuilder = documentBuilderFactory
                    .newDocumentBuilder();
            Document document = documentBuilder.parse(request.getInputStream());
            List<Element> elements = getChildrenByTagName(
                    document.getDocumentElement(), "command");
            Element element = elements.get(0);
            String commondName = element.getAttribute("name");
            // seo = StudentOperatorFactory.createStudentOperator();
            // Insert Record
            if (commondName.equals("insert")) {
                boolean isOk = insert(operator, element);
                inquire(operator, response);
                if (isOk) {
                    response.getWriter()
                            .write("<label style='color:blue'>insert is successful!</label>");
                } else {
                    response.getWriter()
                            .write("<label style='color:red'>"
                                    + "insert is failed! because this id has existed in the database</label>");
                }
            }
            // Select Record
            else if (commondName.equals("inquire")) {
                inquire(operator, response);
            }

            else if (commondName.equals("update")) {
                update(operator, element);
            }
            // Delete Record
            else {
                boolean isOk = delete(operator, element);
                inquire(operator, response);
                if (!isOk) {
                    response.getWriter()
                            .write("<label style='color:red'>"
                                    + "Delete is failed! because this id doesn't exist in the database</label>");
                } else {
                    response.getWriter()
                            .write("<label style='color:blue'>delete is successful!</label>");
                }
            }
        } catch (Exception e) {
        	e.printStackTrace();
        	
        	response.getWriter().write("<label style='color:red'>" + e.toString() + "</label>");
        }
    }

    private List<Element> getChildrenByTagName(Element element, String tagName) {
        List<Element> result = new ArrayList<Element>();
        if (element == null) {
            return result;
        }
        NodeList childNodes = element.getChildNodes();
        int len = childNodes.getLength();
        for (int i = 0; i < len; i++) {
            Node childNode = childNodes.item(i);
            if (!(childNode instanceof Element)) {
                continue;
            }
            Element childElement = (Element) childNode;
            if (childElement.getTagName().equals(tagName)) {
                result.add(childElement);
            }
        }
        return result;
    }

    private void update(StudentOperator seo, Element element) {
        // TODO Auto-generated method stub
        List<Element> paramElementList = getChildrenByTagName(element, "param");
        Element param = paramElementList.get(0);
        String id = param.getAttribute("studentId");
        Student se = seo.findEntityById(Integer.parseInt(id));
        if (se != null) {
            String myLock = param.getAttribute("myLock");
            String name = param.getAttribute("name");
            String sport = param.getAttribute("sport");
            se.setMylock(Integer.parseInt(myLock));
            se.setName(name);
            se.setSport(sport);
        }

    }

    /* inquire テーブルの一覧取得 */
    private void inquire(StudentOperator seo, HttpServletResponse response)
            throws IOException {
        // call findEntity method of baseOperator
        List<Student> list = seo.findEntities();
        StringBuffer buffer = new StringBuffer();
        beginResult(buffer);
        for (Student se : list) {
            addRecorder(buffer, se);
        }
        endResult(buffer);
        response.getWriter().write(buffer.toString());
    }

    /* delete テーブルの要素削除 */
    private boolean delete(StudentOperator seo, Element element) throws Exception {
        List<Element> paramElementList = getChildrenByTagName(element, "param");
        Element param = paramElementList.get(0);
        String id = param.getAttribute("studentId");
        Student se = seo.findEntityById(Integer.parseInt(id));
        if (se != null) {
            seo.deleteEntity(se);
            return true;
        }
        return false;
    }

    /* insert テーブルへの要素挿入 */
    private boolean insert(StudentOperator seo, Element element)
            throws Exception {
        List<Element> paramElementList = getChildrenByTagName(element, "param");
        Element param = paramElementList.get(0);
        String id = param.getAttribute("id");
        Student se = seo.findEntityById(Integer.parseInt(id));
        if (se == null) {
            Student bean = new Student();
            String myLock = param.getAttribute("myLock");
            String name = param.getAttribute("name");
            String sport = param.getAttribute("sport");
            bean.setId(Integer.parseInt(id));
            bean.setMylock(Integer.parseInt(myLock));
            bean.setName(name);
            bean.setSport(sport);
            seo.createEntity(bean);
            return true;
        }
        return false;
    }

    /* 以下は、出力の整形(html の table 形式) */
    private void beginResult(StringBuffer buffer) {
        buffer.append("<br>").append("<label>results form database</label>");
        buffer.append("<table border='1'>").append("<tr bgcolor='gray'>");
        buffer.append("<td>ID</td>").append("<td>MYLOCK</td>");
        buffer.append("<td>NAME</td>").append("<td>SPORT</td>").append("</tr>");
    }

    private void addRecorder(StringBuffer buffer, Student student) {
        int id = student.getId();
        int myLock = student.getMylock();
        String name = student.getName();
        if (name.length() == 0) {
            name = " ";
        }
        String sport = student.getSport();
        if (sport.length() == 0) {
            sport = " ";
        }
        buffer.append("<tr>").append("<td>").append(String.valueOf(id))
                .append("</td>");
        buffer.append("<td>").append(String.valueOf(myLock)).append("</td>");
        buffer.append("<td>").append(name).append("</td>");
        buffer.append("<td>").append(sport).append("</td>").append("</tr>");
    }

    private void endResult(StringBuffer buffer) {
        buffer.append("</table>");
    }
    

	@PostConstruct
	public void init() {
		operator.init();
	}

	@PreDestroy
	public void end() {
		operator.end();
	}
}

10.1.3.6. persistence.xmlの設定

Java Resources/src/META-INFフォルダー配下の persistence.xmlを、 [10.1.2.4. persistence.xmlの設定] と同様の手順で編集します。
ここでは、persistence-unit の値が、StudentOperator 内で init メソッドに指定した、 "TestWeb4JPA" と一致している事を確認してください。

設定後の、persistence.xmlファイルの例は以下の通りです。 "javax.persistence.jdbc.driver" 以外の指定は、環境設定により異なりますので、適宜、適切な値を指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="TestWeb4JPA" transaction-type="RESOURCE_LOCAL">
    <class>model.Student</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:C:\MyDB;create=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
    </properties>
  </persistence-unit>
</persistence>

10.1.3.7. ビルド・パスの変更及びライブラリーの追加

データベース・ドライバの配置
次に、Derbyデータベースへ接続するため、データベースのドライバを含むderby.jarファイルを、

{WebOTXインストールディレクトリ}\domains\domain1\lib\ext

にコピー後、ドメインを再起動してください。


図10.1.3.7-2

Memo
ドメインの再起動については、 [ドメイン構築・基本設定ガイド > 3. ドメイン > 3.4. ドメインの起動・停止 > 3.4.3. 一般ドメインの起動/停止] をご覧ください。

デフォルト出力フォルダーの変更
TestWeb4JPAプロジェクトを右クリックメニューの プロパティー を選択します。
TestWeb4JPAプロジェクトの Javaのビルド・パスを選択して、 ソースタブをクリックします。
デフォルト出力フォルダー にTestWeb4JPA/WebContent/WEB-INF/classesを指定します。
OKをクリックします。


図10.1.3.7-3

10.1.3.8. サーバーでテスト実行

下記の手順で、動的Webプロジェクトをサーバーで実行を行います。
データ・ソース・エクスプロラーで、新規 Derby が切断状態であることを確認します。
その後で、パッケージ・エクスプローラーで、プロジェクトTestWeb4JPAの右クリックメニュー 実行 > サーバーで実行 を選択します。


図10.1.3.8-1

サーバーで実行ウィザードが起動されます。
サーバーの選択方法は、手動で新規サーバーを定義を選択して、サーバーのホスト名にlocalhostのままで、リストからNEC > WebOTX Application Server v9(Local Default)を選択します。
次へをクリックします。


図10.1.3.8-2

WebOTXサーバーの新規作成画面が表示されます。
サーバーユーザー名サーバーパスワードユーザードメイン名ユーザドメインポート、および ユーザードメインのHTTPポート番号を全て正しく設定して、 次へをクリックします。


図10.1.3.8-3

プロジェクトの追加および除去画面が表示されます。
構成プロジェクトリストにTestWeb4JPAが追加されることを確認して、 完了をクリックします。


図10.1.3.8-4

コンソール・ビューで、TestWeb4JPAが成功に配備されるメッセージが表示されます。
同時に、内部ブラウザーが起動して、 http://localhost/TestWeb4JPA/ アドレスが表示されます。
下記の画面が表示されたら、正しく配備されています。


図10.1.3.8-5

Inquireをクリックして、検索処理を行います。
検索処理が正しく実行されたると、下記の実行結果が表示されます。


図10.1.3.8-6

下記の手順で、レコード追加処理を確認します。
Insert ボタンと同じ行にある ID に「11」を入力します。
MYLOCK に「22」を入力します。
NAME に「mike」を入力します。
SPORT に「Basketball」を入力します。
Insertをクリックします。
下記の実行結果があれば、レコード追加処理が正しく実行されたことが確認できます。


図10.1.3.8-7

下記の手順で、レコード削除処理を確認します。
Delete ボタンと同じ行にある ID に「11」を入力します。
Deleteをクリックします。
下記の実行結果があれば、レコード追加処理が正しく実行されたことが確認できます。


図10.1.3.8-8


10.1.4. JSF アプリケーションの作成

プロジェクトを作成前に、{WebOTXインストールディレクトリ}\domains\domain1\lib\extフォルダーに、
Derby.jar というドライバーが存在することを確認します。 存在しない場合、{JDKのインストルデェレクトリ}\db\libから、Derby.jar をコピーします。

10.1.4.1. テスト用JSFプロジェクトの作成

動的 Web プロジェクト生成ウィザードを利用して、動的Webプロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト 画面を開きます。
Web > 動的Web プロジェクト を選択して、 次へをクリックします。


図10.1.4.1-1

新規動的 Web プロジェクト 画面が表示されます。

プロジェクト名 に新規プロジェクト名JpaJsfSampleを入力します。
ターゲット・ランタイムでWebOTX Application Server v9(Local Default)を選択します。
ターゲット・ランタイムが存在しない場合、 [アプリケーション開発ガイド(概要) > 1. Developer(with Developer's Studio) > 1.2. 環境設定 > 1.2.4. テスト用サーバの設定 > 1.2.4.1. WebOTXランタイムの設定]を参照の上、設定を行ってください。
構成変更... をクリックします。


図10.1.4.1-2

プロジェクト・ファセット 画面が表示されます。
動的 Web モジュールファセットのバージョンを 3.0にします。
Java ファセットのバージョンを 1.7にします。
JPA ファセットを ONにし、バージョンを 2.0にします。
JavaServer Faces ファセットをONにし、バージョンを 2.1にします。
OKをクリックします。


図10.1.4.1-3

新規動的 Web プロジェクト画面に戻ります。
次へをクリックすると、 Java画面が表示されます。


図10.1.4.1-4

次へをクリックすると、 JPA ファセット ページが表示されるので以下を指定します。


図10.1.4.1-5

表3.1.19.1-1
属性
プラットフォーム WebOTX JPA 2.0
JPA 実装 WebOTX JPA を選択
接続 新規 Derby
ビルド・パスにドライバー・ライブラリーを追加 非選択
注釈つきクラスをpersistence.xml に記述 選択
Create mapping file 非選択

Memo
ユーザー・ライブラリーの何もリストされていない場合、 [10.2.1.1.JPAライブラリーのコンフィグレーション]を参照してWebOTX JPAライブラリーを追加してください。

次へをクリックすると、 Web モジュール画面が表示されます。
web.xmlデプロイメント記述子の生成 をONにします。
次へをクリックします。 


図10.1.4.1-6

次へをクリックします。 JSF 実装ライブラリーライブラリー構成を無効 を選択します。


図10.1.4.1-7


完了をクリックし、プロジェクトJpaJsfSampleが作成されます。


図10.1.4.1-8


10.1.4.2. エンティティークラスの生成

ここで利用する Entity クラスは、[10.1.2.2. エンティティークラスの生成]で作成したものと同じです。

10.1.4.3. JSFクラス・ページの作成


プロジェクト JpaJsfSampleで、Studentを右クリックメニューの JPAツール> エンティティーからJSFページ・クラスを作成をクリックします。


図10.1.4.3-1


エンティティーオペレータ・クラス画面が表示されます。
プロジェクトに JpaJsfSample が選択され、 エンティティクラスに model.Student が選択され、 トランサンクションに EntityTransction が選択され、 エンティティーマネジャーファクトリーに 生成する が選択されることを確認します。


図10.1.4.3-2


次へをクリックし JSF Managed Bean・クラス画面が表示されます。
パッケージにview.facesが設定され、
クラス名にStudentFacesBeanが設定されることを確認します。


図10.1.4.3-3


次へをクリック。 JSF ページ画面が表示されます。
ファイル名にStudentが設定され、
親フォルダーにpageが設定されることを確認します。


図10.1.4.3-4


完了をクリックし、JSFページ・クラスが作成されます。


図10.1.4.3-5


10.1.4.4.persistence.xmlの設定

persistence.xml接続の設定は [10.1.2.4. persistence.xmlの設定]と同様の手順で編集します。
ここでは、persistence-unit の値が、StudentOperator 内で init メソッドに指定した、 "JpaJsfSample" と一致している事を確認してください。

設定後の、persistence.xmlファイルの例は以下の通りです。 "javax.persistence.jdbc.driver" 以外の指定は、環境設定により異なりますので、適宜、適切な値を指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JpaJsfSample" transaction-type="RESOURCE_LOCAL">
    <class>model.Student</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:C:\MyDB;create=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
    </properties>
  </persistence-unit>
</persistence>

10.1.4.5. サーバーでテスト実行

プロジェクトJpaJsfSampleをサーバーに配備する手順は [10.1.3.8. サーバーでテスト実行]参照してください。
配備成功後、コンソール・ビューで、JpaJsfSampleが成功に配備されるメッセージが表示されます。

ブラウザーを起動して、 http://localhost/JpaJsfSample/faces/page/Student.xhtml アドレスをアクセスします。
下記の画面が表示されたら、正しく配備されています。


図10.1.4.5-1

下記の手順で、レコード追加処理を確認します。
Create ボタンと同じ行にある ID に「11」を入力します。
MYLOCK に「22」を入力します。
NAME に「mike」に入力します。
SPORT に「basketball」に入力します。
Create をクリックします。
下記の実行結果があれば、レコード追加処理が正しく実行されたことが確認できます。


図10.1.4.5-2

下記の手順で、一つレコードを検索する処理を確認します。
Find ボタンと同じ行にある ID に「11」を入力します。
Find をクリックします。
下記の実行結果があれば、検索処理が正しく実行されたことが確認できます。


図10.1.4.5-3

FindAllをクリックして、全てのデーターの検索処理を行います。
検索処理が正しく実行されれば、下記の実行結果が表示されます。


図10.1.4.5-4

下記の手順で、一つレコードを更新する処理を確認します。
Update ボタンと同じ行にある ID に「11」を入力します。
MYLOCK に「20」を入力します。
NAME に「tom」に入力します。
SPORT に「baseball」に入力します。
Update をクリックします。
下記の実行結果があれば、レコード更新処理が正しく実行されたことが確認できます。


図10.1.4.5-5

下記の手順で、レコード削除処理を確認します。
Delete ボタンと同じ行にある ID に「11」を入力します。
Delete をクリックします。
下記の実行結果があれば、レコード削除処理が正しく実行されたことが確認できます。


図10.1.4.5-6


10.1.5. RESTful Webサービスの作成

プロジェクトを作成前に、{WebOTXインストールディレクトリ}\domains\domain1\lib\extフォルダーに、
Derby.jar というドライバーが存在することを確認します。 存在しない場合、{JDKのインストルデェレクトリ}\db\libから、Derby.jar をコピーします。

10.1.5.1. テスト用RESTful Webサービスプロジェクトの作成


ウィザードを利用して、動的Webプロジェクトを作成します。
メニュー ファイル > 新規 > プロジェクト を選択して、 新規プロジェクト 画面を開きます。
Web > 動的Webプロジェクト を選択して、 次へをクリックします。


図10.1.5.1-1

新規動的Webプロジェクト 画面が表示されます。


図10.1.5.1-2


プロジェクト名 に新規プロジェクト名 JpaRestfulSampleを入力します。
ターゲット・ランタイムで WebOTX Application Server v9(Local Default)を選択します。

ターゲット・ランタイムが存在しない場合、 [アプリケーション開発ガイド(概要) > 1. Developer(with Developer's Studio) > 1.2. 環境設定 > 1.2.4. テスト用サーバの設定 > 1.2.4.1. WebOTXランタイムの設定]を参照の上、設定を行ってください。

変更... をクリックし、 プロジェクト・ファセット画面が表示されます。
JAX-RS(REST Web Services) ファセットを ON にして、 JPA ファセットを ON にします。


図10.1.5.1-3

OKをクリックします。 次へを2回クリックして、 JPA ファセット 画面が表示されるので以下を指定します。


図10.1.5.1-4

プラントフォムに WebOTX JPA 2.0 を選択し、
JPA実装に ユーザ・ライブラリー を選択し、
WebOTX JPA を ON にし、
接続に 新規Derby を選択し、
ビルド・パスにドライバー・ライブラリーを追加を ON にし、
ドライバーに Derby組み込みJDBCドライバー10.2デフォルト が選択されることを確認します。

次へを2回クリックして、 JAX−RS関連設定画面が表示されますので以下を指定します。


図10.1.5.1-5

表10.1.5.1-1
属性
JAX-RS Implementation Library ライブラリー構成を無効
JAX-RS servlet class name com.nec.webotx.jersey.spi.container.servlet.ServletContainer
URL マッピング・パターン /jaxrs/*

完了をクリックし、プロジェクトJpaRestfulSampleが作成されます。


図10.1.5.1-6

10.1.5.2. エンティティークラスの生成

ここで利用する Entity クラスは、[10.1.2.2. エンティティークラスの生成]で作成したものと同じです。

10.1.5.3. RESTful Webサービスの作成


プロジェクトJpaRestfulSampleの Student.javaの右クリックメニュー JPAツール > エンティティーからRESTful Webサービスを作成をクリックします。


図10.1.5.3-1


RESTful Webサービスの作成画面が表示されます。
プロジェクトに JpaRestfulSample が選択され、 エンティティクラスに model.Student が選択され、 トランサンクションに EntityTransction が選択され、 エンティティーマネジャーファクトリーに 生成する が選択されることを確認します。


図10.1.5.3-2


次へをクリックし、 RESTful リソース・クラス画面が表示されます。
パッケージにview.restが設定され、
クラス名にStudentResourceが設定されることを確認します。


図10.1.5.3-3


完了をクリックし、接続の選択画面が表示されます。


図10.1.5.3-4


完了をクリックすると、 RESTful Webサービスが作成されます。


図10.1.5.3-5


10.1.5.4. persistence.xmlの設定


persistence.xml接続の設定は [10.1.2.4. persistence.xmlの設定]と同様の手順で編集します。
ここでは、persistence-unit の値が、StudentOperator 内で init メソッドに指定した、 "JpaRestfulSample" と一致している事を確認してください。

設定後の、persistence.xmlファイルの例は以下の通りです。 "javax.persistence.jdbc.driver" 以外の指定は、環境設定により異なりますので、適宜、適切な値を指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="JpaRestfulSample" transaction-type="RESOURCE_LOCAL">
    <class>model.Student</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:C:\MyDB;create=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="javax.persistence.jdbc.user" value=""/>
      <property name="javax.persistence.jdbc.password" value=""/>
    </properties>
  </persistence-unit>
</persistence>

10.1.5.5. テスト用クラアントプロジェクトの作成


ファイル > 新規 をクリックし、 その他を選択し、 Javaプロジェクトを選択して、Javaプロジェクト画面が表示されます。 プロジェクト名JpaRestfulSampleClientを入力します。


図10.1.5.5-1

完了をクリックし、JpaRestfulSampleClientというプロジェクトが作成されます。
プロジェクトの右クリックメニュー 新規 > パッケージをクリックし、
client、common、data.xml.studentという三つパッケージを作成します。


図10.1.5.5-2


commonパケージに RESTClientという名前のクラスを作成し、その内容は以下ようにします。
package common;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

public class RESTClient {

    protected static final String XML = "application/xml";
    protected static final String JSON = "application/json";

    protected static void create(final String httpUrlStr,
            final String contentType, final String dataPath) throws IOException {
        submit(httpUrlStr, "POST", contentType, dataPath);
    }

    protected static void update(final String httpUrlStr,
            final String contentType, final String dataPath) throws IOException {
        submit(httpUrlStr, "PUT", contentType, dataPath);
    }

    protected static void delete(final String httpUrlStr, final String param)
            throws IOException {
        HttpURLConnection httpUrlConnection = null;
        InputStream in = null;
        try {
            URL url = new URL(getFullHttpUrlStr(httpUrlStr,
                    new String[] { param }));
            httpUrlConnection = (HttpURLConnection) url.openConnection();
            httpUrlConnection.setRequestMethod("DELETE");
            httpUrlConnection.connect();
            in = httpUrlConnection.getInputStream();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } finally {
                if (httpUrlConnection != null) {
                    httpUrlConnection.disconnect();
                }
            }
        }
    }

    protected static String find(final String httpUrlStr,
            final String contentType, final String param) throws IOException {
        return getData(getFullHttpUrlStr(httpUrlStr, new String[] { param }),
                contentType);
    }

    protected static String criteriaFind(final String httpUrlStr,
            final String contentType, final String param) throws IOException {
        String criteriaUrl = null;
        if (httpUrlStr.endsWith("/") || httpUrlStr.endsWith("\\")) {
            criteriaUrl = httpUrlStr + "criteria/";
        } else {
            criteriaUrl = httpUrlStr + "/criteria/";
        }
        return getData(getFullHttpUrlStr(criteriaUrl, new String[] { param }),
                contentType);
    }

    protected static String findAll(final String httpUrlStr,
            final String contentType) throws IOException {
        return getData(httpUrlStr, contentType);
    }

    protected static String findRange(final String httpUrlStr,
            final String contentType, final String param1, final String param2)
            throws IOException {
        return getData(
                getFullHttpUrlStr(httpUrlStr, new String[] { param1, param2 }),
                contentType);
    }

    private static String getFullHttpUrlStr(final String httpUrlStr,
            final String[] params) {
        String result = httpUrlStr;
        if (params.length > 0) {
            if (result.endsWith("/") || result.endsWith("\\")) {
                result = result.substring(0, result.length() - 1);
            }
            for (String param : params) {
                result = result + "/";
                result = result + param;
            }
        }
        return result;
    }

    /**
     * submit.
     * @param httpUrlStr the HTTP URL string
     * @param method the HTTP
     *        method:"GET","POST","HEAD","OPTIONS","PUT","DELETE","TRACE"
     * @param contentType the Content-Type:"application/xml","application/json"
     * @param dataPath the data path
     * @throws IOException IO exception
     */
    private static void submit(final String httpUrlStr, final String method,
            final String contentType, final String dataPath) throws IOException {
        HttpURLConnection httpUrlConnection = null;
        OutputStream out = null;
        InputStream in = null;
        try {
            URL url = new URL(httpUrlStr);
            httpUrlConnection = (HttpURLConnection) url.openConnection();
            httpUrlConnection.setDoOutput(true);
            if (method != null && !method.trim().equals("")) {
                httpUrlConnection.setRequestMethod(method);
            }
            if (contentType != null && !contentType.trim().equals("")) {
                httpUrlConnection.addRequestProperty("Content-Type",
                        contentType);
            }
            httpUrlConnection.connect();
            out = httpUrlConnection.getOutputStream();
            out.write(readFile(dataPath));
            out.flush();
            in = httpUrlConnection.getInputStream();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } finally {
                    if (httpUrlConnection != null) {
                        httpUrlConnection.disconnect();
                    }
                }
            }
        }
    }

    private static String getData(final String httpUrlStr,
            final String contentType) throws IOException {
        HttpURLConnection httpUrlConnection = null;
        InputStreamReader isr = null;
        try {
            URL url = new URL(httpUrlStr);
            httpUrlConnection = (HttpURLConnection) url.openConnection();
            httpUrlConnection.setDoInput(true);
            httpUrlConnection.setRequestMethod("GET");
            if (contentType != null && !contentType.trim().equals("")) {
                httpUrlConnection.addRequestProperty("Content-Type",
                        contentType);
            }
            httpUrlConnection.connect();
            isr = new InputStreamReader(httpUrlConnection.getInputStream());
            StringBuffer result = new StringBuffer();
            char[] buffer = new char[256];
            int length = isr.read(buffer);
            while (length > -1) {
                result.append(buffer, 0, length);
                length = isr.read(buffer);
            }
            return result.toString();
        } finally {
            try {
                if (isr != null) {
                    isr.close();
                }
            } finally {
                if (httpUrlConnection != null) {
                    httpUrlConnection.disconnect();
                }
            }
        }
    }

    private static byte[] readFile(final String dataPath) throws IOException {
        BufferedInputStream is = null;
        try {
            byte[] result = new byte[0];
            is = new BufferedInputStream(
                    RESTClient.class.getResourceAsStream(dataPath));
            byte[] buffer = new byte[1024];
            int num = is.read(buffer);
            while (num > -1) {
                int len = result.length;
                byte[] newResult = new byte[len + num];
                System.arraycopy(result, 0, newResult, 0, len);
                System.arraycopy(buffer, 0, newResult, len, num);
                result = newResult;
                num = is.read(buffer);
            }
            return result;
        } finally {
            if (is != null) {
                is.close();
            }
        }
    }

    protected static void deleteAllEntities(final String httpUrlStr,
            final String contentType, final String pkName) throws IOException {
        List<String> pkValues = getAllPKValues(httpUrlStr, contentType, pkName);
        for (String pkValue : pkValues) {
            delete(httpUrlStr, pkValue);
        }
        pkValues = getAllPKValues(httpUrlStr, contentType, pkName);
        if (pkValues.size() != 0) {
            throw new IOException();
        }
    }

    private static List<String> getAllPKValues(final String httpUrlStr,
            final String contentType, final String pkName) throws IOException {
        List<String> result = new ArrayList<String>();
        String xmlText = findAll(httpUrlStr, contentType);
        String startSign = "<" + pkName + ">";
        String endSign = "</" + pkName + ">";
        int fromIndex = 0;
        int startIndex = xmlText.indexOf(startSign, fromIndex);
        int endIndex = xmlText.indexOf(endSign, fromIndex);
        while (startIndex > -1) {
            result.add(xmlText.substring(startIndex + startSign.length(),
                    endIndex));
            fromIndex = endIndex + endSign.length();
            startIndex = xmlText.indexOf(startSign, fromIndex);
            endIndex = xmlText.indexOf(endSign, fromIndex);
        }
        return result;
    }

}
	
clientパッケージに、 JpaRestfulSampleClientというクラスを作成し、その内容は以下ようにします。
package client;

import common.RESTClient;

public class JpaRestfulSampleClient extends RESTClient {

    private static final String HTTP_URL = "http://localhost/JpaRestfulSample/jaxrs/student";
    private static final String DATA_ROOT = "/data/xml/student/";
    private static final String TEST_DATA1 = DATA_ROOT + "student1.xml";
    private static final String TEST_DATA2 = DATA_ROOT + "student2.xml";
    private static final String TEST_DATA3 = DATA_ROOT + "student3.xml";

    public static void main(String[] args) {
        String result = "succeed";
        try {
            create(HTTP_URL, XML, TEST_DATA1);
            create(HTTP_URL, XML, TEST_DATA3);

            String findResult = find(HTTP_URL, XML, "100");
            String findAllResult = findAll(HTTP_URL, XML);
            System.out.println("result(id=100):" + findResult);
            System.out.println("After Create(id=40,id=60), result(all):" + findAllResult);

            update(HTTP_URL, XML, TEST_DATA2);
            findAllResult = findAll(HTTP_URL, XML);
            System.out.println("After Update(id=40), result(all):" + findAllResult);
            
            String findRangeResult = findRange(HTTP_URL, XML, "0", "2");
            System.out.println("result(0~1):" + findRangeResult);
            
            delete(HTTP_URL, "40");
            delete(HTTP_URL, "60");
            findAllResult = findAll(HTTP_URL, XML);
            System.out.println("After Delete(id=40,id=60), result(all):" + findAllResult);
        } catch (Throwable e) {
            result = "failed";
        }
        System.out.println(result);
    }
}
	
data.xml.studentパッケージに、 student1.xmlというxmlファイルを作成し、その内容は以下ようにします。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<student>
  <id>40</id> 
  <mylock>20</mylock> 
  <name>Shirley</name> 
  <sport>Dance</sport> 
</student>
	
student2.xmlというxmlファイルを作成し、その内容は以下ようにします。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<student>
  <id>40</id> 
  <mylock>20</mylock> 
  <name>Valentine</name> 
  <sport>CQB</sport> 
</student>
	
student3.xmlというxmlファイルを作成し、その内容は以下ようにします。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<student>
  <id>60</id> 
  <mylock>30</mylock> 
  <name>Akasha</name> 
  <sport>Pain</sport> 
</student>
	
作成完了のJpaRestfulSampleClientプロジェクトは以下のようです。


図10.1.5.5-3


10.1.5.6. サーバーでテスト実行


プロジェクトJpaRestfulSampleをサーバーに配備する手順は [10.1.3.8. サーバーでテスト実行]を参照してください。
コンソールで、JpaRestfulSample成功に配備されるメッセージが表示されます。
ブラウザを用いる場合
Webブラウザーを起動して、
http://localhost/JpaRestfulSample/jaxrs/student
をアクセスし、 FindAllの検索の結果が表示されます。


図10.1.5.6-1


ブラウザで
http://localhost/JpaRestfulSample/jaxrs/student/100
をアクセスし、id100のデータが検索されます。


図10.1.5.6-2

Javaアプリケーションクライアントを用いる場合
プロジェクトJpaRESTfulSampleClientの右クリックしメニューの 実行 > Javaアプリケーションをクリックします。
コンソールで、下記の結果が表示されます。
result(id=100):<?xml version="1.0" encoding="UTF-8" standalone="yes"?><student><id>100</id><mylock>10</mylock><name>WangHaidong</name><sport>BasketBall</sport></student>
After Create(id=40,id=60), result(all):<?xml version="1.0" encoding="UTF-8" standalone="yes"?><students><student><id>100</id><mylock>10</mylock><name>WangHaidong</name><sport>BasketBall</sport></student><student><id>40</id><mylock>20</mylock><name>Shirley</name><sport>Dance</sport></student><student><id>60</id><mylock>30</mylock><name>Akasha</name><sport>Pain</sport></student></students>
After Update(id=40), result(all):<?xml version="1.0" encoding="UTF-8" standalone="yes"?><students><student><id>100</id><mylock>10</mylock><name>WangHaidong</name><sport>BasketBall</sport></student><student><id>40</id><mylock>30</mylock><name>Valentine</name><sport>CQB</sport></student><student><id>60</id><mylock>30</mylock><name>Akasha</name><sport>Pain</sport></student></students>
result(0~1):<?xml version="1.0" encoding="UTF-8" standalone="yes"?><students><student><id>100</id><mylock>10</mylock><name>WangHaidong</name><sport>BasketBall</sport></student><student><id>40</id><mylock>30</mylock><name>Valentine</name><sport>CQB</sport></student></students>
After Delete(id=40,id=60), result(all):<?xml version="1.0" encoding="UTF-8" standalone="yes"?><students><student><id>100</id><mylock>10</mylock><name>WangHaidong</name><sport>BasketBall</sport></students>
succeed