Web開発のための基礎知識

EnterpriseServer + Alaska による解決

先の CGI003 は正しく動作するものの、漢字の入力では処理が更に困難となり、文字化けの発生の可能性もある。 更には将来の保守や拡張も困難であることは理解されたと思います。
それではこれらの問題点を EnterpriseServer ではどのように解決されるのでしょうか?

● HTMLの外部テンプーレート化

まず CGI003 でも CGIの内部に配列として HTMLテンプレートを用意して、これに値を埋め込むという
汎用的な手法を試みましたが、更に一歩進めてHTMLを外部のテンプレートとすれば、保守が容易になることが
期待されます。しかもIFSにASCIIのままで保存しておけばEBCDIC から ASCIIへの変換のオーバーヘッドを生じることもありません。
IFS (Integrated File System) とは System i の UNIX互換のファイル・システムのことです。
IFSについては前述で既に学習されているはずです。

EnterpriseServer では 「RPGエンジン」と呼ばれるサービス・モジュールが提供されており
(RPGENGINE *SRVPGM) QTCP/QTMHCGI をバインドする代わりに ASNET.COM/RPGENGINE
というサービス・モジュールをバインドして、その提供されるプロシージャーを使用することができます。

EnterpriseServer では

  1. HTMLテンプレートをオープンする。( OPENHTMLというプロシージャーでオープンします。)
  2. 値をHTMLテンプレートに埋め込む。( SETFLDというプロシージャーによって埋め込みます。)
  3. HTMLを出力する。(WRITEプロシージャーによって出力します。)

● 値の取得は CGIプロシージャーだけで

ブラウザからの値の取得は CGIPARM というプロシージャーだけで行います。
従来の CGI では CGI003 でご覧になったように

  1. メソッド(GET or POST) の判断
  2. パース
  3. デコード

という作業が必要であり、これらがCGIを複雑なものにしていましたが「RPGエンジン」をバインドすることによってこれらの 1〜3の作業は全く必要でなくなります。 例えば RPG-CGI の中では

EVAL      VALUE  = CGIPARM('SHCODE    ')

と、わずか一行だけ記述するだけで、RPGエンジンの中では必要なPERSE & DECODE があなたに代わって
実行されます。

● 日本語HTTPサーバー Alaka

「Alaska」とは EnterpriseServer によって提供される日本語処理用のHTTPサーバーです。
Alaska は通常、日本語OS/400環境で使用されている CCSID=5026環境での動作が保証されています。

従って Alaska の利用によって

  • CCSID=5035 専用の System i を新規に購入するのではなく現行の System i を変更なしに、
    そのまま使用することができる。
  • 漢字の文字化けもなく機種依存の漢字(鰍ネど)も対応されている。
  • IBMオリジナルHTTPサーバーにくらべても高速で動作するよう配慮されている。

という利点があります。これらをまとめると、

  • 小さく簡単な CGIで動作されることができる。
  • ブラウザからの入力値の取得は CGIPARMプロシージャーだけの簡単な取得になる。
  • Alaska の利用によって日本語漢字も問題なく入力可能である。
  • HTMLとCGIの分離により将来の保守/拡張が容易である。
  • 埋め込み値以外は ASCIIのままで出力されるので CGIは軽くて高速になる。

というように欠点であったものが、長所となることになります。
さらに HTML & CGI のセットは「eStudio」という編集ツールによって Wizard生成 することもできます。
つまり公開データ・ペースがわかれば、わずか数分でとにもかくにも動作するCGI と HTMLの組み合わせを
生成することができます。 新規に開発するよりも、生成されたものを修正していくほうが効率的である場合が
多いものです。

それでは次に Enterprise Server のRPGエンジンをバインドした実例をご紹介しましょう。

【 CGI004:RPGエンジンをバインドした商品マスターを検索するCGI 】

次の CGI004 は eStudioWebWizard というWizard生成機能 を使って自動生成されたCGIソースであり、人的な追加や修正は一切、行っていません。 この生成を行うのはわずか数分間だけの作業によるものです。

