4.2. Form TagsA full discussion of HTML and user interface design is clearly beyond the scope of this book. Many other books are available which discuss these topics at length, such as HTML: The Definitive Guide, by Chuck Musciano and Bill Kennedy (O'Reilly & Associates, Inc.). However, many of these other resources do not discuss the relationship between HTML form elements and the corresponding data sent to the web server when a form is submitted. So let's run through a quick review of HTML form elements before we see how CGI scripts process them. 4.2.1. Quick Reference to Form TagsBefore we get going, Table 4-1 shows a short list of all the available form tags. Table 4-1. HTML Form Tags
4.2.2. The <FORM> TagAll forms begin with a <FORM> tag and end with a </FORM> tag: <FORM ACTION="/cgi/register.cgi" METHOD="POST"> . . . </FORM> Submitting a form generates an HTTP request just like clicking on a hyperlink, but a request generated by a form is almost always directed at a CGI script (or a similar dynamic resource). You specify the format of the HTTP request via attributes of the <FORM> tag:
A document can consist of multiple forms, but one form cannot be nested inside another form. 4.2.3. The <INPUT> TagThe <INPUT> tag generates a wide array of form widgets. They are differentiated by the TYPE attribute. Each <INPUT> tag has the same general format: <INPUT TYPE="text" NAME="element_name" VALUE="Default value"> Like <BR>, this tag has no closing tag. The basic attributes that all input types share are as follows:
Let's look at each of the input types. 4.2.3.1. Text fieldsOne of the most basic uses of the <INPUT> tag is to generate a text fields where users may enter a line of data (see Figure 4-2). Text fields are the default input type; if you omit the TYPE attribute, you will get a text field. The HTML for a text field looks like this: <INPUT TYPE="text" NAME="quantity" VALUE="1" SIZE="3" MAXLENGTH="3"> Figure 4-2. Text and password fieldsHere are the attributes that apply to text fields:
4.2.3.2. Password fieldsA password field is similar to a text field, except that instead of displaying the true value of the field, the browser represents each character with an asterisk or bullet (refer back to Figure 4-2): <INPUT TYPE="password" NAME="set_password" VALUE="old_password" SIZE="8" MAXLENGTH="8"> This field does not provide any true security; it simply provides basic protection against someone looking over the shoulder of the user. The value is not encrypted when it is transferred to the web server, which means that passwords are displayed as part of the query string for GET requests. All the attributes that apply to text fields also apply to password fields. 4.2.3.3. Hidden fieldsHidden fields are not visible to the user. They are generally used only with forms which are themselves generated by a CGI script and are useful for passing information between a series of forms: <INPUT TYPE="hidden" NAME="username" VALUE="msmith"> Like password fields, hidden fields provide no security. Users can view the name and value of hidden fields by viewing the HTML source in their browsers. We'll discuss hidden fields in much more detail in our discussion of maintaining state in Chapter 11, "Maintaining State". 4.2.3.4. CheckboxesCheckboxes are useful when users simply need to indicate whether they desire an option. See Figure 4-3. Figure 4-3. CheckboxesThe user can toggle between two states on a checkbox: checked or unchecked. The tag looks like this: <INPUT TYPE="checkbox" NAME="toppings" VALUE="lettuce" CHECKED> In this example, if the user selects the checkbox, then "toppings" returns a value of "lettuce". If the checkbox is not selected, neither the name nor the value is returned for the checkbox. It is possible to have multiple checkboxes use the same name. In fact, this is not uncommon. The most typical situation in which you might do this is if you have a dynamic list of related options and the user could choose a similar action for all of them. For example, you may wish to list multiple options this way: <INPUT TYPE="checkbox" NAME="lettuce"> Lettuce<BR> <INPUT TYPE="checkbox" NAME="tomato"> Tomato<BR> <INPUT TYPE="checkbox" NAME="onion"> Onion<BR> If, however, the CGI script does not need to know the name of each of the options in order to perform its task, you may wish to do this instead: <INPUT TYPE="checkbox" NAME="toppings" VALUE="lettuce"> Lettuce<BR> <INPUT TYPE="checkbox" NAME="toppings" VALUE="tomato"> Tomato<BR> <INPUT TYPE="checkbox" NAME="toppings" VALUE="onion"> Onion<BR> If someone selects "lettuce" and "tomato" but not "onion", then the browser will encode this as toppings=lettuce&toppings=tomato. The CGI script can process these multiple toppings, and you may not need to update the CGI script if you later add items to the list. Attributes for checkboxes include:
4.2.3.5. Radio buttonsRadio buttons are very similar to checkboxes except that any group of radio buttons that share the same name are exclusive: only one of them may be selected. See Figure 4-4. Figure 4-4. Radio buttonsThe tag is used just like a checkbox: <INPUT TYPE="radio" NAME="bread" VALUE="wheat" CHECKED> Wheat<BR> <INPUT TYPE="radio" NAME="bread" VALUE="white"> White<BR> <INPUT TYPE="radio" NAME="bread" VALUE="rye"> Rye<BR> In this example, "wheat" is selected by default. Selecting "white" or "rye" will cause "wheat" to be unselected. Although you may omit the VALUE attribute with checkboxes, doing so with radio buttons is meaningless since the CGI script will not be able to differentiate between different radio buttons if they all return "ON". Using the CHECKED attribute with multiple radio buttons with the same name is not valid. Browsers will generally render both as selected, but they will be unselected as soon as the user selects a different option and the user will be unable to return the form to this initial state (unless it has a reset button of course). Radio buttons use the same attributes as checkboxes. 4.2.3.6. Submit buttonsA submit button does just what the name implies. It submits the contents of the form (see Figure 4-5). When the user clicks on a submit button, the browser runs any associated JavaScript onSubmit handler, formats an HTTP request according to the form method and form encoding type, then sends this request to the URL specified by the form action. The result is then displayed as a new web page. Figure 4-5. Submit buttonsThe HTML for a submit button looks like this: <INPUT TYPE="submit" NAME="submit_button" VALUE="Submit the Form"> Virtually all forms have a submit button, and you can have multiple submit buttons on one form: <INPUT TYPE="submit" NAME="option" VALUE="Option 1"> <INPUT TYPE="submit" NAME="option" VALUE="Option 2"> Only the name and value of the submit button clicked is included in the form submission. Here are the attributes it supports:
4.2.3.7. Reset buttonsA reset button allows users to reset the value of all the fields in a form to their default values. From the user's perspective, it generally accomplishes the same thing as reloading the form but is much faster and more convenient. Because the browser accomplishes this event without consulting the web server, CGI scripts never respond to it. The HTML tag looks like this: <INPUT TYPE="reset" VALUE="Reset the form fields"> You may have multiple reset buttons on the same form, although this would almost certainly be redundant.
4.2.3.8. Image buttonsYou can also have images as buttons. Image buttons function as submit buttons but give you much more flexibility over how the button looks. Keep in mind that users are generally used to having buttons displayed a particular way by the browser and operating system, and a button in a different format may be confusing to a novice. The HTML for an image button tag looks like this: <INPUT TYPE="image" SRC="/icons/button.gif" NAME="result" VALUE="text only"> Graphical and text-only browsers treat this element very differently. A text-only browser, such as Lynx, sends the name and value together like most other form elements: result=text+only However, a graphical browser, like Netscape and Internet Explorer, send the coordinates where the user clicked on the image in addition to the name of the button. The value is not sent. These coordinates are measured in pixels from the upper-left corner of the image (see Figure 4-6). Figure 4-6. Image button coordinatesIn this example, a graphical browser would submit: action.x=50&action.y=20 Here are the attributes for image buttons:
4.2.3.9. Plain buttonsThe last type of button is just that -- a button; it has no special function. To avoid confusing this button with the other button types, we will refer to it as a plain button. A plain button tag looks like a submit or reset button: <INPUT TYPE="button" VALUE="Click for a greeting..." onClick="alert( 'Hello!' );"> The name and value of a plain button is never passed to a CGI script. Because a plain button has no special action, it is meaningless without an onClick attribute:
4.2.4. The <SELECT> TagThe <SELECT> tag is used to create a list for users to choose from. It can create two different elements that look quite different but have similar function: a scrolling box or a menu (also commonly referred to as a drop-down). Both elements are displayed in Figure 4-7. Unlike the <INPUT> elements, <SELECT> tags have an opening as well as a closing tag. Here is an example of a menu: Choose a method of payment: <SELECT NAME="card" SIZE=1> <OPTION SELECTED>American Express</OPTION> <OPTION>Discover</OPTION> <OPTION>Master Card</OPTION> <OPTION>Visa</OPTION> </SELECT> Figure 4-7. Two forms of select lists: a menu and a scrolling boxHere is an example of a scrolling box: Choose the activities you enjoy: <SELECT NAME="activity" SIZE=4 MULTIPLE> <OPTION>Aerobics</OPTION> <OPTION>Aikido</OPTION> <OPTION>Basketball</OPTION> <OPTION>Bicycling</OPTION> <OPTION>Golfing</OPTION> <OPTION>Hiking</OPTION> ... </SELECT> Scrolling boxes may optionally allow the user to select multiple entries. Multiple options are encoded as separate name-value pairs, as if they had been entered by multiple form elements. For example, if someone selects Aikido, Bicycling, and Hiking, the browser will encode it as activity=Aikido&activity=Bicycling& activity=Hiking. Attributes for the <SELECT> tag are:
4.2.4.1. The <OPTION> tagThe <SELECT> tag does not have a value attribute. Each of its possible values must have an <OPTION> tag around it. You may override the value used by a particular option by specifying a VALUE attribute like this: <OPTION VALUE="AMEX" >American Express</OPTION> Options have two optional attributes:
4.2.5. The <TEXTAREA> TagThe final form element, the <TEXTAREA> tag, allows users to enter multiple lines of text. See Figure 4-8. Figure 4-8. Text areaText areas have an opening and a closing tag: <TEXTAREA ROWS=10 COLS=40 NAME="comments" WRAP="virtual">Default text</TEXTAREA> This creates a scrolled text field with a visible area of ten rows and forty columns. There is no VALUE property for the <TEXTAREA> tag. Default text should be placed between the opening and closing tags. Unlike other HTML tags, white space -- including newlines -- is not ignored between <TEXTAREA> and </TEXTAREA> tags. A browser will render the example above with "Default" and "text" on separate lines. Attributes for the <TEXTAREA> tag are:
Copyright © 2001 O'Reilly & Associates. All rights reserved. |
||||||||||||||||||||||||||||
|