An interesting practice when producing HTML forms and handlers is to merge the operation of the form producer and the handler into the same program. The idea is to produce a generalized handler which receives the form input, parses it, computes the answer, and produces a new document which contains the answer to the input, as well as a new form. A special case must be made for the first invocation, in which the input would be empty, and then only the form should be generated. The following is an example which merges the producer and the handler for the phones database:
#!/usr/local/bin/lpshell :- use_module('/usr/local/src/pillow/pillow.pl'). main(_) :- get_form_input(Input), get_form_value(Input,person_name,Name), response(Name,Response), output_html([ cgi_reply, start, title('Telephone database'), image('phone.gif'), heading(2,'Telephone database'), --, Response, start_form, 'Click here, enter name of clip member, and press Return:', \\, input(text,[name=person_name,size=20]), end_form, end]). response(Name, Response) :- form_empty_value(Name) -> Response = [] ; phone(Name, Phone) -> Response = ['Telephone number of ',b(Name),': ',Phone,$] ; Response = ['No telephone number available for ',b(Name),'.',$]. phone(daniel, '336-7448'). phone(manuel, '336-7435'). phone(sacha, '543-5316').
This combination of the form producer and the handler allows producing applications that give the impression of being interactive, even if each step involves starting and running the handler to completion. Note that forms can contain fields which are not displayed and are passed as input to the next invocation of the handler. This allows passing state from one invocation of the handler to the next one.