1 i-web RPGによるWebアプリケーション構築 セミナー 2001年11月21日 2 セミナー内容 1. iSeries Web機能の概説 ・HTTP機能 ・CGIとは 2. Webプログラムの実演 ・各種照会、Excel出力、PDF作成、メール送信 etc (休憩) 3. Web機能の応用例 ・ドキュメント管理 ・メール通達 4.i-web RPGのご紹介 ・開発ツール ・簡易コマンド ・価格 5. コーディング・サンプル ・通常のコーディング例 ・i-web RPGのコーディング例 3 1. iSeries Web機能の概説 当章の内容はOS/400 V4R5の環境にて作成しています。 4 目次 1. 2. 3. 4. World Wide Web HTML HTTP CGI 5 1.World Wide Web • World Wide Webの始まり – World Wide Web (またはWWW,あるいはW3)とはインターネット上のページとハイ パーリンクの巨大な集合を指します。 – 1980年代の終わりにインターネットではある問題が顕在化しつつありました。当初は 情報はもっぱら電子メールやファイルであり、これらを利用するために多くのプロトコル が開発されました。しかし、従来のプロトコルでは処理しきれない新しいタイプのファイ ルが現れてきました。それは画像・音声はもとより、あらゆる情報へ飛ぶことのできる ハイパーリンクを含むマルチメディア・ファイルです。 – 1990年ヨーロッパの素粒子物理学研究所であるCERN(Conseil Europeen pour la Recherche Nucleaire)で、新しい種類の情報を受渡しする新しい標準を作る内部プロ ジェクトのプロポーザルが作成されました。基本となる要素はマルチメディア、ハイパー テキスト・ファイルの標準及びこれを提供する手段の標準です。ファイルの標準は HTML(HyperText Markup Language)となり、提供手段の標準はHTTP(HyperText Transfer Protocol)になりました。 6 – クライアントはURL(Uniform Resource Locator)という形式で情報を要求します。要求 されたサーバーはHTTPプロトコルを使用して、URLで指定された文書をクライアントに 返します。この時のクライアントをWebブラウザ、サーバーをHTTPサーバー(もしくは Webサーバー)と言います。文書はHTMLで記述され、テキスト/画像/音声/動画などを 含むことが出来ます。 http://www.ibm.com/jp/servers/eserver/iseries/index.html プロトコル ドメイン名(サーバー名含む) – ディレクトリ/ファイル名 他ファイルへのハイパーリンクによって、たとえそれが他のコンピュータにあったとして も、ユーザーはマウスをクリックするだけで自由に情報を行き来することが出来ます。 この技術は何台ものコンピュータに分散している情報へのアクセスを飛躍的に単純化 しました。このようにして利用されてマルチメディア・ファイルは通常「Webページ」と呼 ばれています。 7 – 最初のグラフィカルなWebブラウザは1993年にイリノイ大学NCSA(The National Center for Supercomputing Applications)で開発されたMosaic(モザイク)でした。今 日のブラウザの多くがMosaicをベースにしています。 Netscape Mosaic Opera Internet Explorer – WebブラウザはWindows、Machintosh、UNIX、Linux及びOS/2など、ウィンドウをサ ポートするほとんどの主要なクライアント・システムで稼動します。非ウィンドウ・システ ム用のブラウザも存在し、アクセスした文書のテキスト部分だけを表示します。 – 文書の作成者、サーバー、クライアントの操作環境はお互いに独立しています。それ が作成された環境、あるいは配信された環境にかかわらずアクセスし、見ることが出来 ます。 8 – 汎用クライアントであるWebブラウザは、HTTPのみならずFTP(ファイル転送)、 POP3(電子メール)、NNTP(ネットニュース)、Gopherといった主要なプロトコルをサ ポートしており、先程のURL指定で、プロトコルを指定することで様々なサービス(サー バー)にアクセスすることが出来ます。 ftp://ftp.software.ibm.com/ps/products/db2/fixes/japanese/ プロトコル ドメイン名(サーバー名含む) – ディレクトリ名(/ファイル名) 高機能で魅力的なブラウザが無料、あるいは評価版として提供されるようにったことと、 日本でも95年にWindows95が出荷され、それまでは比較的高価で複雑であった TCP/IPプロトコルがOS標準で使用できるようになったことで、爆発的にアクセスが増 加しました。 9 2.HTML • HTMLとは – HTMLはプラットフォームに依存しないハイパーテキスト文書を記述するためのマーク アップ(文書の構造を示すために挿入する区切り文字列)言語です。 – HTMLはプログラミング言語ではありませんが、これとよく似ています。HTMLにはタグ と呼ばれるコマンドや文法があります。HTML自体は単純なテキストファイルですので、 任意のテキスト・エディターで作成することが出来ます。最近ではIBMホームページ・ビ ルダーなど簡易的にHTMLを作成できるツールも多く発表されています。 – HTMLは進化しており、現時点での最新バージョンはHTML4.01です。コンテンツを作 成する場合はどのバージョンに準拠するかを明確にすることと、Webブラウザによって は独自の拡張タグがあるのでその拡張タグを使用する/しないを明確にすることが大切 です。 (最新のNetscape、MS Internet ExplorerはHTML4.0 + αをサポートしています) 10 – HTMLの構造 • HTMLはテキストで記述される。 • タグと呼ばれる「<>」で囲まれた部分が表現方法をあらわす。 – タグは原則的に表現属性の開始を表す<…..>と表現属性の終了 を表す</…..>とで囲んで指定する。ただし、終了指定のないタグ も多数ある。 » HTML文書自身も<HTML>で始まり</HTML>で終わる。 – タグは英大文字/小文字の区別はなく、どちらで記述しても構わな い。 • HTML文書上のプランク文字/改行はWebブラウザ上では無視される。 – HTML文書上の見た目と、Webブラウザでの表現とは異なること がある。 – 例外として<PRE>タグあり。 • 基本的には文書の行/桁位置を示すタグはない。 – 文書の相対的な位置により表示場所が来まる。 – ただし水平(横)位置はピクセル、パーセント指定が出来る。 11 2-1.HTMLサンプル1 – HTMLサンプル1 ① <html> <head> ② <title>ようこそホームページへ</title> </head> ③ <body> ④ <center> ⑤ <h1>HTMLのサンプル</h1> </center> ⑥ <hr> ⑦ 我輩は猫である。 名前はまだ無い。 <hr> ⑧ 我輩は猫である。<br> 名前はまだ無い。 <hr> ⑨ <b>我輩は猫である。 名前はまだ無い。</b> <hr> ⑩ <ul> ⑪ <li>我輩は猫である。 <li>名前はまだ無い。 </ul> </body> </html> ①<html>~</html> HTML文書の開始と終了を表す ②<title>~</title> ブラウザ上のタイトル・バーに表示される ③<body>~</body> HTML文書の本体を示し、この間にテキスト、 イメージ・ファイル、多文書へのリンクを記述 ④<center>~</center> ブラウザ上で中央寄せ表示する ⑤<h1>~</h1> ヘッダー(header)を意味し、見出しとして扱わ れる。具体的には文字サイズが大きくなる。 <h2>,<h3>,<h4>,<h5>,<h6>あり ⑥<hr> 水平線を表示。終了タグ</hr>は存在しない ⑦改行なし HTML文書上では改行しているが、ブラウザ 上では改行表示されていない ⑧<br> ブラウザ表示上で改行を意味する タグの終了を表す</br>は存在しない ⑨<b>~</b> 文字を太字(bold)で表示 ⑩<ul>~</ul> 箇条書きを意味する(ブラウザに表示されない) ⑪<li> 箇条書きの場合のみ有効 リスト項目であることを表示 12 2-2.HTMLサンプル2 – HTMLサンプル2 ①<a>~</a> 他文書へのリンクを記述。 <a>タグ内のhref=属性で、リンク先のサーバー及び文書 (ディレクトリー名含む)を指定。 全く別のサーバー上にある文書を指定する場合はプロト コル、ドメイン名、ファイル名を指定。 ②<a>~</a> 同じく他文書へのリンク。 当HTMLと同じサーバー上にある別文書へリンクする場合 は(ディレクトリー名及び)ファイル名のみを指定。 ③<img> イメージ・ファイルを指定。 <img>タグ内のsrc=属性で、ファイル名を指定。 同一サーバー上でも他サーバー上にあるファイルでも可能。 <html> <head> <title>ようこそホームページへ</title> </head> <body> <center><h2>文書リンクのサンプル</h2></center><br> ① <a href="http://www.ibm.com/jp/">日本IBMのサイトへ(他サーバー)</a> <br> ② <a href="/book/title/index.html">別の文書へ(同一サーバー内)</a> <hr> <center><h2>イメージファイルのサンプル</h2></center><br> ③ <img src="http://www.ibm.com/mast_logo_anim_jp.gif"> </body> </html> 13 2-3.iSeries上でのHTML – iSeriesにおけるHTMLファイルの置き場所 • iSeries上でHTMLファイルを格納する場所は、大きく2種類あります。 各々長所/短所を理解した上で適切な場所に置いてください。 • IFS(統合ファイルシステム : Integrated File System) – OS/400 V3R1より、従来のライブラリーという管理方法に加え、 このIFSが拡張されました。 – このIFSはUNIX,Windowsのような階層ディレクトリー管理方法で あり、特にHTMLファイルの格納に適しています。 – PC上で作成したHTMLファイルやイメージ・ファイル(GIF,JPEG 等)をそのまま(=ASCIIコード)格納します。 • ライブラリー(/QSYS.LIB) – 従来からのOS/400のファイル管理方法であり、EBCDICコードで 格納されます。 – RPG/COBOL等のプログラムからのアクセスが可能であり、レ コード単位の“データベース(DB2/400)”をサポートします。 (上述のIFSではデータベースを格納できず、“単なるファイル”の 集まりにすぎません) – ライブラリー上にHTMLファイルを置いた場合は、最終的には ASCIIテキストにコード変換してブラウザに送信するため、コード 変換の処理が余分に必要です。 14 – IFS、ライブラリーのどちらに置くか • IFSに置くケース – 静的なHTMLコンテンツやマルチメディア・ファイルはIFS上に置く ことをお勧めいたします。 これらのファイルはそのまま(無変換)の状態でiSeries(HTTPサー バー)からクライアント(ブラウザ)に送信されます。 – パフォーマンスが良いことと、IFSのファイル命名規則は制約が少 ない(最大255文字まで)ことから、特別な理由がない限りIFSを使 用すべきでしょう。 • ライブラリーに置くケース – RPG/COBOL等のプログラムを使用してCGIプログラムを作成す る場合は、雛型のHTMLファイルをライブラリー上に置きます。 CGIプログラム中ではEBCDICコードの状態でHTMLファイルを 生成し、最終的にブラウザに送信する直前でASCIIコードへの コード変換を行ないます。 – RPG/COBOLからアクセス可能ですがコード変換が必要となりパ フォーマンスが劣ることから、限定して使用する(=CGIのみの利 用とする)べきでしょう。 15 2-4.CCSID • CCSID(コード化文字セットID) – iSeriesからPCへのファイル転送や、ODBCアクセスした時に、データや画面の文字が 意図したものと異なる(所謂“文字化け”)ケースがあります。 多くの場合、その原因はiSeriesとPCとの文字コードが異なることに起因しています。 – iSeriesやメインフレームは基本文字コードとしてEBCDICを、PC/UNIXはASCIIを採用 しています。つまりこれらの間でデータを正しくやり取りするには、どこかでこのコード変 換を適切に行なう必要があります。 – Webブラウザ側にはこのコード変換を考慮した機能を持っていないので、iSeries側で コード変換を行なうことになります。 このコード変換はユーザー・アプリケーションにて実行することも可能ですが、OS/400 にも変換機能があり、この機能を正しく使用すればユーザー・アプリケーション側での 考慮は不要になります。 – このコード変換の際に「どのような規則に基づいて変換を行なうか」をシステムが判断 する情報がCCSID(Coded Character Set IDentifier)です。 16 – CCSIDの構成要素 • CCSIDは単なるコード体系のみではなく「ある文字セットに含まれる文 字/コード/表現方法」などを単一の値で表します。 • 主な言語のCCSIDとその構成要素を下表に示します。 EBCDICに該当するものは網掛けで示してあります。 • 日本語環境でよく利用されるのは「5026」と「5035」および「65535」で しょう。(「65535」は“変換しない”ことを示す特殊値です。)Pcomでは 5026/5035のスーパーセットである「930」と「939」が採用されています。 CCSID Code Page Character Set 備考 Encoding 00037 00037 00037 1100 アメリカ、カナダ、オーストラリア 00437 00037 01212 2100 US PC 00930 00290 / 00300 01172 / 01001 1301 日本語拡張カタカナ。4370外字(5026の上位) 00932 00897 / 00301 01122 / 00370 2300 Japan PC(DOS:旧JIS並び) 00939 01027 / 00300 01172 / 01001 1301 日本語拡張英小文字。4370外字(5035の上位) 00943 01041 / 00301 01172 / 00370 2300 Japan PC(Windows拡張) 05026 00290 / 00300 01172 / 00370 1301 日本語拡張カタカナ。1880外字 05035 01027 / 00300 01172 / 00370 1301 日本語拡張英小文字。1880外字 65535 無変換を表す特殊なCCSID 17 – CCSIDのメカニズムの重要性 • CCSIDは様々な処理で扱われています。 例えば一見簡単そうな「Pcomを使用して5250画面でデータベースの 中身(実データ部分)を参照する」場合にも以下の3つの設定が合致し ていなければなりません。 – データベース・ファイルのCCSID (DSPFDで確認) – 実行しているジョブ(端末)CCSID (DSPJOBで確認) – 表示しているPcomのCCSID (Pcom構成のホスト・コードページ) • その他データベース・ファイル以外にも表示装置ファイル、印刷装置 ファイルにもそれぞれCCSIDが付いており、それぞれ正しい変換結果 を得られるような仕組みをOS/400は持っており、ユーザーが正しい理 解/設定が必要です。 • 今回のWebサーバーの構築もまさにこのCCSIDのメカニズムを利用し て、ユーザーが意識することなくコード変換を行ないます。 その他FTPによるファイル転送、ODBCによるデータベース・アクセスも 同様です。 18 – CCSIDの指定(CCSIDは何に基づいて決定されるか) • iSeries対話型ジョブ – システム値 QCCSID – ユーザー・プロフィール中のCCSID – CHGJOBコマンド中のCCSIDパラメータ – (システム値 QLANGID) – (ユーザー・プロフィール中のLANGID) • iSeriesバッチ型ジョブ – バッチ型ジョブ(ユーザー投入ジョブ、システム・サーバー・ジョブ含む)に関し ては、上記のようにユーザー・プロフィールによって決定されるものもあれば、 個別に設定するケースもあり、必ずマニュアルにて確認する必要があります。 • iSeriesオブジェクト – データベース・ファイル » DDSあり:ソースで明示的にCCSIDが指定されている場合はその値。 明示指定がない場合はジョブの値。 » DDSなし:ファイルを作成する時(CRTPFコマンド)にCCSIDを指定。 – ソース・ファイル » ソース・ファイルを作成する時(CRTSRCPFコマンド)にCCSIDを指定。 – 表示装置ファイル/印刷装置ファイル » ソース・ファイルのCCSIDがそのまま取られる。 19 3.HTTP • HTTPの基本的な動作 ① Webブラウザは通常TCP/IPのポート番号80を使用してサーバーへの接続を試みま す。接続があらかじめ設定された時間内に確立できなかった場合、ブラウザはエ ラー・メッセージを表示して要求を終了します。 ② 接続が確立されるとブラウザはサーバーにリソース(HTML文書やマルチメディア・ ファイルが格納されているディレクトリ名、ファイル名)を要求します。サーバーはリ ソースをブラウザに送信して接続を切断します。リソースが使用可能でない(ファイル が存在しない、セキュリティ上アクセス出来ない等)時はブラウザにエラー・メッセージ が送られ、接続は終了します。 ③ 要求されたリソースがサーバーからブラウザに送信されるとブラウザは内容を読み 込み、これを表示したり、マルチメディア(音楽やビデオ等)を再生するための外部 ビューワーを起動します。サーバーからエラーが送られた場合はブラウザはこれを 表示します。 20 プロトコル http ドメイン名 www.ibm.com ディレクトリー /jp ファイル名 index.html http://www.ibm.com/jp/index.html ② ① Webブラウザ が要求を出す。 TCP/IPネットワーク ③ HTMLドキュメントが送ら れ、ブラウザに表示される。 ファイル名 index.html サーバーは要求を処理。 結果を返し、切断する。 21 3-1.iSeries HTTPサーバー • iSeries HTTPサーバー – iSeries(AS/400)で稼動する主なHTTPサーバー • IBM HTTP Server for iSeries (Original) – OS/400 V3R2よりOS標準提供(当時はICS,ICSSと呼ばれる) • IBM HTTP Server for iSeries (powered by Apache) – OS/400 V4R5よりOS標準提供 • Domino – OS/400 V4R2よりDominoサーバーが提供 • I/NET Web Server/400 – OS/400 V3R1より稼動 • Netscape Enterprise Server for AS/400 (日本未発表) 22 – IBM HTTP Server for iSeries (Original)機能概要 • HTTPサーバー環境 – – – – – HTTP 1.1 Proxy / キャッシュ ログ機能 マルチ・サーバー環境 テキスト・サーチ・エンジン • Webアプリケーション環境 – – – – CGI (ILE-RPG,ILE-COBOL,ILE-C,Java) SSI Net.Data Java Servlet • セキュリティ – アクセス制御(Basic認証) – 暗号化(SSL) – デジタル認証 • 管理機能 – ブラウザ・インターフェースによる管理画面 23 – IBM HTTP Server for iSeries (Original)の実体 • iSeries上のHTTPサーバーはバッチ型の常駐ジョブとして稼動 – WRKACTJOBコマンド 活動ジョブの処理 CPU %: 2.1 経過時間 : 00:00:36 S65FF18A 01/11/16 17:22:56 活動ジョブ数 : 243 オプションを入力して,実行キーを押してください。 2= 変更 3= 保留 4= 終了 5= 処理 6= 解放 8=スプール・ファイル の処理 13= 切断 ... OPT サブシステム/ジョブ QBATCH QCMN QCTL QSYSSCD QHTTPSVR KOBA_WCS KOBA_WCS KOBA_WCS KOBA_WCS KOBA_WCS QINTER QPADEV0001 ユーザー QSYS QSYS QSYS QPGMR QSYS QTMHHTTP QTMHHTTP QTMHHTTP QTMHHTTP QTMHHTTP QSYS QSECOFR 7=メッセージ の表示 タイプ CPU % 機能 SBS .0 SBS .0 SBS .0 BCH .0 PGM-QEZSCNEP SBS .0 BCH .0 PGM-QZHBHTTP BCI .0 BCI .0 BCI .0 BCI .0 SBS .0 INT .0 CMD-WRKACTJOB 状況 DEQW DEQW DEQW EVTW DEQW CNDW TIMW TIMW TIMW TIMW DEQW RUN 続く .. パラメーターまたはコマンド ===> F3= 終了 F5= 最新表示 F7= 検索 F11= 経過 データ の表示 F12= 取消し F10= 統計の再始動 F23=オプション の続き F24=キー の続き – 実行時のユーザーはシステム提供のQTMHHTTPが使用されます。 » このHTTPサーバーがコンテンツを送信する際に、今まで通り OS/400のセキュリティ・メカニズムが働きます。アクセスするオブジェ クトに対してアクセス権限が適切に設定されていなければなりません。 24 HTTPサーバー関連ライブラリー QHTTPSVR.LIB QSYS.LIB(EBCDIC) HTTPサーバー構成ファイル QUSRSYS.LIB HTTP サ ー バ ー ジ ョ ブ コード変換 CGIプログラム HTMLファイル Net.Dataマクロ コード変換 Net.Dataエンジン HTMLファイル Java Servlet -物理ファイル -ソース・ファイル Net.Dataマクロ IFS(ASCII) 25 3-2.HTTPサーバー構築 • IBM HTTP Server for iSeries (Original)構築 – チェック項目 • サーバー構成情報 – IPアドレス(&ポート番号)、ドメイン名、ホスト名、インスタンス数 • Webアプリケーション開発 – CGI、Net.DataそれともJava? • セキュリティ対策 – SSLは? アクセス制御は? – (Firewallの構築は?) – 作業項目 • TCP/IPネットワークの設定 – IPアドレス(&ポート番号)、ドメイン名、ホスト名、デフォルトゲートウェイ etc • HTTPサーバー属性の設定 • HTTPサーバー構成 – – – – サーバーインスタンス作成 ホスト名、ポート番号 経路指定(Map、Pass、Exec) コード変換指定 – – – – ログ指定 Welcomeページ DirectAccess オン/オフ プロテクション設定(アクセス制御) • アプリケーション開発 – HTMLデザイン(Webページ) – Webアプリケーション(基幹アプリケーション/データベースとの連携) 26 – 前提ハードウェアの確認 • iSeries(AS/400) RISCプロセッサーモデル – OS/400 V4Rx , V5R1が稼動するモデル • TCP/IPをサポートするLANカード – Ethernet , Token-Ring , ATM etc … – 前提ソフトウェアの確認 • 下記サンプルはOS/400 V4R5の場合 必須 5769-TC1 5769-DG1 オプション 5769-AC2,3 5769-SS1 推奨 5769-SS1 5769-XE1 *BASE *BASE AS/400 TCP/IP IBM HTTP SERVER FOR AS/400 TCP/IPプロトコル HTTPサーバー *BASE 34 CRYPTO ACCESS PROVIDER 56-BIT FOR AS/400 OS/400 - ディジタル証明書マネージャー 暗号化(SSL) デジタル認証(ID発 行) 12 *BASE OS/400 - ホスト・サーバー クライアント・アクセス WINDOWS エクスプレス版 運用/コンテンツ管理 運用/コンテンツ管理 – PTFの確認 • 最新累積PTFパッケージ • HTTPサーバー用グループPTF – OS/400 V4R5用 : SF99036 – OS/400 V5R1用 : SF99156 27 3-3.HTTPサーバー構築手順概要 • IBM HTTP Server for iSeries (Original)構築手順概要 – 手順概要 ①言語環境/操作環境の設定 – サーバー側/管理クライアント側 ②TCP/IP環境の設定 – 回線記述、IPアドレス、ドメイン名、ホスト名、デフォルトゲートウェイ etc (当資料では既に出来ているものとし、割愛致します) ③HTTPサーバー属性の設定 ④管理用HTTPサーバー構成の設定 ⑤HTTPサーバー構成、インスタンスの作成 – HTTPサーバー構成とインスタンスを作成し、その関連付けを行なう ⑥HTTPサーバー構成の設定 – 上記で作成したHTTPサーバー構成に具体的に設定値を指定する » 基本設定 » メソッドの設定 » 経路指定 etc…. ⑦HTTPサーバーの開始/終了 – 作業 • • ①~④ : 5250画面より行なう ⑤~⑦ : Webブラウザより行なう (5250画面でも可) 28 – 当資料のシナリオ • HTTPサーバー構成の設定項目(前ページ手順⑥)は多岐に渡ります。 当資料では構成手順の概要を理解して頂くために、必要最低限の設 定項目に関して説明致します。 • 今回設定する項目は以下の5つです。 – 基本設定 » ホスト名、ポート番号等の基本情報 – ウェルカム・ページ設定 » デフォルト表示させるWebページ(HTMLファイル) – メソッド » WebブラウザからHTTPサーバーにアクセスする際のコンテンツ要 求方法の指定 – 経路指定 » URLで指定する論理パスと、サーバー上の物理パスのマッピング – ログ » アクセス・ログ、エラー・ログ等のロギング指定 29 3-3.①言語環境/操作環境の設定 ①言語環境/操作環境の設定 • サーバー側 – CCSID = 5035 (日本語拡張英小文字) – システム値QCCSIDで指定、もしくは後述のHTTPサーバー構成内で指定 (新規に導入する場合はシステム値で設定することをお勧めします) • 管理クライアント側 – 5250エミュレータ » エミュレータのホスト・コードページ = 939 (日本語拡張英小文字) » iSeriesにサインオン後、ジョブ属性CCSIDを5035に変更 CHGJOB CCSID(5035) – Webブラウザ » JavaScript、フレームをサポートすること » Proxyの設定は外し、キャッシュを“0”に設定 ②TCP/IP環境の設定 • 当資料では割愛 30 3-3.③HTTPサーバー属性の設定 ③HTTPサーバー属性の設定 • HTTPサーバー全体の属性を指定します。 – CHGHTTPAコマンド HTTP 属性の変更 (CHGHTTPA) 選択項目を入力して,実行キーを押してください。 ① 自動開始 . . . . . . . . . . ② サーバー・スレッドの数 : 最小 . . . . . . . . . . . 最大 . . . . . . . . . . . ③ コード化文字セット識別コード SERVER マッピング・テーブル : EBCDIC/ASCII テーブルの発信 ライブラリー . . . . . . . *NO . . 10 40 > 00943 *YES, *NO, *SAME 1-9999, *SAME, *DFT 1-9999, *SAME, *DFT, *NOMAX 1-65533, *SAME, *DFT *CCSID 名前 , *SAME, *CCSID, *DFT 名前 , *LIBL, *CURLIB *CCSID 名前 , *SAME, *CCSID, *DFT 名前 , *LIBL, *CURLIB . ASCII/EBCDIC TABLE の受信 . . ライブラリー . . . . . . . 終り F3= 終了 F4=プロンプト F13= この画面の使用法 F5= 最新表示 F12= 取り消し F24= キーの続き ①STRTCPコマンドTCP/IPを開始した時に、HTTPサーバーを自動的に開始するかどうかを指定。 STRTCPSVRコマンドでHTTPを開始した場合は、このパラメータ値に関係なく開始します。 ②サーバー(iSeries)上で稼動するスレッド数を指定。 この値は同時アクセス数やハードウエア資源によって決定されます。 通常は省略値からスタートし、テスト/実稼動の中で調整します。 ③ブラウザからの要求でMIMEヘッダが見つからない場合に、CGIでEBCDIC→ASCII変換を行 なう際のASCII-CCSIDを指定。943はWindowsで使用されているSJISに相当します。 31 3-3.④管理用HTTPサーバー構成の設定 ④管理用HTTPサーバー構成の設定 • HTTPサーバーの管理/構成は、管理用のブラウザ・インターフェースが提供され ています。ここではその管理用画面を使用するための初期設定を行います。 – WRKHTTPCFG CFG(*ADMIN) HTTP 構成の処理 システム : 構成名 . . . . . . . . . . . . . : オプションを入力して,実行キーを押してください。 1= 追加 2= 変更 3= コピー 4= 除去 5= 表示 OPT 順序番号 00010 00020 00030 00040 00050 00060 00070 00080 F3= 終了 F18= 最下部 S65FF18A ADMIN 13= 挿入 項目 # * * * * * * * * * # HTTP Admin server # * * * * * * * * * DefaultFsCCSID DefaultNetCCSID ScriptTimeOut OutputTimeOut InputTimeOut * * * * * * * * * * * * * * * * * * CUSTOMER configuration * * * * * * * * * * * * * * * * * * 5026 943 3600 minutes 3600 minutes 3600 minutes F5= 最新表示 F6= リストの印刷 F19= 順序の編集 F12= 取消し 終り F17= 最上部 上記の5ステートメントを追加して下さい。(先頭が「#」で始まる行はコメント行です) 英大文字/小文字は識別されるので、上記の通りに入力して下さい。 • 管理用HTTPサーバーの起動/終了 – STRTCPSVR SERVER(*HTTP) HTTPSVR(*ADMIN) – ENDTCPSVR SERVER(*HTTP) HTTPSVR(*ADMIN) 32 – 管理用HTTPサーバーの稼動確認 • 管理用HTTPサーバーが稼動しているかどうか確認して下さい。 – WRKACTJOB SBS(QHTTPSVR) 活動ジョブの処理 CPU %: .0 経過時間 : 00:00:00 S65FF18A 01/11/15 21:42:09 活動ジョブ数 : 243 オプションを入力して,実行キーを押してください。 2= 変更 3= 保留 4= 終了 5= 処理 6= 解放 8=スプール・ファイル の処理 13= 切断 ... OPT サブシステム/ジョブ QHTTPSVR ADMIN ADMIN ADMIN ADMIN ADMIN ユーザー QSYS QTMHHTTP QTMHHTTP QTMHHTTP QTMHHTTP QTMHHTTP 7=メッセージ の表示 タイプ CPU % 機能 SBS .0 BCH .0 PGM-QZHBHTTP BCI .0 BCI .0 BCI .0 BCI .0 パラメーターまたはコマンド ===> F3= 終了 F5= 最新表示 F7= 検索 F11= 経過 データ の表示 F12= 取消し F10= 統計の再始動 F23=オプション の続き 状況 DEQW CNDW TIMW TIMW TIMW TIMW F24=キー の続き • 管理用HTTPサーバーはシステムに1つ。 – 通常のHTTPサーバー環境は複数持つ(マルチ・サーバー)ことが出来ます が、管理用HTTPサーバーは1つしかありません。 33 3-3.⑤HTTP構成、インスタンスの作成 ⑤HTTPサーバー構成、インスタンスの作成 • HTTPサーバー構成方法には以下の2通りがあります。 – ブラウザ・インターフェースによる構成 » 設定項目がブラウザに表示され、値を指定する。 » 指定ミスが起こりにくく、当初はこちらをお奨めします。 – 5250画面による構成 » 構成内容(ディレクティブ及び設定値)を直接記述する。 » 設定項目の意味/相互関連を理解していなければなりません。 34 – サーバー構成情報の実体 • 構成情報はライブラリーQUSRSYSの物理ファイルに格納 – 上述のどちらの構成方法を選択しても、最終的に構成情報は ライブラリーQUSRSYS/物理ファイルQATMHINSTC,QATMHTTPCに書 き出されます。 – 複数のサーバー構成(インスタンス)を作成した場合は、上記物理ファイル の別メンバーとして作成されます。 サーバー構成の開始 <<インスタンス>> <<HTTPサーバー構成>> 物理ファイル QUSRSYS/QATMHINSTC 物理ファイル QUSRSYS/QATMHTTPC メンバー STRTCPSVR SERVER(*HTTP) HTTPSVR(WEB01) メンバー DEFAULT CONFIG WEB01 WEB01 WEB02 WEB02 -r /QSYS.LIB/QUSRSYS.LIB/QATMHTTPC.FILE/WEB01.MBR -AutoStartY HostName mallas04.nagoya.japan.ibm.com Port 80 DNS-Lookup Off UserID %%SERVER%% BindSpecific On DefaultFsCCSID 5035 DefaultNetCCSID 943 Enable GET Enable HEAD Enable POST Protection Protect01 { ……… 35 – 管理用HTTPサーバーへのアクセス • Webブラウザより下記URLにアクセス – http://ホスト名:2001/ » Basic認証のためのポップアップが表示される。 QSECOFRと同等の権限をもつユーザーでログイン 「AS/400タスク」ページが表示されます。 これが管理画面のTopページです。 (表示されるメニューは導入されているラ イセンスによって異なります。) ここではHTTPサーバー管理・構成画面 の“IBM HTTP Server for AS/400”のリン クを選択します。 36 • ページのレイアウト – 画面左側(左フレーム)にメニュー – 画面右側(右フレーム)に設定項目、およびその設定値入力フィールド 37 – HTTPサーバー構成、インスタンスの作成 まず最初にHTTPサーバー構成を 作成します。 ①「構成」をクリック。 設定項目一覧が表示される。 ②「構成の作成」をクリック。 右フレームに入力画面。 ③ ④ ① ② ⑤ ③HTTPサーバー構成名を入力。 通常は、後述のインスタンス名 と同じ名前にします。 ④新規にブランク構成を作成する か、既存の構成をコピーして作 成するか、選択できます。 ⑤適用ボタンを押します。 正しく構成が作成されると「構 成ファイルが正常に作成されま した」というメッセージが表示さ れます。 38 – HTTPサーバー構成、インスタンスの作成 次にインスタンスを作成し、先程の HTTPサーバー構成との関連付け を行ないます。 ①「サーバー・インスタンス」をクリ ック。 ③ ④ ① ⑤ ② ②「サーバー・インスタンスの作 成」 をクリック。 ③インスタンス名を入力。 通常は、前述のHTTPサー バー 構成名と同じ名前にします。 ④関連付けするHTTPサーバー構 成名を選択。 ⑤作成ボタンを押します。 正しくインスタンスが作成される と「サーバーインスタンスが正 常に作成されました」というメッ セージが表示されます。 39 3-3.⑥HTTPサーバー構成の設定 ⑥HTTPサーバー構成の設定 HTTPサーバー構成の詳細設定を 行ないます。先ずは“基本構成”で す。 ①「構成」をクリック。 ②設定するHTTPサーバー構成を 選択します。 ③「基本」をクリック。 ④ ① ③ ② ④ホスト名(ドメイン名を含むFQDN) を入力。 ⑤ ⑤ポート番号を入力。 ⑥ ⑥クライアントがアクセスしてきた時 に、DNSサーバーにクライアント のホスト名を問い合わせるかど うかを指定。パフォーマンスの観 点から問い合わせない(チェック を外す)ようにする。 ⑦「適用」ボタンで確定。(以降同じ) 40 次に“ウェルカム・ページ”を設定し ます。これは、URLにファイル名を 指定しなかった場合に (例えばhttp://www.ibm.com/など) 表示されるファイル名を指定します。 ①「構成」より「ディレクトリーおよび ウェルカム・ページ」をクリック。 ②「ウェルカム・ページ」をクリック。 ① ② ③ ③表示させるファイル名を指定。 通常はindex.html、default.html 、 welcome.html等の名前を使用 するようです。 41 使用可能な“メソッド”を指定します。 メソッドとはWebブラウザからHTTP サーバーへの要求方法の種類です。 ③ ① ② 例えば通常のHTMLコンテンツを要 求する場合はGETを使用し、コンテ ンツをアップロードさせる場合には PUT、コンテンツを削除する場合に はDELETEなどです。 不要なメソッドを使用可能にすると、 サーバー上のコンテンツを破壊され る可能性があるので注意して設定 して下さい。 ①「構成」より「要求処理」をクリック。 ②「メソッド」をクリック。 ③使用可能にするメソッドにチェック。 一般的にGET、HEADを可能に し、CGIを使用する場合はPOST を可能にします。 42 次に“経路指定”を設定します。 この経路指定とは、ブラウザからU RLで指定してきた要求パス(ディレ クトリー)を、実際のサーバー上の物 理パスにマッピングします。 ①「要求の経路指定」をクリック。 ②アクションで“Pass”を選択。 ② ③ ① ④ ③URLテンプレートにはブラウザで 指定するURLパスを入力。 ここではルート(/)を指定。 ④代替ファイル・パスにはiSeries上 の実際の物理パスを指定。 ※③,④ともに指定パス以下の全て のディレクトリー、ファイルにアク セスできるようにワイルドカード 上記サンプルでは -ブラウザ上で http://www.xxx.co.jp/a.html(③の指定値) と指定すると (*) -サーバー(www.xxx.co.jp)上では 実際には /WebDocs/a.html(④の指 を指定しています。 定値)を返します。 43 最後にアクセス・ログを収集するた めの設定をします。 まずは形式を選択します。 ①「構成」より「ログ」をクリック。 ②「ログ・ファイルのグローバル設 定」 をクリック。 ③ ④ ① ② ③ログ時刻の設定を選択。 現地時間にするとシステムの現 行時刻となります。 ④ログ・ファイルの形式を選択。 “共通”にするとCERN準拠の標 準的なフォーマットを指します。 他プラットフォームで使用されて いるログ分析ツールを利用する ことが出来ます。 “DDS”にするとライブラリー上の 物理ファイルに書出され、RPG やQuery等で加工できます。 44 ログの書出し先を指定します。 ①「アクセス・ログ・ファイル」をクリッ ク。 ②ログ・ファイルの書出し先、および ログ・ファイル名を指定します。 ② ① 前述のログ形式で“共通”を指定 した場合はIFS上のディレクト リー (およびファイル名)を指定します。 “DDS”を指定した場合はライブ ラ リー(およびファイル名)を指定。 当サンプルではIFS上の/Logディ レクトリー下に書出されます。 ファイル名は AccessLog.QCYYMMDD という拡張子がつきます。 C = 世紀 , YY = 年 MM = 月 , DD =日 となり、1日単位に新規ファイル が自動的に作成されます。 45 設定内容を確認できます。 「構成の表示」をクリックすると、構 成内容が表示されます。 左図のように設定内容は 設定キーワード + 設定値 という形式で表現されます。 キーワードと設定値の間は1つ以 上のブランクで区切る必要があり ます。 この設定キーワードのことをディレ クティブと言います。 46 – 代表的なディレクティブ ディレクティブ 説明 省略値 なし HostName HTTPサーバーのホスト名を指定します。このディレクティブがない場合、 TCP/IP構成の値が使用されます。 Port HTTPサーバーがクライアントからのリクエストを受け取るTCP/IPのポート 80 番号を指定ます。通常は80を使用します。 Enable CGIプログラムを利用するためのメソッドを使用可能にします。 HEAD , GET 他 Disable CGIプログラムを利用するためのメソッドを使用不可にします。 POST , PUT他 Exec ブラウザから要求されたCGIプログラムのパス名(URL名)を、実際のサー なし バー上の物理パス名(ライブラリー名)にマップします。 Map ブラウザから要求されたパス名(URL名)を、実際のサーバー上の物理パ ス名(ディレクトリー名、ライブラリー名)にマップします。 Pass マッピングされた、またはオリジナルのURL(正確にはURI)の評価をしま なし す。サーバーから配信するコンテンツは必ずこのディレクティブで指定され ていなければなりません。Mapディレクティブと同様に置換え値を指定す ることも出来ます。 DirAccess ファイル名が明示的に指定されなかった時に、ディレクトリー構造をブラウ Off ザに返すかどうかを指定します。 Welcome ファイル名が明示的に指定されなかった時に、省略時に返すHTMLファイ ル名を指定します。 なし AlwaysWelcome Welcomeディレクティブで指定されたファイルの提供方法を制御します。 On AccessLog ブラウザからのアクセスを記録するアクセス・ログの名前を指定します。 なし ErrorLog エラー・ログの名前を指定します。 なし なし 47 3-3.⑦HTTPサーバーの開始/終了 ⑦HTTPサーバーの開始と終了 それでは実際に作成したHTTPサー バーを開始/終了させましょう。 ①「サーバー・インスタンス」をクリッ ク。 ③ ① ② ②「サーバー・インスタンスの処理」 をクリック。 ③開始/終了させるインスタンスを指 定して“開始ボタン”、“終了ボタ ン” を押すと開始/終了します。 開始後、5250画面から WRKACTJOBコマンドを使用して稼 動していることが確認出来ます。 48 HTTP属性(CHGHTTPAコマンド)で 自動開始=*YESとなっているが、個 別にインスタンスの自動開始する/し ないを制御する場合は「インスタン ス・パラメータの変更」で自動開始を 指定して制御可能です。 49 3-4.5250画面からのアクセス – 5250画面からのアクセス • 今までは管理用HTTPサーバーを介してWebブラウザによるアクセス方法を説明 しましたが、5250画面から直接編集/設定することも可能です。 – WRKHTTPCFG CFG(HTTPサーバー構成名) – 下図は今回作成した「WEB01」の設定内容です。 WRKHTTPCFG CFG(WEB01) HTTP 構成の処理 システム : 構成名 . . . . . . . . . . . . . : オプションを入力して,実行キーを押してください。 1= 追加 2= 変更 3= コピー 4= 除去 5= 表示 OPT 順序番号 項目 S65FF18A WEB01 13= 挿入 HTTP 構成の処理 構成名 . . . . . . . . . . . . . : システム : S65FF18A WEB01 オプションを入力して,実行キーを押してください。 # HTTP CONFIGURATION FILE 1= 追加 2= 変更 3= コピー 4= 除去 5= 表示 Welcome index.html HostName mallas04.nagoya.japan.ibm.com OPT 順序番号 項目 BindSpecific Off Port 80 00120 Disable CONNECT UserID %%SERVER%% 00130 Disable DELETE DNS-Lookup Off 00140 Disable PUT RuleCaseSense Off 00150 Enable GET Imbeds Off SSIOnly 00160 Enable HEAD AlwaysWelcome On 00170 Enable OPTIONS DirAccess Off 00180 Enable POST 続く ... 00190 Enable TRACE F3= 終了 F5= 最新表示 F6= リストの印刷 F12= 取消し F17= 最上部 00200 Pass /* /WebDocs/* F18= 最下部 F19= 順序の編集 データ変換に置換文字を使用することができる。 + 00010 00020 00030 00040 00050 00060 00070 00080 00090 00100 00110 F3= 終了 F5= 最新表示 F6= リストの印刷 F18= 最下部 F19= 順序の編集 データ変換に置換文字を使用することができる。 13= 挿入 F12= 取消し 終り F17= 最上部 + 50 – 関連コマンド、オブジェクト • 5250画面からのコマンド操作 – HTTPサーバー属性の変更 » CHGHTTPA – HTTPサーバー構成(インスタンス作成/編集) » WRKHTTPCFG – HTTPサーバーの開始/終了 » STRTCPSVR SERVER(*HTTP) HTTPSVR(インスタンス名) » ENDTCPSVR SERVER(*HTTP) HTTPSVR(インスタンス名) • オブジェクト – 前述の通りHTTP構成の実体はQUSRSYSライブラリーの物理ファイルに 存在します。これらのファイルはバックアップを取ることをお勧めいたします。 QATMHTTP *FILE PF-DTA HTTP SERVER ATTRIBUTES FILE QATMHINSTA *FILE PF-DTA *ADMIN INSTANCE FILE QATMHINSTC *FILE PF-DTA HTTP SERVER INSTANCE FILE QATMHTTPA *FILE PF-DTA USER ADMIN CONFIG PHYSICAL FILE QATMHTTPC *FILE PF-DTA HTTP SERVER CONFIGURATION FILE 51 4.CGI • CGIとは – HTMLとHTTPにより全世界に向けて情報発信が出来るようになりました。美しい画像 を含むHTML文書で掲示板を作ったり、社内文書を配布することも出来ます。さて、あ なたはこれで満足ですか? 基幹システム上のデータをWebブラウザからダイナミックに 検索したいと思いませんか? あるいはユーザーがWebブラウザからデータを入力でき たらと思いませんか? – このようなWebブラウザとWebサーバーとの間で対話的な処理を実現するために CGI(Common Gateway Interface)が考えだされました。 CGIはHTTPサーバーとサーバー上で動作するプログラムとの橋渡しをします。 – HTMLもデータを入力するための<form>タグが用意され、Webブラウザ上で入力した 値をサーバーに返す機能を持ちました。今や多くのサイトがHTMLフォームと従来のア プリケーション間のインターフェース(CGI)を書き、Webブラウザをそのアプリケーション の入出力端末としています。 これは開発者がクライアント側のアプリケーション開発/配布に煩わされることなく、クラ イアント/サーバー型アプリケーションを実現する可能性を開きます。 – CGIにもHTTPと同様にバージョンがあり、IBM HTTP Server for iSeries (Original)の CGIはバージョン1.1をサポートしています。 52 ③ ② URLがプログラムの場合、 HTTPサーバーがプログラ ムを呼出す データベースにアクセス したり、他のプログラムを 呼び出す CGI プログラム ④ ① Webブラウザ が要求を出す。 TCP/IPネットワーク ⑤ HTMLドキュメントが送られ、ブ ラウザに表示される。 表示結果を生成して サーバーに戻す 53 4-1.iSeriesのCGI • iSeriesのCGI – 環境変数/標準入力(出力) • CGIの考え方は元々UNIXの“環境変数”や“標準入力(出力)”を使用して動作し ます。これらはiSeriesではCコンパイラを利用している場合を除いてなじみの薄 いものですが、ここでは詳細な説明は割愛致します。 • iSeries上でCGIアプリケーションを構築するために、これらの環境変数、標準入 力の機能を実現するシステムAPIが提供されています。 このシステムAPIを使用してアプリケーションを作成します。 実行イメージ(概要) 呼出し 環境変数 HTTP 条件入力 CGIプログラム (RPG/COBOL) システムAPI呼出し 標準入力 サ ー バ ー 結果表示 標準出力 システムAPI呼出し 54 (参考) • 標準入力/標準出力とは、プログラムからみた時に入出力用のデバイス(キー ボード、ディスプレイ)をファイルと同じようにポイントとして扱うもので、C言語では 標準関数としてそれらをサポートしてます。 – 通常、標準入力元はキーボードからの入力に割当てられます。 リダイレクトの機能を使用すると、そのセッション内で一時的に入力元を ファイルに変更して、あらかじめ作成しておいたファイルを読み込み、あた かもキーボードからの入力が行なわれたかのようなシミュレートを行なうこ とが出来ます。 – 標準出力はディスプレイに割当てられ、これもリダイエクト機能を使用して ディスプレイへの表示内容をファイルに書出すことが出来ます。 • iSeriesの場合、C言語ではこれらの機能を標準関数で提供していますが、 RPG/COBOLではネイティブの命令コードはありません。 従ってHTTPサーバー用に用意されたシステムAPIを使用して標準入力/標準出 力をシミュレートします。 標準入力 リダイレクト 標準出力 リダイレクト 55 4-2.プログラミングに関して – プログラミング • 前述のシステムAPIを使用し、サービス・プログラム(システム提供)とバインドさせ る必要があるため、プログラミング言語はILEでなければなりません。 – ILE-RPG , ILE-COBOL , ILE-C • システムのAPIは多数ありますが、多くは以下の3つを使用します。 – 環境変数 : QtmhGetEnv – 標準入力 : QtmhRdStin – 標準出力 : QtmhWrStout • EBCIDC←→ASCIIのコード変換が必要です。 – ユーザー・コーディングによるコード変換も可能ですが、正しいCCSIDの指 定および適切なシステムAPIを使用することで、ユーザー・アプリケーション 側ではコード変換を意識しないで済むことが多いでしょう。 – 後述のHTTPサーバー構成で、システムが自動的にコード変換を行なうよ うにするための設定がありますので、確認下さい。 56 実行イメージ(詳細) 呼出し CGIプログラム IBM提供の サービス・プログラム QTCP/QTMHCGI 条件入力 HTTP サ ー バ ー 環境変数 QtmhGetEnv 標準入力 QtmhRdStin CGIモジュール (RPG,COBOL) CALLB QtmhGetEnv 環境変数:QUERY_STRING データベースの読取、更新 各種演算 その他 システムAPI 出力(HTML)の準備 標準出力 QtmhWrStout CALLB QtmhWrStout 結果表示 57 – メソッド • HTTPサーバー構成の部分でも若干述べましたが、ブラウザからHTTPサーバー へアクセスする際にいくつかの“要求方法”があります。 この“要求方法”のことをメソッドと言います。 • 具体的には「ブラウザから入力したデータをHTTPサーバーに受渡し、所定の CGIプログラムを起動する」ための方法として“GET”および“POST”の2つのメ ソッドがあります。 – GETメソッド » 「環境変数」を利用してデータを受渡します。 » 扱いが簡単ですが、データ長に制限があります。 – POSTメソッド » 「標準入力」を利用してデータを受渡します。 » 扱いが若干複雑ですが、データ長に制限がありません。 • 上述のどちらのメソッドを使うかでCGIプログラムのデータを受け取る部分のコー ディングが変わります。 一般的には制約のないPOSTが使われることが多いようです。 • 実際にブラウザが「どちらのメソッドを使用してアクセスしてくるか、どのCGIプロ グラムを呼出すか」はHTML内で記述します。 58 – 環境変数 • 通常、CGIプログラムはメソッドにかかわらず環境変数を参照して処理を行ない ます。HTTPサーバーはCGIプログラムを呼出す毎に、環境変数をセットしてCGI プログラムから利用出来るようにします。 • IBM HTTP Server for iSeries (Original)が提供する環境変数には次のようなも のがあります。 環境変数 内容 例 SERVER_NAME HTTPサーバーのホスト名(IPアドレス、DNS別 名) www.ibm.com SERVER_PORT 要求が送られてきたポート番号 80 QUERY_STRING ブラウザから(フォーム)送られてきた値 CUSTNO=01050 REQUEST_METHOD 要求されたメソッド GET SCRIPT_NAME 実行されるCGIプログラムのパス名 /cgi-bin/CGI01.PGM REMOTE_HOST 要求を発行したクライアントのホスト名 xxx.ibm.com REMODE_ADDR 要求を発行したクライアントのIPアドレス 9.170.143.201 CONTENT_TYPE POSTのように追加情報をもつ場合はデータの 内容形式を表す application/x-www-formurlencoded CONTEN_LENGTH データの長さ(POSTの場合) 12 IBM_CCSID_VALUE サーバージョブのCCSID 5035 59 – メソッドと環境変数/標準入出力 • GETメソッドと環境変数 – メソッドGETは、環境変数「QUERY_STRING」に、ブラウザのフォーム・タ グで指定された入力値が入るので、CGIプログラムではこの値を読み込ん で処理を行ないます。 – このQUERY_STRINGのデータ内容は、ブラウザ上で入力された値そのま まではなく、あるルールに基づいてエンコードされた値になっています。 – 例えばHTML上で「TEKIYO」という名前のテキスト入力項目に、ブラウザ 上で「123ABCabcアイウ漢字 +&=?」と入力すると、QUERY_STRINGは次 のようにエンコードされます。 HTMLフォーム上の入力値 : 123ABCabcアイウ漢字 +& 環境変数QUERY_STRING : TEKIYO=123ABCabc%B1%B2%B3%8A%BF%8E%9A+%2B%26 – エンコードのルール(詳細はRFC1630,RFC1738を参照ください。) » HTML上の項目名が先頭に附加され、入力値とは「=」で結ばれる 複数の入力項目がある場合は「&」が区切り文字として使われる。 » 使用される文字は7ビットASCIIのみで、8ビットASCII(SJISカタカナ、 漢字のほとんど)、制御文字(改行)、特殊記号(+-/\?)の多くは「%」の 後ろに16進数文字を付けた形式(tripletと呼ばれる)で表される。 » スペース(ブランク)は「+」に変換される。 60 • POSTメソッドと標準入力 – 一方、メソッドPOSTの場合はHTML上のフォーム入力値は標準入力として 渡されるので、環境変数「QUERY_STRING」は空値です。 CGIプログラムは最初に環境変数「CONTENT_LENGTH」を読取り、その 長さだけ標準入力からデータ部分を読込みます。 • 標準出力 – ブラウザからの入力値を受け取るには、上述の「GETメソッドと環境変数」 もしくは「POSTメソッドと標準入力」の方法ですが、ブラウザへの出力はど ちらのメソッドにもかかわらず「標準出力」を使用します。 – また、どちらのメソッドを使用する場合でも必ず標準出力は必須です。 これは標準出力処理のないCGIプログラムを呼出すと、いつまでたっても 応答が戻らずブラウザ側で処理を打ち切らなければなりません。 (もしくは タイムアウト・エラーとなる) 従ってiSeries上でバッチプログラムを起動する場合でも何らかの返答(例 えば「処理を受付けました」とのメッセージを出力する)を返さなければなり ません。 61 4-3.CGIプログラムの呼出し、HTTP構成 – CGIプログラムの呼出し • CGIプログラムを呼出すためのHTML記述 – HTMLの「フォーム・タグ」を使用して記述します。 62 <HTML> <HEAD><TITLE>Welcome to iSeries CGI Program</TITLE></HEAD> <BODY bgcolor="#ffffff"> <center><H1>CGI(ILE-RPG)</H1></center> <HR> <center><H2>得意先マスター検索</H2></center> ①<FORM method="GET" action="/cgi-bin/CGI01.PGM"> 5桁の得意先番号を入力し、検索ボタンを押して下さい。<BR><BR> ② <INPUT TYPE="TEXT" NAME="CUSTNO" SIZE="6" MAXLENGTH="5" VALUE=""> ③ <INPUT TYPE="SUBMIT" VALUE="検索"> ④ <INPUT TYPE="RESET" VALUE="クリア"> </FORM> <HR> </BODY> </HTML> ①<form>~</form> フォーム・タグで囲まれた範囲内 の入力データがHTTPサーバー に渡されます。 フォーム・タグのmethod属性で メソッドの種類、action属性で CGIプログラム名を指定します。 左の例ではGETメソッドを使用し て/cgi-binというディレクトリー下 に存在するCGI01というプログラ ムを起動することになります。 ②③④<input> インプット・タグで入力項目を記 述します。 (iSeriesで言えば入力フィールド) インプット・タグのtype属性でそ の入力項目のタイプを指定します。 通常の入力項目はtext、プログラ ムの起動はsubmit、入力項目を クリアするにはresetなどです。 63 – CGIプログラムの呼出しとパスの指定 • HTTPサーバー構成のパスの設定 – 前ページの通りHTML内で「どのプログラムを起動するか」を指定しますが、 これだけでiSeries上に存在するプログラムが起動できる訳ではありません。 – HTTPサーバー構成で「起動可能なプログラム」を設定しておく必要があり ます。 • HTTPサーバー構成の「経路指定」 ①アクションで“Exec”を選択。 ② URLテンプレートにはブラウザで 指定するURLパスを入力。 ここではルート(/)を指定。 ① ② ③ ③代替ファイル・パスにはiSeries上 の実際の物理パスを指定。 実際RPGで記述されたCGIプロ グラムが存在するライブラリー名 を指定します。 64 今回のサンプルではブラウザから は/cgi-binというディレクトリーにある プログラムが起動できるように見え ます。 実際のiSeries上の物理的なパスは ディレクトリーではなく、ライブラリー なので、ライブラリーの指定をします。 この時、ネーミング・ルールはIFSの ルールに従って指定しなければなり ません。 /QSYS.LIB/ライブラリー名.LIB また、当サンプルではワイルド・カー ド指定をしているので、該当ライブラ リーに存在する全てのプログラムを 起動することが出来ます。 Exec /cgi-bin/*.pgm /QSYS.LIB/CGI.LIB/* 場合によってはプログラム名を明示 的に指定し、そのプログラムのみ起 動させることも可能です。 65 – CGIに関する設定 • HTTPサーバー構成のCGI設定 – CGIプログラムはOS/400のネイティブ環境(EBCDICコード)で稼動するた め、最終的に出力データをブラウザに送信する前にEBCDIC→ASCIIの コード変換が必要になります。コード変換そのものはシステムが行います が、その変換を行なうための文字コード情報を指定します。 ①「構成」より「CGI」をクリック。 ②「CGI設定」をクリック。 ③ ④ ① ② ③サーバー(OS/400)側のCCSID を指定します。 日本語環境の場合は5035。 ④クライアント(ブラウザ)側のCCSID を指定します。 日本語Windowsの場合は943。 66 – HTTPサーバー構成のまとめ • CGIに関連するHTTPサーバー構成です。 Execディレクティブによる実行可能 なCGIプログラムの指定。 DefaultFsCCSIDディレクティブ、 及びDefaultNetCCSIDディレクティ ブによるEBCDIC→ASCIIコード変 換の指定。 67 4-4.CGIプログラムの開発 • iSeriesにおけるCGIプログラムの開発 – ILE-RPGによるCGIプログラム • ソース・ファイルの準備 – システムAPIは英大文字・小文字を区別するので、ソース・ファイル作成時 に適切なCCSIDを指定しなければなりません。 » CRTSRCPF FILE(CGILIB/QRPGLESRC) RCDLEN(112) IGCDTA(*YES) CCSID(5035) » SEUにて編集する際も「大文字入力専用=Y」となっている場合は 「N」にして下さい。SEUにて編集開始後、“F13=セッション省略時の 値の変更”画面。 • エミュレータの準備 – 5250エミュレータも英小文字が扱えるように設定します。 » ホストコードページを「939」 – ジョブの実行属性も英小文字が扱えるように設定します。 » CHGJOB CCSID(5305) 68 – CGIプログラムの実行環境 • 実行時ユーザー・プロフィール – CGIプログラムはシステム提供のユーザー・プロフィール「QTMHHTP1」に て実行されます(変更することは出来ません)。 • ライブラリー・リスト – CGIプログラム内でアクセスするオブジェクト(例えばF仕様書で指定された データベース・ファイルにアクセスする)は、従来のプログラムの実行環境と 同様に、HTTPサーバージョブのライブラリー・リストに存在しなければなり ません。以下のいずれかの方法で、CGIプログラムが参照できるようにす る必要があります。 » システム値 QUSRLIBL に登録しておく » CGIプログラムの実行ユーザーである「QTMHHTP1」のユーザー・ プロフィール属性のライブラリー・リストに指定する » CGIプログラムの中でQCMDEXC等を使用して一時的にアクセス出 来るようにする(データベースであればOVRDBFコマンド) • アクセス権限 – CGIプログラムはシステム提供のユーザー・プロフィール「QTMHHTP1」に て実行されます。従って上述のライブラリーやその中のオブジェクトに対し て適切なアクセス権限が必要になります。 69 – CGIプログラムの開発手順概要 • コーディング – 前述のシステムAPIを使用してコーディング。 • ソース・ファイルよりモジュールとしてコンパイル – モジュール化すること。 – CRTRPGMOD MODULE(CGILIB/xxx) SRCFILE(CGILIB/QRPGLESRC) SRCMBR(*MODULE) DBGVIEW(*ALL) (*DBGVIEWはデバッグのためのパラメータです) • 上記コンパイル済みモジュールとシステム提供のサービス・プログラムをバインド – サービス・プログラムは「QTCP/QTMHCGI」 – CRTPGM PGM(CGILIB/xxx) MODULE(*PGM) BNDSRVPGM(QTCP/QTMHCGI) ILE-RPGプログラム ILE-RPGソース ILE-RPGモジュール メンバー名 xxx *MODULE xxx コンパイル CRTRPGMOD *PGM = xxx *MODULE = xxx バインド CRTPGM CALLB QtmhRdStin CALLB QtmhWrStout QhtmGetEnv *SRVPGM QtmhRdStin QtmhGetEnv QTMHCGI QtmhWrStout QtmhRdStin QtmhCvtDb QtmhWrStout QtmhCvtDb 70 – CGIプログラムのデバッグ • デバッグ方法 – CGIプログラムはバッチ型で常駐するHTTPサーバージョブの内部で呼び 出されるので、そのジョブに対してトレース等を取りながらデバッグを行なう ことになります。例えば下記のような方法です。 » TCP/IPの通信トレースを採取、解析する。 » OS/400のバッチ・ジョブのデバッグを行なう。 • バッチ・ジョブのデバッグ方法の場合 – HTTPサーバージョブはサブシステムQHTTPSVR下で稼動、状況が 「DEQW」のジョブがCGIを実行するジョブです。通常はこのようなジョブが 複数あり、どのジョブでCGIが実行されるかは不定です。そこであらかじめ CHGHTTPAコマンドでパラメータNBRSVR(2 2)としてジョブ数を1つにして おくと良いでしょう。 – ジョブが特定できたらジョブ名/ユーザー(QTMHHTTP)/ジョブ番号を特定し、 サーバー・ジョブに対してサービス・ジョブを開始し、デバッグを開始します。 » STRSRVJOB JOB(ジョブ番号/ユーザー/ジョブ名) » STRDBG – STRDBGコマンドを実行すると、コンパイル時にDBGVIEW(*ALL)パラメー タが指定されていればプログラムのソースが表示され、オンライン・デバッ グが可能になります。 » 停止点(ブレークポイント)機能が使用できます。 – デバッグが終了したらENDDBG,ENDSRVJOBでデバッグ環境を終了。 71 4-5.CGIプログラム・サンプル • CGIプログラムのサンプル – それでは実際に簡単なCGIプログラムを作成する過程を順を追って見ていきましょう。 • このサンプルは「得意先マスター検索」です。 – ブラウザ上で検索キーとなる5桁の得意先番号を入力 – 入力された得意先番号を受取り、得意先マスターを検索(CHAIN命令) – 結果のHTMLを組み立てて、ブラウザに返す。 • メソッドは扱いが簡単な「GETメソッド」を使用します。 CGIプログラム = CGILIB/CGI01 HTTP サ ー バ ー IBM提供の サービス・プログラム QTCP/QTMHCGI CGIモジュール CGILIB/CGI01 環境変数 QtmhGetEnv CALLB QtmhGetEnv 標準入力 QtmhRdStin 環境変数:QUERY_STRING データベースの読取、更新 各種演算 その他 システムAPI 出力(HTML)の準備 標準出力 QtmhWrStout CALLB QtmhWrStout 72 入力フォームの画面 検索結果の画面 73 – 入力用のHTML • フォーム・タグ(<form>~</form>)を使用 <HTML> <HEAD><TITLE>Welcome to iSeries CGI Program</TITLE></HEAD> <BODY bgcolor="#ffffff"> ①<form>~</form> フォーム・タグで囲む。 -method=GET -action=CGIプログラム名 <center><H1>CGI(ILE-RPG)</H1></center> <HR> <center><H2>得意先マスター検索</H2></center> ①<FORM method="GET" action="/cgi-bin/CGI01.PGM"> 5桁の得意先番号を入力し、検索ボタンを押して下さい。<BR><BR> ② <INPUT TYPE="TEXT" NAME="CUSTNO" SIZE="6" MAXLENGTH="5" VALUE=""> ③ <INPUT TYPE="SUBMIT" VALUE="検索"> ④ <INPUT TYPE="RESET" VALUE="クリア"> </FORM> <HR> </BODY> </HTML> 左の例ではGETメソッドを使用し て/cgi-binというディレクトリー下 に存在するCGI01というプログラ ムを起動することになります。 実際にはHTTPサーバー構成で ライブラリーCGILIBにあるプログ ラムが起動されます。 ②③④<input> インプット・タグで入力項目を記述。 -検索キーとなる得意先番号 -実行用ボタン -入力項目のクリア・ボタン 74 FTOKMSP IF E K DISK ①D* 環境取得変数 API ‘QtmhGetEnv’ のパラメータ DENBUFF S 2048A INZ DENBUFFLN S 9B 0 INZ(2048) DENACTLN S 9B 0 DENVARNAME S 20A INZ('QUERY_STRING') DENVARLN S 9B 0 INZ(12) ②D* 標準出力書出 API 'QtmhWrStout' のパラメータ DOUT S 2048A INZ DOUTLN S 9B 0 INZ(2048) D* コンパイル時配列 ③DHTML S 80 DIM(14) PERRCD(1) CTDATA ①環境変数取得のためのAPI“QtmhGetEnv”用のパラメータ定義 -ENBUFF -ENBUFFLN -ENDACTLN -ENVARNAME -ENVARLN : 環境変数の内容が保持されるバッファ(文字型変数) : 上記バッファの長さ : 環境変数の実データ部の文字列長 : 取得する環境変数の名前 : 上記環境変数の名前の長さ 今回のサンプルでは環境変数QUERY_STRINGを使用するので、以下を固定値としてセット。 -ENVARNAME -ENVARLN = “QUERY_STRING” = 12 (“QUERY_STRING”の文字列長) ②標準出力のためのAPI“QtmhWrStout”用のパラメータ定義 -OUT -OUTLN : 標準出力データを保持するバッファ(文字型変数) : 上記バッファの実データ部の文字列長 ③配列定義 当CGIプログラム内で出力するHTMLを記述。 汎用性を持たせるには配列ではなく、データベース等に持たせるほうが良い。 75 ④D* EBCDIC 改行コード DNL C X'15' D* HTML 固定文字 DBR C '<BR>' DBL C '<IMG SRC="/ball-blue.gif">' DLI C '<LI>' ⑤D* ユーザースペース・エラーコード /COPY QSYSINC/QRPGLESRC,QUSEC ** ⑥C* HTML ヘッダー C 1 DO 12 I 3 0 C CAT HTML(I):0 OUT C CAT NL :0 OUT C ENDDO ④EBCDICの改行文字 IBM HTTP Server for iSeries (Original)の仕様で、標準出力に書出すデータの各行には長さ に制限があり(OS/400バージョンにより長さが異なる)、行の最後には改行コード(x’15’)が必要。 ⑤エラー・ハンドリング用 エラーコード情報。システム提供のソースを/COPYにて取込む。 ⑥HTMLヘッダー情報のセット ブラウザへ送信するコンテンツのHTMLヘッダー情報のセット。 最終的には標準出力APIを用いてブラウザに送信されるが、まずは標準出力用の保管バッファ 「OUT」へセットしている。(パラメータ詳細は②を参照) 76 ⑦C* 環境変数よりパラメータ(得意先番号)取出し C CALLB 'QtmhGetEnv' C PARM ENBUFF C PARM ENBUFFLN C PARM ENACTLN C PARM ENVARNAME C PARM ENVARLN C PARM QUSEC ⑧C* HTML ボディー(得意先情報) C MOVEL *BLANK CUSTNO C EVAL CUSTNO=%SUBST(ENBUFF:8:5) C CUSTNO CHAIN TOKMSR 5 99 ⑦環境変数のデータ取得用API”QtmhGetEnv”の呼出し CALLB命令を使用して呼出し。これはサービス・プログラムとしてバインドされるため。 (パラメータ詳細は①を参照) ⑧環境変数のデータ部からの取出し 上記⑦のAPI呼び出しで、保管バッファ「ENBUFF」に環境変数の値が入っており、その中から 必要なものだけを取出す必要がある。 例えば今回のサンプルでは入力フォーム上での項目名が“CUSTNO”であり、入力された値が “01020”だとすると、環境変数QUERY_STRINGには“CUSTNO=01020”という値がセットされ る。(“フォームの項目名=入力値”が返される)従って、RPGの組込み関数%SUBSTを使用して 必要な部分、すなわち実際に入力された値の“01020”だけを抽出する。 %SUBST(ENBUFF:8:5) 5文字分(入力される得意先番号は5桁) 8文字め (抽出する得意先番号の開始位置) 環境変数QUERY_STRINGの内容がセットされているバッファ 77 ⑨C CUSTNO CHAIN TOKMSR C* (得意先番号が存在した場合) ⑩C *IN99 IFEQ *OFF C* (パック --> 文字変換) C MOVE TKNYUK D C MOVE TKGURI T#GURI C MOVE TKNURI T#NURI C MOVE TKZURI T#ZURI C MOVE TKUZAN T#UZAN C MOVE TKGEND T#GEND ⑪C EVAL OUT=%TRIM(OUT) + C BL + ' 得意先番号 = C BL + ' 得意名 = C BL + ' 住所1 = C BL + ' 住所2 = C BL + ' 電話番号 = 99 6 9 9 9 9 9 ' ' ' ' ' + + + + + TKBANG TKNAKJ TKADR1 TKADR2 TKTELE + + + + + BR BR BR BR BR + + + + + NL NL NL NL NL + + + + + ⑨得意先マスターファイルへのアクセス ⑩該当レコードが存在した場合の処理 ⑪標準出力へ書出すためのHTMLをセット 標準出力へ書出すためのパラメータ「OUT」に、HTML内容(データベースから取得したデータ 含むをセット。余分なブランクを取り除くためRPG組込み関数%TRIMを使用。 また、ブラウザには従来のエミュレータのような編集表示を行なう機能はないので、CGIプログ ラム内で文字列編集する必要がある。例えば金額に関しては「先頭0の消去」、「3桁ごとの カンマ区切り」や日付に関しては「年/月/日」のようなスラッシュ区切り、等。 78 C BL + ' 最終入金日 = ' + C %SUBST(D:1:2) + '/' + C %SUBST(D:3:2) + '/' + C %SUBST(D:5:2) + BR + NL + C '<UL>' + C LI + ' 当月売上高 = ' + T#GURI C LI + ' 当年売上高 = ' + T#NURI C LI + ' 前年売上高 = ' + T#ZURI C LI + ' 売掛金残高 = ' + T#UZAN C LI + ' 信用限度額 = ' + T#GEND C '</UL>' ⑫C ELSE C* (得意先番号が存在しない場合) ⑬C EVAL OUT=%TRIM(OUT) + HTML(15) + NL C ENDIF ⑭C* HTML トレーラー C CAT HTML(13):0 OUT C CAT NL :0 OUT + + + + + BR BR BR BR BR + + + + + NL NL NL NL NL + + + + + ⑫該当レコードが存在しない場合 ⑬「存在しない」旨のエラー・メッセージを標準出力用バッファにセット ⑭残りのHTML内容をセット 79 C* 標準出力への書出し ⑮C ' ' CHECKR ⑯C CALLB C PARM C PARM C PARM C* C SETON C RETURN OUT OUTLN 'QtmhWrStout' OUT OUTLN QUSEC LR ⑮標準出力用のバッファに格納されているデータの長さをチェック 標準出力に書出す際に、実際にどれだけの文字列(HTMLコンテンツ)を書出すのか、そのデー タ長を検査してパラメータに渡さなければならない。 具体的にはバッファ「OUT」に出力情報が格納されているので、CHECKR命令を使用して文字 が何バイトセットされているかをチェックしている。 ⑯標準出力用API”QtmhWrStout”の呼出し バッファ「OUT」にセットされたHTMLデータ、及びそのデータ長をパラメータに渡す。 (パラメータ詳細は②を参照) 80 ⑰**CTDATA HTML ⑱CONTENT-TYPE: TEXT/HTML ⑲<center><H1>CGI(ILE-RPG)</H1></center> <HR> <center><H2>得意先マスター検索</H2></center> <FORM method="GET" action="/cgi-bin/CGI01.PGM"> 5桁の得意先番号を入力し、検索ボタンを押して下さい。<BR><BR> <INPUT TYPE="TEXT" NAME="CUSTNO" SIZE="6" MAXLENGTH="5" VALUE=""> <INPUT TYPE="SUBMIT" VALUE="検索"> <INPUT TYPE="RESET" VALUE="クリア"> </FORM> <HR> </BODY></HTML> ⑳<B><I> 該当する得意先なし。 </I></B> ⑰標準出力へ書出すHTMLの固定情報 当サンプルではコンパイル時配列として定義しているが、汎用性を考慮するとデータベース等 に保存するほうが良いでしょう。 以下、その配列の中の固定情報部分 ⑱HTMLヘッダ情報に関する情報 ⑲HTML本文 ⑳該当レコードがなかった場合のHTML本文 81 • ソース・コード 1 of 3 000001 000002 000003 000004 000005 000006 000007 000008 000009 000010 000011 000012 000013 000014 000015 000016 000017 000018 000019 000020 000021 000022 000023 000024 000025 000026 000027 000028 000029 000030 000031 000032 000033 000034 FTOKMSP IF E K DISK D* 環境取得変数 API 'QtmhGetEnv' のパラメータ DENBUFF S 2048A INZ DENBUFFLN S 9B 0 INZ(2048) DENACTLN S 9B 0 DENVARNAME S 20A INZ('QUERY_STRING') DENVARLN S 9B 0 INZ(12) D* 標準出力書出 API 'QtmhWrStout' のパラメータ DOUT S 2048A INZ DOUTLN S 9B 0 INZ(2048) D* コンパイル時配列 DHTML S 80 DIM(15) PERRCD(1) CTDATA D* EBCDIC 改行コード DNL C X'15' D* HTML 固定文字 DBR C '<BR>' DBL C '<IMG SRC="/Images/ball-blue.gif">' DLI C '<LI>' D* ユーザースペース・エラーコード /COPY QSYSINC/QRPGLESRC,QUSEC ** C* HTML ヘッダー C 1 DO 12 I 3 0 C CAT HTML(I):0 OUT C CAT NL :0 OUT C ENDDO C* 環境変数よりパラメータ(得意先番号)取出し C CALLB 'QtmhGetEnv' C PARM ENBUFF C PARM ENBUFFLN C PARM ENACTLN C PARM ENVARNAME C PARM ENVARLN C PARM QUSEC 82 • ソース・コード 2 of 3 000035 000036 000037 000038 000039 000040 000041 000042 000043 000044 000045 000046 000047 000048 000049 000050 000051 000052 000053 000054 000055 000056 000057 000058 000059 000060 000061 000062 000063 000064 000065 000066 000067 000068 C* C C C C* C C* C C C C C C C C C C C C C C C C C C C C C C C C C* C C HTML ボディー(得意先情報) MOVEL *BLANK CUSTNO 5 EVAL CUSTNO=%SUBST(ENBUFF:8:5) CUSTNO CHAIN TOKMSR 99 (得意先番号が存在した場合) *IN99 IFEQ *OFF (パック --> 文字変換) MOVE TKNYUK D 6 MOVE TKGURI T#GURI 9 MOVE TKNURI T#NURI 9 MOVE TKZURI T#ZURI 9 MOVE TKUZAN T#UZAN 9 MOVE TKGEND T#GEND 9 EVAL OUT=%TRIM(OUT) + BL + ' 得意先番号 = ' + TKBANG + BR + NL + BL + ' 得意名 = ' + TKNAKJ + BR + NL + BL + ' 住所1 = ' + TKADR1 + BR + NL + BL + ' 住所2 = ' + TKADR2 + BR + NL + BL + ' 電話番号 = ' + TKTELE + BR + NL + BL + ' 最終入金日 = ' + %SUBST(D:1:2) + '/' + %SUBST(D:3:2) + '/' + %SUBST(D:5:2) + BR + NL + '<UL>' + LI + ' 当月売上高 = ' + T#GURI + BR + NL + LI + ' 当年売上高 = ' + T#NURI + BR + NL + LI + ' 前年売上高 = ' + T#ZURI + BR + NL + LI + ' 売掛金残高 = ' + T#UZAN + BR + NL + LI + ' 信用限度額 = ' + T#GEND + BR + NL + '</UL>' ELSE (得意先番号が存在しない場合) EVAL OUT=%TRIM(OUT) + HTML(15) + NL ENDIF 83 • ソース・コード 3 of 3 000069 C* HTML トレーラー 000070 C CAT HTML(13):0 OUT 000071 C CAT NL :0 OUT 000072 C* 標準出力への書出し 000073 C ' ' CHECKR OUT OUTLN 000074 C CALLB 'QtmhWrStout' 000075 C PARM OUT 000076 C PARM OUTLN 000077 C PARM QUSEC 000078 C* 000079 C SETON 000080 C RETURN 000081 **CTDATA HTML 000082 CONTENT-TYPE: TEXT/HTML 00083 00084 <center><H1>CGI(ILE-RPG)</H1></center> 00085 <HR> 00086 <center><H2>得意先マスター検索</H2></center> 00087 <FORM method="GET" action="/cgi-bin/CGI01.PGM"> 00088 5桁の得意先番号を入力し、検索ボタンを押して下さい。<BR><BR> 00089 <INPUT TYPE="TEXT" NAME="CUSTNO" SIZE="6" MAXLENGTH="5" VALUE=""> 00090 <INPUT TYPE="SUBMIT" VALUE="検索"> 00091 <INPUT TYPE="RESET" VALUE="クリア"> 00092 </FORM> 00093 <HR> 00094 </BODY></HTML> 00095 00096 <B><I> 該当する得意先なし。 </I></B> LR 84 – コンパイル • RPGモジュールの作成 – CRTRPGMOD MODULE(CGILIB/CGI01) SRCFILE(CGILIB/QRPGLESRC) SRCMBR(*MODULE) DBGVIEW(*ALL) • RPGプログラムの作成 – CRTPGM PGM(CGILIB/CGI01) MODULE(*PGM) BNDSRVPGM(QTCP/QTMHCGI)
© Copyright 2024 ExpyDoc