今回は、COBOLからJAVAプログラムへの変換の話、オンライン編なんですけど、この話は、それだけでなく、JAVAの1つのクラスで複数回画面入出力をさせるには?という話も含みます。
COBOLからJAVAのプログラムへの変換は、まず、
昨日のブログで書いたように、バッチと同じようにすすめていくわけですが、そうすると、壁にぶちあたります。
それは
・1つのプログラムの中で、何回も画面入出力が可能で、その間、セッションが切れない
→Webでは1プログラムでだいたい1画面、画面間でセッションがきれる
・場合によっては、write(出力)からread(読む)の順番になる
→Webの場合doGet()などで、データを読んでから処理、出力と、逆になるケースあり
です。
このため、単純に、そのCOBOLプログラムを、JAVAのwebを利用したプログラムに変換できません。
実は、これは、JAVAでも、
・バッチプログラムの入出力を画面上から行わせるように変えた場合
・入出力が複数回ある画面プログラム
を、webのサーブレットやStrutsを利用しようとしたときにも、おきます。
今日は、その対処法試案
まず、各社固有のプラットフォームで、そういうものへの対応ができているのであれば、そちらを使えばいいと思います。
例えば、フォームがBeanになっていて、そのbeanに値をセットすると、画面表示する。
そして、画面でイベントが起きたときBeanから帰ってくるなんていうものが、用意されていれば、それを使えば、いいと思います。
今回は、そういうものが無いケースを考えます。方法は3つ
(1)それでも、Strutsとかで、実現したいあなたへ
(2)そういう動きをする画面表示用のプログラム(ユーティリティ)をつくってしまう
(3)荒業で、サーバーのプログラムをクライアントに持ってくる
■■(1)それでも、Strutsとかで、実現したいあなたへ
cobolのプログラムのPROCEDURE DIVISIONで、以下のようになっていたとします
OPEN 画面1
PERFORM A-SET TRUE A-SET-RTN ここで、画面の値をセットしている
WRITE 画面1
READ 画面1
PERFORM A-GET TRUE A-GET-RTN ここで、画面の値をセットしている
CLOSE 画面1
OPEN 画面2
PERFORM B-SET TRUE B-SET-RTN ここで、画面の値を受け取るセットしている
WRITE 画面2
READ 画面2
PERFORM B-GET TRUE B-GET-RTN ここで、画面の値を受け取るセットしている
CLOSE 画面2
(JAVAで書くとこういうクラスです Gamenが、画面のクラス)
Gamen g1 = new Gamen();
g1.setter();
g1.write();
g1.read();
g1.getter(); // ここで、g1の値をどっかにセーブしたとする
g1.close();
Gamen g2 = new Gamen();
g2.setter(); // ここでg1の値をもとにg2の値をセットしたとする
g2.write();
g2.read();
g2.getter(); // ここで、g2の値をどっかにセーブしたとする
g2.close();
こんなとき、どうするか
こういうとき、COBOLでは、
・READの直前で、むりやりモジュールをきって、わける。
そうすると、こうなる
PERFORM BUBUN-A THRE BUBUN-A-RET
PERFORM BUBUN-B THRE BUBUN-B-RET
PERFORM BUBUN-C THRE BUBUN-C-RET
STOP RUN
BUBUN-A
OPEN 画面1
PERFORM A-SET TRUE A-SET-RTN ここで、画面の値をセットしている
WRITE 画面1
BUBUN-A-RET
EXIT
BUBUN-B
READ 画面1
PERFORM A-GET TRUE A-GET-RTN ここで、画面の値をセットしている
CLOSE 画面1
OPEN 画面2
PERFORM B-SET TRUE B-SET-RTN ここで、画面の値を受け取るセットしている
WRITE 画面2
BUBUN-B-RTN
EXIT
BUBUN-C
READ 画面2
PERFORM B-GET TRUE B-GET-RTN ここで、画面の値を受け取るセットしている
CLOSE 画面2
BUBUN-C-RTN
EXIT
・BUBUN-Aは、メニューからこのプログラムを呼び出すところのサーブレット
(Strutsなら、Actionクラス、*.doにあたる)になる。つまり、Strutsだと、
public class A extends Action
{
execute(なんとかかんとか)
{
BUBUN-AからBUBUN-A-RETのことをかいてね
}
}
・BUBUN-Bは、画面1で、ボタンを押されたところのサーブレット
public class B extends Action
{
execute(なんとかかんとか)
{
BUBUN-BからBUBUN-B-RETのことをかいてね
ただし、 A-GET TRUE A-GET-RTNは、たぶんActionFormで
吸収してると思うぞ
}
}
・BUBUN-Cは、画面2で、ボタンを押されたところのサーブレット
public class C extends Action
{
execute(なんとかかんとか)
{
BUBUN-CからBUBUN-C-RETのことをかいてね
}
}
となる。
でも、これだと、データの受け渡しは、どーしてくれるんだ!となる。
そこで、Data Divisionに入っているデータ全部を、セッションの中にいれ、
各クラスのexecuteで入ってすぐで、
request.getSession();session.getAttribute();で値を取得、
各クラスのexecuteの抜けるところで、
session.setAttribute();で値を設定する。
ちなみに、セッションの使い方は、
ここに、まとめました。
この話、長くなりすぎたので、別の記事にして続けます。