この章では、XPLATFORM応用プログラムが使用するサーバー用のサービスについて説明します。 XPLATFORMプログラムは、画面入力されたデータをサーバーに伝送する際にtransaction ()関数を使用します。transaction ()関数は入力されたVariableとデータセットをXML Formatに変換し、サーバーであるJSP Serviceに伝達します。 JSP Serviceの結果値は、transaction ()を呼び出した時に登録したコールバック関数で、エラーコードとエラーメッセージの引数により確認することができます。 サーバー用のサービスはJSPのみならずJava Servlet、ASP、ASP.NET、PHPなどの言語で作成することができます。本例題では、画面入力されたデータをJSPを使用して管理する方法を説明します。 作成されたJSP Serviceは、ウェブブラウザを通じてのテストができません。それは、媒介変数としてVariableとデータセットを使用するため、ウェブブラウザを通じては該当の媒介変数をサーバーに伝達することができないためです。
実習目的
XPLATFORMの画面から入力されたデータをtransaction ()関数により受け取り、
サーバーにセーブして照会するJSP Serviceを作ります。
JSP Serviceの作成に必要なX-API(java用ライブラリ)の使用法を学びます。
作成後にXPLATFORMプログラムを利用してテストします。
準備事項
サーバー用装備、WAS(Tomcat)、XPLATFORM X-API、JSPの開発ツール
事前学習
UX-Studioの使用法 -> UX-Studioの機能説明書
実行機能
次の段階によりXPLATFORMの基本的なオブジェクトを生成し、XMLデータをファイルにセーブします。
ライブラリのインポート(XPLATFORM X-APIを含む)
Mimeタイプの定義
XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成
クライアントのパラメータを受け取る
データの処理
エラーコードとエラーメッセージの処理
結果データをクライアントに伝送
本例題のJSPに伝達されるXML Formatデータは、XPLATFORMのライブラリ(XPLATFORM X-API)ではなく他のパーサーを利用して解析することができます。しかし、XPLATFORM X-APIの専用オブジェクトを利用すれば不必要な解析プログラムの作成する必要がないため、プログラムをより簡単に作成することができます。
XPLATFORMで使用されるXMLデータは、本例題と異なる方法で作成してもXMLの規則を守ればどんな言語やサーバーを使用しても差支えありません。
一般的に使用されるサーバー構成の例
サービス作成言語:Java系列(Java Servlet、JSP)、ASP系列(ASP、ASP.NET)
ウェブサーバー:Apache、WASに含まれているウェブサーバー
データベース:Oracle、MS SQLServer、Sybase、DB2
WAS(Web Application Server):WebLogic、WebSphere、JEUS、Tomcat、Resin
サーバーのサービスを作成する時は、UX-Studioを使用せずに一般のウェブエディタ(eclips、Visual Studio .NET、NotePad…)を使用します。
本例題は、JSPを使用してTomcatで実行できるよう具現されました。
サービスの説明
デモ用のXPLATFORM応用プログラムを実行するためには、3つのサーバー用のサービスが必要です。
initdata.jsp:名刺管理のための初期資料を生成しファイルに登録します。
search.jsp:ファイルの内容を読み込み、クライアントに名刺リストを提供します。
save_list.jsp:クライアントが要請した名刺リストをファイルにセーブします。
初期資料生成サービス – initdata.jsp
基本的なpseudoコードです。
// 1.ライブラリのインポート(XPLATFORM X-APIを含む) // 2.Mimeタイプの定義 // 3.XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成 try { // 5.データの処理 // 6.エラーコードとエラーメッセージの処理 (成功メッセージ) } Catch (エラー) { // 6.エラーコードとエラーメッセージの処理 (エラーメッセージ) } // 7.結果データをクライアントに伝送
基本的な照会JSPのプレビュー(initdata.jsp)
<!-- 1.library import --> <%@ page import="java.io.*" %> <%@ page import="com.tobesoft.xplatform.data.*" %> <%@ page import="com.tobesoft.xplatform.tx.*" %> <!-- 2. mime type define --> <%@ page contentType="text/xml; charset=UTF-8" %> <% /** 3.XPLATFORM Basic Object creation **/ PlatformData pdata = new PlatformData(); /** ErrorCode, ErrorMsg creation **/ int nErrorCode = 0; String strErrorMsg = "START"; try { /** 4. receive client request **/ // not need to receive /** 5. handle data : save data to file **/ /** 5.1 create Dataset and input basic data to the Dataset **/ DataSet ds = new DataSet("dsPerson"); ds.addColumn("pid",DataTypes.INT); ds.addColumn("person_name",DataTypes.STRING, 8); ds.addColumn("home_telno", DataTypes.STRING, 8); ds.addColumn("home_address", DataTypes.STRING, 16); ds.addColumn("company", DataTypes.STRING, 8); ds.addColumn("company_telno", DataTypes.STRING, 8); ds.addColumn("company_fax", DataTypes.STRING, 8); ds.addColumn("company_address", DataTypes.STRING, 8); ds.addColumn("email", DataTypes.STRING, 8); ds.addColumn("mobile", DataTypes.STRING, 8); ds.addColumn("jikgub", DataTypes.STRING, 8); ds.addColumn("dept", DataTypes.STRING, 8); ds.addColumn("remark", DataTypes.STRING, 8); int row = 0; int i = 0; String[] names = new String[2]; String[] tel1 = new String[2]; String[] tel2 = new String[2]; String[] tel3 = new String[2]; String[] tel4 = new String[2]; String[] address = new String[2]; String[] company = new String[2]; String[] email = new String[2]; names[0] = "Steven"; names[1] = "Charls"; email[0] = "Steven@hp.com"; email[1] = "Charls@dell.com"; address[0] = "NewYork City"; address[1] = "Manhattan City"; company[0] = "HP"; company[1] = "Dell"; homepage[1] = "www.dell.com"; tel1[0] = "02-123-4567"; tel1[1] = "02-321-7654"; tel2[0] = "02-987-6543"; tel2[1] = "02-789-3456"; tel3[0] = "02-456-7890"; tel3[1] = "02-654-0987"; tel4[0] = "010-1234-7890"; tel4[1] = "010-4321-0987"; for (i = 0; i < 2; i++) { row = ds.newRow(); ds.set(row,"pid",i); ds.set(row,"person_name",names[i]); ds.set(row,"home_telno",tel1[i]); ds.set(row,"home_address",address[i]); ds.set(row,"company",company[i]); ds.set(row,"company_telno",tel2[i]); ds.set(row,"company_fax",tel3[i]); ds.set(row,"company_address",address[i]); ds.set(row,"email",email[i]); ds.set(row,"mobile",tel4[i]); ds.set(row,"jikgub","0" + (i + 1)); ds.set(row,"dept","0" + (i + 1)); ds.set(row,"remark",i); } pdata.addDataSet(ds); /** 5.2 save Dataset to a file **/ String targetFilename = "./saveFile.bin"; OutputStream target = new FileOutputStream(targetFilename); PlatformResponse res = new PlatformResponse(target, PlatformType.CONTENT_TYPE_BINARY); res.setData(pdata); res.sendData(); target.close(); System.out.println("after file write.."); /** 6.1 set the ErrorCode and ErrorMsg about success**/ nErrorCode = 0; strErrorMsg = "SUCC"; } catch (Throwable th) { /** 6.2 set the ErrorCode and ErrorMsg about fail **/ nErrorCode = -1; strErrorMsg = th.getMessage(); } /** 6.3 save the ErrorCode and ErrorMsg for sending Client **/ PlatformData senddata = new PlatformData(); VariableList varList = senddata.getVariableList(); varList.add("ErrorCode", nErrorCode); varList.add("ErrorMsg", strErrorMsg); /** 7. send the result data to Client **/ HttpPlatformResponse res = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML,"UTF-8"); res.setData(senddata); res.sendData(); %>
Javaライブラリのインポート
JSPサービスを作成するためにjavaの基本ライブラリをインポートします。 XMLデータを生成する際には、XPLATFORMが使用するフォーマットを順守しなければなりません。 XMLのフォーマットデータは“xerces”のように常用化されているパーサーを使用しても、また直接に実装して使用しても差支えありません。 しかし、XPLATFORMのJava用ライブラリ(XPLATFORM X-API)を使用すると XPLATFORM専用のオブジェクトを生成・使用するため、XMLデータのフォーマットを別途に構文解析しなくてもオブジェクトの機能を利用して簡単にデータを抽出することができます。 XPLATFORM X-API及びjavaの基本的なオブジェクトをインポートするコードは次の通りです。
<!-- 1.library import --> <%@ page import="java.io.*" %> <%@ page import="com.tobesoft.xplatform.data.*" %> <%@ page import="com.tobesoft.xplatform.tx.*" %>
XPLATFORM XAPIのインストール
XPLATFORMのライブラリ(XPLATFORM XAPI)はxplatform-xapi-1.0.jarと commons-logging-1.1.1.jarファイルで構成されており、XPLATFORMの購入時に提供されるか、㈱TOBESOFTの技術支援サイト(http://www.miplatform.co.kr)を通じて提供を受けることができます。
インポートされたライブラリで使用される専用オブジェクトは次の通りです。
プラットフォームデータ:データを保持する基本的なオブジェクト
PlatformRequest:JSPのリクエスト時にXML Formatのデータを読み込みオブジェクト化するInputオブジェクト
PlatformResponse:JSPのリクエスト時にXML Formatのデータを出力するoutputオブジェクト
DatasetList & Dataset:データを2次元テーブル型式または配列タイプで保持
VariableList & Variable:I/Oの引数値として使用される単一値を保持
Mimeタイプの定義
XMLの生成のためのMimeタイプを定義します。
<!-- 2. mime type define --> <%@ page contentType="text/xml; charset=UTF-8" %>
XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成
データを処理するためのXPLATFORMの基本的なオブジェクトを宣言します。 基本的なオブジェクトであるプラットフォームデータは、XPLATFORM応用プログラムで使用する全てのデータ(データセット、Variable)を1度に格納することができるオブジェクトです。 プラットフォームデータを宣言するコードは次の通りです。
/** 3.XPLATFORM Basic Object creation **/ PlatformData pdata = new PlatformData();
データセットを生成しファイルにセーブ
データセットを生成し、カラム情報を入力して2つのrowを生成してから、各rowごとにカラムを入力します。 生成したデータセットは、i/oを容易にするためにプラットフォームデータに登録します。 プラットフォームデータのオブジェクトを使用して“./saveFile.bin”ファイルにセーブします。
データセットを生成してファイルにセーブするコードは次の通りです。
/** 5. handle data : save data to file **/ /** 5.1 create Dataset and input basic data to the Dataset **/ DataSet ds = new DataSet("dsPerson"); ds.addColumn("pid",DataTypes.INT); ds.addColumn("person_name",DataTypes.STRING, 8); ds.addColumn("home_telno", DataTypes.STRING, 8); ds.addColumn("home_address", DataTypes.STRING, 16); ds.addColumn("company", DataTypes.STRING, 8); ds.addColumn("company_telno", DataTypes.STRING, 8); ds.addColumn("company_fax", DataTypes.STRING, 8); ds.addColumn("company_address", DataTypes.STRING, 8); ds.addColumn("email", DataTypes.STRING, 8); ds.addColumn("mobile", DataTypes.STRING, 8); ds.addColumn("jikgub", DataTypes.STRING, 8); ds.addColumn("dept", DataTypes.STRING, 8); ds.addColumn("remark", DataTypes.STRING, 8); int row = 0; int i = 0; String[] names = new String[2]; String[] tel1 = new String[2]; String[] tel2 = new String[2]; String[] tel3 = new String[2]; String[] tel4 = new String[2]; String[] address = new String[2]; String[] company = new String[2]; String[] email = new String[2]; names[0] = "Steven"; names[1] = "Charls"; email[0] = "Steven@hp.com"; email[1] = "Charls@dell.com"; address[0] = "NewYork City"; address[1] = "Manhattan City"; company[0] = "HP"; company[1] = "Dell"; tel1[0] = "02-123-4567"; tel1[1] = "02-321-7654"; tel2[0] = "02-987-6543"; tel2[1] = "02-789-3456"; tel3[0] = "02-456-7890"; tel3[1] = "02-654-0987"; tel4[0] = "010-1234-7890"; tel4[1] = "010-4321-0987"; for (i = 0; i < 2; i++) { row = ds.newRow(); ds.set(row,"pid",i); ds.set(row,"person_name",names[i]); ds.set(row,"home_telno",tel1[i]); ds.set(row,"home_address",address[i]); ds.set(row,"company",company[i]); ds.set(row,"company_telno",tel2[i]); ds.set(row,"company_fax",tel3[i]); ds.set(row,"company_address",address[i]); ds.set(row,"email",email[i]); ds.set(row,"mobile",tel4[i]); ds.set(row,"jikgub","0" + (i + 1)); ds.set(row,"dept","0" + (i + 1)); ds.set(row,"remark",i); } pdata.addDataSet(ds); /** 5.2 save Dataset to a file **/ String targetFilename = "./saveFile.bin"; OutputStream target = new FileOutputStream(targetFilename); PlatformResponse res = new PlatformResponse(target, PlatformType.CONTENT_TYPE_BINARY); res.setData(pdata); res.sendData(); target.close();
エラーコードとエラーメッセージの処理
上記の過程で基本的なデータ処理が実行されました。 しかし、いかなる場合においても例外状況が発生することがあるため、エラーが発生した際には次のように処理するのが正しいです 。
/** 6.1 ErrorCode, ErrorMsg creation **/ int nErrorCode = 0; String strErrorMsg = "START"; try { /** 5. handle data : save data to file **/ /** 6.2 set the ErrorCode and ErrorMsg about success**/ nErrorCode = 0; strErrorMsg = "SUCC"; } catch (Throwable th) { /** 6.3 set the ErrorCode and ErrorMsg about fail **/ nErrorCode = -1; strErrorMsg = th.getMessage(); } /** 6.4 save the ErrorCode and ErrorMsg for sending Client **/ PlatformData senddata = new PlatformData(); VariableList varList = senddata.getVariableList(); varList.add("ErrorCode", nErrorCode); varList.add("ErrorMsg", strErrorMsg);
結果値をクライアントに伝送
初期値が正常にファイルにセーブされたのか否かをクライアントに伝送するために、プラットフォームデータのオブジェクトを使用します。この時、事前にセーブしたエラーコードとエラーメッセージがクライアントに伝送されます。
VariableListはプラットフォームデータの構成内容であるため、JSPを実行した結果値はプラットフォームデータのオブジェクトに格納されています。これから、プラットフォームデータのデータをXPLATFORMが認識できるXML Formatに抽出し伝送する部分を実行します。データを伝送する機能を簡単にするためにXPLATFORMライブラリのPlatformResponseオブジェクトを生成し、プラットフォームデータからデータを出力するコードは次の通りです。
/** 7. Send the result data to Client **/ HttpPlatformResponse res = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML,"UTF-8"); res.setData(senddata); res.sendData();
照会サービス – search.jsp
基本的なpseudoコードです。
// 1.ライブラリのインポート(XPLATFORM X-APIを含む) // 2.Mimeタイプの定義 // 3.XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成 try { // 5.データの処理 // 6.エラーコードとエラーメッセージの処理 (成功メッセージ) } Catch (エラー) { // 6.エラーコードとエラーメッセージの処理 (エラーメッセージ) } // 7.結果データをクライアントに伝送
基本的な照会JSPのプレビュー(search.jsp)
<!-- 1.library import --> <%@ page import="java.io.*" %> <%@ page import="com.tobesoft.xplatform.data.*" %> <%@ page import="com.tobesoft.xplatform.tx.*" %> <!-- 2. mime type define --> <%@ page contentType="text/xml; charset=UTF-8" %> <% /** 3.XPLATFORM Basic Object creation **/ PlatformData readdata = new PlatformData(); /** 6.1 ErrorCode, ErrorMsg creation **/ int nErrorCode = 0; String strErrorMsg = "START"; try { /** 4. receive client request **/ // not need to receive /** 5. handle data : load data from file **/ /** 5.1 load data from file **/ String sourceFilename = "./saveFile.bin";; InputStream source = new FileInputStream(sourceFilename); PlatformRequest req = new PlatformRequest(source, PlatformType.CONTENT_TYPE_BINARY); req.receiveData(); source.close(); /** 5.1 copy data from loaded data to Dataset **/ readdata = req.getData(); /** 6.2 set the ErrorCode and ErrorMsg about success**/ nErrorCode = 0; strErrorMsg = "SUCC"; } catch (Throwable th) { /** 6.3 set the ErrorCode and ErrorMsg about fail **/ nErrorCode = -1; strErrorMsg = th.getMessage(); } /** 6.4 save the ErrorCode and ErrorMsg for sending Client **/ VariableList varList = readdata.getVariableList(); varList.add("ErrorCode", nErrorCode); varList.add("ErrorMsg", strErrorMsg); /** 7. send the result data to Client **/ HttpPlatformResponse res = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML,"UTF-8"); res.setData(readdata); res.sendData(); %>
Javaライブラリのインポート
“Javaライブラリのインポート”の内容と同一です。
Mimeタイプの定義
“Mimeタイプの定義”の内容と同一です。
XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成
“XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成”の内容と同一です。
ファイルの内容を読み込みデータセットを生成
“./saveFile.bin”ファイルの内容を読み込み、プラットフォームデータのオブジェクトにセーブします。このプラットフォームデータのオブジェクトにデータセットが格納されています。
ファイルの内容を読み込みプラットフォームデータに保存するコードは、次の通りです。
/** 5. handle data : load data from file **/ /** 5.1 load data from file **/ String sourceFilename = "./saveFile.bin"; InputStream source = new FileInputStream(sourceFilename); PlatformRequest req = new PlatformRequest(source, PlatformType.CONTENT_TYPE_BINARY); req.receiveData(); source.close(); /** 5.2 copy data from loaded data to Dataset **/ pdata = req.getData();
エラーコードとエラーメッセージの処理
“エラーコードとエラーメッセージの処理”の内容と同一です。
結果値をClientに伝送
JSPコードの内容は“結果値をクライアントに伝送”の内容と同一ですが、その意味は異なります。“結果値をクライアントに伝送”で使用されたプラットフォームデータのオブジェクトはエラーコードとエラーメッセージのみを格納していますが、この章のプラットフォームデータはクライアントが使用する名刺リストのデータセットを格納しています。
このデータセットは、“エラーコードとエラーメッセージの処理”のコードを実行しながら自動で格納されます。
保存サービス – save_list.jsp
基本的なpseudoコードです。
次のpsuedoコードの“4. クライアントのパラメータを受け取る”は“初期資料生成サービス – initdata.jsp”と“照会サービス – search.jsp”にはなく、この章で追加された内容です。
1.ライブラリのインポート(XPLATFORM X-APIを含む) 2.Mimeタイプの定義 3.XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成 try { 4.クライアントのニーズを受け取る 5.データの処理 6.エラーコードとエラーメッセージの処理 (成功メッセージ) } Catch (エラー) { 6.エラーコードとエラーメッセージの処理 (エラーメッセージ) } 7.結果データをクライアントに伝送
セーブしたJSPのプレビュー(save_list.jsp)
<!-- 1.library import --> <%@ page import="java.io.*" %> <%@ page import="com.tobesoft.xplatform.data.*" %> <%@ page import="com.tobesoft.xplatform.tx.*" %> <!-- 2. mime type define --> <%@ page contentType="text/xml; charset=UTF-8" %> <% /** 3.XPLATFORM Basic Object creation **/ PlatformData pdata = new PlatformData(); /** 6.1 ErrorCode, ErrorMsg creation **/ int nErrorCode = 0; String strErrorMsg = "START"; try { /** 4. receive client request **/ // create HttpPlatformRequest for receive data from client HttpPlatformRequest req = new HttpPlatformRequest(request); req.receiveData(); /** 5. handle data : load data from file **/ /** 5.1 load data from http object **/ pdata = req.getData(); /** get Dataset from received data **/ DataSet ds = pdata.getDataSet("dsPerson"); /** save data to file with init data **/ String targetFilename = "./saveFile.bin"; OutputStream target = new FileOutputStream(targetFilename); PlatformResponse res = new PlatformResponse(target, PlatformType.CONTENT_TYPE_BINARY); res.setData(pdata); res.sendData(); target.close(); /** 6.2 set the ErrorCode and ErrorMsg about success **/ nErrorCode = 0; strErrorMsg = "person list saved complete : row count("+ds.getRowCount()+")"; } catch (Throwable th) { /** 6.3 set the ErrorCode and ErrorMsg about fail **/ nErrorCode = -1; strErrorMsg = th.getMessage(); System.out.println("ERROR:"+strErrorMsg); } /** 6.4 save the ErrorCode and ErrorMsg for sending Client **/ PlatformData senddata = new PlatformData(); VariableList varList = senddata.getVariableList(); varList.add("ErrorCode", nErrorCode); varList.add("ErrorMsg", strErrorMsg); /** 7. send the result data to Client **/ HttpPlatformResponse res = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML,"UTF-8"); res.setData(senddata); res.sendData(); %>
Javaライブラリのインポート
“Javaライブラリのインポート”の内容と同一です。
Mimeタイプの定義
“Mimeタイプの定義”の内容と同一です。
XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成
“XPLATFORMの基本的なオブジェクト(プラットフォームデータ)の生成”の内容と同一です。
クライアントからリクエストを受け取る
“初期資料生成サービス – initdata.jsp”と“照会サービス – search.jsp”では、クライアントからリクエストを別途に受け取る必要がありませんでした。それは、該当のJSP Serviceが別途にクライアントからパラメータを受け取らないからです。即ち、該当のJSP Serviceの呼び出しのみでクライアントが望む作業をすることができました。
しかしこの章では、クライアントからパラメータでデータセットを受け取らなければなりません。 クライアントからパラメータを受け取るコードは次の通りです。
/** 4. receive client request **/ // create HttpPlatformRequest for receive data from client HttpPlatformRequest req = new HttpPlatformRequest(request); req.receiveData();
クライアントのリクエストからデータを抽出しファイルにセーブ
クライアントから受け取った情報を処理するために、先ず該当の情報をプラットフォームデータに変換します。プラットフォームデータからデータセットを抽出します。ここで抽出されたデータセットから必要な情報を得ます。ここではセーブしたRow件数を得るために使用しますが、その使用例は次の章で示します。 生成されたプラットフォームデータを“./saveFile.bin”ファイルにセーブします。
クライアントのリクエストからプラットフォームデータを抽出しファイルにセーブするコードは、次の通りです。
/** 5. handle data : load data from file **/ /** 5.1 load data from http object **/ pdata = req.getData(); /** get Dataset from received data **/ DataSet ds = pdata.getDataSet("dsPerson"); /** save data to file with init data **/ String targetFilename = "./saveFile.bin"; OutputStream target = new FileOutputStream(targetFilename); PlatformResponse res = new PlatformResponse(target, PlatformType.CONTENT_TYPE_BINARY); res.setData(pdata); res.sendData(); target.close();
エラーコードとエラーメッセージの処理
“エラーコードとエラーメッセージの処理”の内容と同一ですが、成功した場合にstrErrorMsgにセーブする名刺リストの件数を格納する部分が異なります。
結果値をクライアントに伝送
“結果値をクライアントに伝送”の内容と同一です。