Best of TechTips: Build Web Pages with RPG and CGIDEV2

  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

When IBM first released CGIDEV, I thought, "Hey, it's cool that I can build a Web page in RPG, but its so awkward to code!" I had difficulty imagining most RPG programmers embracing such complicated coding to build every single page they wanted to display. Like a lot of other iSeries programmers, I moved on to other products--such as Net.Data, Java, and WebFacing--to build browser-based interfaces to the iSeries. But the good folks at IBM did not give up on CGIDEV. Instead, they hid all that cool but complicated code inside service programs! IBM calls this new version CGIDEV2, and it's the perfect example of using the power of ILE to deliver a great tool to other programmers. So if, like me, you remember CGIDEV and shudder, or if you have yet to try CGI programming with RPG, take a look at CGIDEV2 now.

What Is a CGI Program?

Common Gateway Interface (CGI) has been around since the inception of the Web. Essentially, it's a program that can be called by the HTTP server when a remote user performs an action on a Web page, such as filling out a form and clicking a button. The program that is called reads the input fields from the form, performs any necessary calculations or file updates, and then transmits a new Web page back to the remote user.

Why Use RPG?

Many languages support CGI programming, so why use RPG? Most importantly, RPG is the premier programming language for the iSeries server. (For COBOL enthusiasts, I believe there's a COBOL-friendly version of CGIDEV2.) It also supports ILE, allowing for the use of service programs and subprocedures, which is critical to the design of CGIDEV2.

Where Do I Get CGIDEV2?

IBM provides CGIDEV2 as freeware. You can download the latest copy here. The download includes clear instructions for installing the product on your iSeries server. Once it's installed, you may wish to review the demo pages provided by IBM, or you may be eager to begin developing your own pages.

Where Do I Start?

Your first step is to build a simple Web page that will launch your first application. This page will simply include a link to the CGI program. The same link could be included in other Web pages that you might already have, such as a corporate home page.

Figure 1 shows the code for a sample Web page to launch your test application. It is HTML code stored in member GETCUS of file DEMOHTML in library CGIDEV2. You can use SEU and PDM (or any other editor, such as LPEX) to edit this file.

Get Customer Name                  






Figure 1: Here's the HTML code for CGIDEV2/DEMOHTML MBR(GETCUS).

Point your Web browser at this Web page using the following link: http://ip-addr/cgidev2o/getcus.htm.

The HTTP server will redirect that browser to the HTML code stores in the file you just created and then display the page shown in Figure 2.

Figure 2: Here's your first Web page.

When the user clicks on the Show Customers button, the HTTP server on the iSeries will launch the program GETCUS from CGIDEV2. The action attribute of the HTML form determines the program called (action="/cgidev2p/getcus.pgm"). Of course, before you can call that program, you have to write that program!

How Do I Write the RPG Code?

Use any editor to enter the RPGLE source code for the member GETCUS of QRPGLESRC in CGIDEV2. The code for GETCUS is shown in Figure 3. It includes a number of copy statements that pull in necessary code. These will be included in all CGI programs.

 /copy CGIDEV2/qrpglesrc,hspecs
FCUST      IF   E           K DISK          
 * Includes to be used in CGIs              
 /copy CGIDEV2/qrpglesrc,prototypeb         
 /copy CGIDEV2/qrpglesrc,usec               
 /copy CGIDEV2/qrpglesrc,variables3         
 * Main line                     
 /copy CGIDEV2/qrpglesrc,prolog3    
   callp gethtml('DEMOHTML': 'CGIDEV2':'GETCUS2');           
   callp wrtsection('top');                                  
   DoU %Eof(CUST);                                           
     Read CUST;                                              
     If Not %Eof(CUST);                                      
       callp updhtmlvar('cname':%trim(CName)); 
       callp wrtsection('tabrow'); 
       callp wrtsection('bottom');                           
       callp wrtsection('*fini');                            
C                   MOVE      *ON           *INLR            

C Return

Figure 3: Here's the RPGLE code for CGIDEV2/QRPGLESRC MBR(GETCUS).

The program uses a series of subprocedures to build the next page to display for the user. The call to gethtml reads all of the HTML needed to build the second Web page. This code is stored in member GETCUS2 of DEMOHTML in CGIDEV2 and is shown in Figure 4. The call to wrtsection('top') writes the HTML code for the top of the page into a buffer waiting to transmit to the remote user. As each record is read in the DOU loop, the program calls updhtmlvar to load the data in CName into the variable cname on the Web page. Then, the call to wrtsection('tabrow') writes the data for that customer into the buffer. After all records have been processed, the call to wrtsection('bottom') loads the HTML code for the bottom of the page into the buffer, and the call to wrtsection('*fini') transmits the buffer to the remote user.


Content-type: text/html                        
Expires: 0                  
Get Customer Name                   






Figure 4: Here's the HTML code for CGIDEV2/DEMOHTML MBR(GETCUS2).

The markers /$top, /$tabrow, and /$bottom are not HTML tags, but markers for the CGIDEV2 tool to use to identify sections of the HTML code. The variable /%cname%/ is also not HTML; it's only a marker that the CGI program replaces with real data. The CGI program mixes the HTML code and the live data from the database into a text string in a buffer that is then sent to the remote user. In this case, it builds the Web page displayed in Figure 5.

Figure 5: Here's your second Web page.

This is just the simplest of examples, showing you how to code your own CGI programs using RPGLE and CGIDEV2. IBM provides plenty of examples to help you expand into increasingly sophisticated Web pages.

That Was Then, and This Is Now

No RPG programmer has any excuse for not developing effective and exciting browser-based applications. Best of all, you can easily adapt existing program logic from your current applications to work with Web-based applications.

Just as an added bonus, CGIDEV2 shows off the real power of ILE programming by delivering this great and complex tool all neatly bundled inside ILE service programs. I may have disliked the clunky interface of the original CGIDEV product, but that was then, and this is now! I love the slick new interface provided by CGIDEV2.

Kevin Forsythe is the author of the new book SQL for eServer i5 and iSeries. He has over 18 years of experience working with the iSeries platform and its predecessors. He has been a member of the DMC team for the past nine years. Kevin's primary responsibility is providing iSeries education, but he also provides customers with project management, system design, analysis, and technical construction. In addition to his technical skills (RPG IV, CL, OS/400, SQL, FTP, Query, VB, Net.Data), Kevin possesses the ability to communicate new and complex concepts to his students. He has been the primary instructor for DMC's iSeries-based AS/Credentials training courses since 1997 and has authored courses such as Advanced ILE, SQL, Embedded SQL, Operations Navigator, and Intro to WebSphere Studio. An award-winning speaker, he has spoken at every COMMON Conference since the spring of 2000.