0001.00 H DATEDIT(*YMD/) COPYRIGHT('(C) OFFICE QUATTRO CO,.LTD JAPAN 2002-')   
0002.00 F********** 単票の表示 CGI ******************************************* 
0003.00 FSHOHIN    IF   E           K DISK    USROPN                           
0004.00 F                                     INFSR(*PSSR)                     
0005.00 F**********************************************************************
0006.00  /COPY ASNET.USR/QRPGLESRC,PROTOTYPE                                   
0007.00 D RTVERR          C                   CONST(' レコード検索エラー ')    
0008.00 D NOTFOUND        C                   CONST(' レコードが見つからない。 
0009.00 C*-----------------------------------------------------                
0010.00 C     TRNKEY        KLIST                                              
0011.00 C                   KFLD                    SHCODE                     
0012.00 C******************************************************                
0013.00 C*              メイン・ルーチン                                       
0014.00 C******************************************************                
0015.00 C                   EXSR      OPEN                                     
0016.00 C   99              GOTO      END                                      
0017.00 C                   EXSR      STDIN                                    
0018.00 C                   SETOFF                                       99    
0019.00 C     TRNKEY        CHAIN     SHOHIN                             99    
0020.00 C     *IN99         IFEQ      *ON                                      
0021.00 C                   EXSR      ERRMSG                                  
0022.00 C                   ELSE                                              
0023.00 C                   EXSR      CHECK                                   
0024.00 C                   EXSR      HTMLOUT                                 
0025.00 C                   END                                               
0026.00 C     CLOF          TAG                                               
0027.00 C                   EXSR      CLOSE                                   
0028.00 C     END           TAG                                               
0029.00 C                   SETON                                        LR   
0030.00 C                   RETURN                                            
0031.00 C******************************************************               
0032.00 C     STDIN         BEGSR                                             
0033.00 C******************************************************               
0034.00 C*( HTML からの標準入力されたフィールド値の受け取り )                 
0035.00 CSR                 EVAL      TEMPLATE = CGIPARM('@TEMPLATE ')        
0036.00 CSR                 MOVEL     TEMPLATE      FLD7              7       
0037.00 CSR   FLD7          CABEQ     '*ERROR*'     END                       
0038.00 C*( HTML からフィールド値の取得 )                                     
0039.00 CSR                 MOVE      *BLANKS       VALUE                     
0040.00 CSR                 EVAL      VALUE  = CGIPARM('SHCODE    ')          
0041.00 CSR                 MOVEL     VALUE         SHCODE                    
0042.00 C*( テンプレートを宣言 )                                       
0043.00 CSR                 EVAL      RESULT = OPENHTML(TEMPLATE)      
0044.00 CSR   RESULT        CABEQ     FALSE         CLOF               
0045.00 CSR                 ENDSR                                      
0046.00 C******************************************************        
0047.00 C     CHECK         BEGSR                                      
0048.00 C******************************************************        
0049.00 CSR                 ENDSR                                      
0050.00 C******************************************************        
0051.00 C     HTMLOUT       BEGSR                                      
0052.00 C******************************************************        
0053.00 C*( 出力イメージの HTML テンプレートにフィールド値を埋め込む ) 
0054.00 CSR                 MOVE      *BLANKS       VALUE              
0055.00 CSR                 MOVEL     SHCODE        VALUE              
0056.00 CSR                 CALLP     SETFLD('SHCODE    ': VALUE)      
0057.00 CSR                 MOVE      *BLANKS       VALUE              
0058.00 CSR                 MOVEL     SHNAME        VALUE              
0059.00 CSR                 CALLP     SETFLD('SHNAME    ': VALUE)      
0060.00 CSR                 MOVE      *BLANKS       VALUE              
0061.00 CSR                 MOVEL     SHTANK        VALUE              
0062.00 CSR                 CALLP     SETFLD('SHTANK    ': VALUE)      
0063.00 CSR                 MOVE      *BLANKS       VALUE                      
0064.00 CSR                 MOVEL     SHSCOD        VALUE                      
0065.00 CSR                 CALLP     SETFLD('SHSCOD    ': VALUE)              
0066.00 C*( HTML の出力 )                                                      
0067.00 C                   CALLP     WRITE                                    
0068.00 CSR   WRTEND        ENDSR                                              
0069.00 C******************************************************                
0070.00 C     OPEN          BEGSR                                              
0071.00 C******************************************************                
0072.00 C*( OVRDBF SHOHIN     TOFILE(QTRFIL    /SHOHIN    )                    
0073.00 C                   CALLP     OVRDBF('SHOHIN    ':                     
0074.00 C                                    'SHOHIN    ':                     
0075.00 C                                    'QTRFIL    ')                     
0076.00 CSRN99              OPEN      SHOHIN                               99  
0077.00 CSRN99              SETON                                        81    
0078.00 CSR                 ENDSR                                              
0079.00 C******************************************************                
0080.00 C     CLOSE         BEGSR                                              
0081.00 C******************************************************                
0082.00 C                   CALLP     DLTOVR('SHOHIN    ')                     
0083.00 CSR 81              CLOSE     SHOHIN                               99  
0084.00 CSR                 ENDSR                                           
0085.00 C******************************************************             
0086.00 C     ERRMSG        BEGSR                                           
0087.00 C******************************************************             
0088.00 CSR                 MOVE      'CPF9898'     MSGID                   
0089.00 CSR                 MOVE      'QCPFMSG   '  MSGF                    
0090.00 CSR                 MOVE      'QSYS      '  MSGLIB                  
0091.00 CSR                 MOVEL     RTVERR        MSGTXT                  
0092.00 CSR                 MOVEL     NOTFOUND      MSG                     
0093.00 CSR                 CALLP     SNDERRMSG('RPGCGI': 'CHAIN' : MSGID : 
0094.00 C                             MSGF : MSGLIB : MSGTXT : MSG)         
0095.00 CSR                 ENDSR                                           
0096.00  /COPY ASNET.USR/QRPGLESRC,PSSR      
【 解説 】

先の CGI003 の 344ステップに比べて 96ステップ1/3 以下 の小さな CGIとなっています。
しかも今度は商品コードが見つからなかった場合は、予想できないエラーが発生した場合への
対策も追加されています。
ざっと眺めただけでは通常の適用業務でこれまで開発されてきたRPGプログラムとそんなに
変わるようでもありません。 CGI独自の PERSE や DECODEなどの処理が隠蔽されているからです。

0038.00 C*( HTML からフィールド値の取得 ) 
0039.00 CSR                 MOVE      *BLANKS       VALUE
0040.00 CSR                 EVAL      VALUE  = CGIPARM('SHCODE    ')
0041.00 CSR                 MOVEL     VALUE         SHCODE

によってHTMLからの入力値を受け取っています。

0042.00 C*( テンプレートを宣言 )
0043.00 CSR                 EVAL      RESULT = OPENHTML(TEMPLATE) 

によってHTMLテンプレートをオープンして、

0053.00 C*( 出力イメージの HTML テンプレートにフィールド値を埋め込む ) 
0054.00 CSR                 MOVE      *BLANKS       VALUE
0055.00 CSR                 MOVEL     SHCODE        VALUE
0056.00 CSR                 CALLP     SETFLD('SHCODE    ': VALUE) 

によって値をHTMLテンプレートに埋め込んでいます。最後には

0066.00 C*( HTML の出力 )
0067.00 C                   CALLP     WRITE 

によって HTML を ASCIIのままで出力しています。
ずいぶんとシンプルな CGI に出来上がりました。
従来の CGI003 に比べていかにスッキリとして贅肉の取れたようなCGIに仕上がっているのかが、
おわかり頂けたと思います。ご参考までに生成されたHTMLも次に紹介します。

【 生成HTML 】
<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">

<title> 商品マスターファイル </title>
</head>
<body>
<center><h1> 商品マスターファイル </h1></center>
<hr>                          
<pre> 
<table cellpadding="1" cellspacing="0" border="0" bordercolor="#000000">
<REPORT>
<tr>
	<td>商品 コード </td>
	<td>:</td>
	<td><FLD NAME=SHCODE>##########</FLD></td>
	</tr>
<tr>
	<td>商品名 </td>
	<td>:</td>
	<td><FLD NAME=SHNAME>########################</FLD></td>
	</tr>
<tr>
	<td>単価 </td>
	<td>:</td>
	<td><FLD NAME=SHTANK>#######</FLD></td>
	</tr>
<tr>
	<td>品種 コード </td>
	<td>:</td>
	<td><FLD NAME=SHSCOD>####</FLD></td>
	</tr>
</REPORT>
</table>
</pre>                         
<a href="/AS400-NET.USR/PROJECT/CGI004/DB2_DSPDSPHED.HTM"> 検索条件の入力に戻る </a>
</body>                          
</html>                          
【 解説 】

例えば、

CALLP     SETFLD('SHCODE    ': VALUE) 

によるフィールド値の埋め込みは

<FLD NAME=SHCODE>##########</FLD>

「##########」 の部分に文字 「#」の個数 の分だけ埋め込みが行われるようになっています。
この外部HTMLテンプレートはブラウザでも出力イメージとして表示することができますし、
ホームページ・ビルダーやFrontPage などのHTML編集ツールによって編集することもできます。
(サブ・ファイルのような)リスト形式のHTMLを作成するときは、より効果を発揮します。