画面・帳票サポートシステム XMAP3 プログラミングガイド


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;
     }
 
 }