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.
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.
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.