8.4.1 業務サーブレット作成のポイント
業務サーブレットを作成するときには,次のようなポイントがあります。
-
遷移する画面や帳票が多い場合,または遷移条件が複雑な場合には,通信制御用のクラスまたは画面遷移用のクラスを作成してください。
-
画面ごとまたは帳票ごとに詳細な業務処理が必要な場合は,画面ごとまたは帳票ごとにクラスを作成してください。
業務サーブレットを作成するときには,次の内容に注意してください。
- 入力/出力データ用XML文書,定数用XML文書の参照方法
-
各XML文書から作成したオブジェクトを作成します。画面や帳票に出力するデータ,または画面から入力したデータは,オブジェクトのsetter/getterメソッドを使用してJavaプログラムからアクセスします。オブジェクトのsetter/getterメソッドは,XMAP3実行クラスライブラリを利用します。
- 文字コードについて
-
Javaで扱う文字コード(UCS-2)と各論理マップの文字コード(シフトJIS)は自動的に変換します。外字については,シフトJIS(MS932)の範囲の文字コード(1,880文字)が利用できます。
- 例外処理について
-
各論理マップのアクセスなどで例外が発生した場合に,ユーザ独自の処理を記述できます。
- 動的変更用XML文書の参照方法
-
動的変更用XML文書から作成した動的変更用のオブジェクトを作成します。このオブジェクトは,Javaプログラムからsetter/getterメソッドを利用してアクセスします。オブジェクトのsetter/getterメソッドは,XMAP3実行クラスライブラリを利用します。オブジェクトは,セッション上のオブジェクトとして利用します。
- 通信制御用XML文書の参照方法
-
通信制御用XML文書から作成した通信制御用のオブジェクトを作成します。このオブジェクトは,Javaプログラムからsetter/getterメソッドを利用してアクセスします。オブジェクトのsetter/getterメソッドは,XMAP3実行クラスライブラリを利用します。オブジェクトは,セッション上のオブジェクトとして利用します。
- クラス名について
-
業務サーブレットを作成するとき,作成するクラス名として「xmap3」は使用できません。クラス名は大文字と小文字を識別するため「XMAP3」は使用できます。
- 〈この項の構成〉
(1) 通信処理の記述のポイント
業務サーブレットの通信処理部分は,XMAP3/Web for Cosminexusが提供するサンプルソースをカスタマイズして使用します。カスタマイズには,MyEclipseを使用します。XMAP3/Web for Cosminexusでは,次に示すフォルダに業務サーブレットの通信処理部分のソース(SampleServlet.java)を提供しています。
XMAP3インストールフォルダ\Web for Cosminexus\SAMPLE\JAVA\sample\servlet
業務サーブレットの通信処理部分のサンプルソースを次に示します。
- サンプルソース
package sample.servlet; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jp.co.Hitachi.soft.XMAP3.server.ComTbl; import jp.co.Hitachi.soft.XMAP3.server.PropertyValue; import jp.co.Hitachi.soft.XMAP3.server.XmapEnvironmentException; import jp.co.Hitachi.soft.XMAP3.server.XmapException; import jp.co.Hitachi.soft.XMAP3.server.XmapRuntimeException; import sample.appmanager.AppManager; public class SampleServlet extends HttpServlet { private static final String CONTENT_TYPE = "application/octet-stream"; public void doPost( HttpServletRequest request, HttpServletResponse response) throws IOException { InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = request.getInputStream(); response.setContentType(CONTENT_TYPE); outputStream = response.getOutputStream(); final int contentLength = request.getContentLength(); if (contentLength != -1) { byte[] clientDataI = new byte[contentLength]; final int readLength = inputStream.read(clientDataI); if (contentLength == 0 || readLength == clientDataI.length) { byte[] clientDataO = null; try { PropertyValue prop = PropertyValue.createInstance(getServletContext()); clientDataO = AppManager.invoke(prop, clientDataI); } catch (XmapRuntimeException e) { e.printStackTrace(); errorCase(outputStream); return; } catch (XmapException e) { e.printStackTrace(); errorCase(outputStream); return; } catch (XmapEnvironmentException e) { e.printStackTrace(); errorCase(outputStream); return; } if (clientDataO != null) { //正常ケース outputStream.write(clientDataO, 0, clientDataO.length); return; } else { //クライアントに返すデータが作れなかった場合 errorCase(outputStream); return; } } else { //入力ストリームからのデータの読み込みに失敗した場合 errorCase(outputStream); return; } } else { //入力ストリームから読み込めるバイト長が不明な場合 errorCase(outputStream); return; } } finally { try { if (inputStream != null) { inputStream.close(); } if (outputStream != null) { outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } private final void errorCase(OutputStream outputStream) throws IOException { byte[] clientDataO = new byte[0]; try { PropertyValue prop = PropertyValue.createInstance(getServletContext()); ComTbl com = new ComTbl(prop, (byte) 0x00); com.setDataString("XMAP_ID", "*XWC"); com.setDataString("XMAP_ENDOPT", "E"); com.setDataShort("XMAP_URLLNG", (short) 128); //エラー時の画面遷移を指定する com.setDataString( "XMAP_URL", "http://localhost:8080/XmapWebApp/error.html"); clientDataO = com.getClientData(); } catch (XmapException e) { e.printStackTrace(); } catch (XmapEnvironmentException e) { e.printStackTrace(); } outputStream.write(clientDataO, 0, clientDataO.length); return; } }
(2) 業務処理の記述のポイント
入力/出力データ用オブジェクトに対して,画面単位または帳票単位にデータの取得処理か設定処理をします。
XMAP3/Web for Cosminexusのサンプルプログラムでは,さまざまな業務処理を業務JavaAPとして提供しています。業務処理部分のサンプルソースとして提供している業務JavaAPの中から「KAD2GHND_PF02.java」を次に示します。この業務JavaAPでは,ボタンまたはPF02をクリックしたとき,次画面を表示するための通信制御用のデータと画面表示用のデータを設定しています。
- サンプルソース
package sample.apps; import jp.co.Hitachi.soft.XMAP3.server.ComTbl; import jp.co.Hitachi.soft.XMAP3.server.ConstValue; import jp.co.Hitachi.soft.XMAP3.server.LogicalMap; import jp.co.Hitachi.soft.XMAP3.server.PropertyValue; import jp.co.Hitachi.soft.XMAP3.server.XmapEnvironmentException; import jp.co.Hitachi.soft.XMAP3.server.XmapException; import jp.co.Hitachi.soft.XMAP3.server.XmapRuntimeException; import sample.appmanager.AppInterface; import sample.appmanager.AppManager; public class KAD2GHND_PF02 implements AppInterface { public LogicalMap doMethod( PropertyValue prop, ComTbl comTbl, LogicalMap logicalMapI, LogicalMap logicalMapO, ConstValue constValue) throws XmapRuntimeException, XmapException, XmapEnvironmentException { comTbl.init((byte) 0x00); final short lsglng = constValue.getDataShort("KAD4GHT"); comTbl.setDataString("XMAP_ID", "*XWC"); comTbl.setDataShort("XMAP_RTN", (short) 0); comTbl.setDataShort("XMAP_RSN", (short) 0); comTbl.setDataInteger("XMAP_MAPOPT1", 0); comTbl.setDataShort("XMAP_URLLNG", (short) 0); comTbl.setDataString("XMAP_TNAME", " "); comTbl.setDataString("XMAP_MSG", "BWS "); comTbl.setDataString("XMAP_MAPNAME", "KAD4GHND"); comTbl.setDataString("XMAP_ENDOPT", " "); comTbl.setDataShort("XMAP_LSGLNG", lsglng); logicalMapO.init(AppManager.XMAP_NODATA); logicalMapO.setDataShort("KAD4GHL", lsglng); logicalMapO.setDataString("KAD4GH_KNAME_O", "○×A1電器"); logicalMapO.setDataString("KAD4GH_DCODE_O", "D0012345"); logicalMapO.setDataString("KAD4GH_KCODE_O", "K0012345"); logicalMapO.setDataString("KAD4GH_TNAME_O", "日立 太郎"); logicalMapO.setDataString("KAD4GH_TCODE_O", "T01"); logicalMapO.setDataString("KAD4GH_SICODE_O", "S1"); return logicalMapO; } }