The Java Developers Almanac 1.4


Order this book from Amazon.

   
Home > List of Packages > javax.servlet.jsp  [18 examples] > Java Server Pages  [7 examples]

e1049. Implementing a Form in a JSP Page

There are many different strategies for implementing a form. Some strategies involve a JSP page that shows the form and another to show field validation errors. This example combines both pages in one since in most cases, the page that shows validation errors looks like the original page except for error messages next to the fields with errors.

When the page is first shown, no validation is done. When the form is submitted, the new values are submitted to the same page except that this time, the page will validate the values. If the values are all valid, the form is processed and the browser is redirected to a success page.

The above behavior is implemented using a request parameter called process. If set to "true", the page will validate the values and possibly process the form; otherwise, the page simply shows a blank form. The request parameter is added when the user submits the form.

It is good practice to avoid placing the form validation code in the JSP page. The example encapsulates the validation and form processing code in a bean called com.mycompany.MyForm. When the form is submitted, an instance of this bean is instantiated and loaded with the submitted values for validation and processing.

It is also considered good practice not to place error messages in business objects such as in the MyForm class. The strategy used in this example is to create and store a map of error messages in the page instance and supply this map to every new MyForm instance to use. In this way, all presentation related information is contained in one JSP file. This makes it easier to maintain and potentially localize the page. Another strategy is to use resource bundles. However, unless all content on the page is moved in the resource bundle, it may be simpler to keep the error messages in the page to avoid having to manage two sources of content.

See also e1050 Implementing a Form That Prevents Duplicate Submissions in a JSP Page.

    <%-- Instantiate the form validation bean and supply the error message map --%>
    <%@ page import="com.mycompany.*" %>
    <jsp:useBean id="form" class="com.mycompany.MyForm" scope="request">
        <jsp:setProperty name="form" property="errorMessages" value='<%= errorMap %>'/>
    </jsp:useBean>
    
    <%
        // If process is true, attempt to validate and process the form
        if ("true".equals(request.getParameter("process"))) {
    %>
            <jsp:setProperty name="form" property="*" />
    <%
            // Attempt to process the form
            if (form.process()) {
                // Go to success page
                response.sendRedirect("formDone.jsp");
                return;
            }
        }
    %>
    
    <html>
    <head><title>A Simple Form</title></head>
    <body>
    
    <%-- When submitting the form, resubmit to this page --%>
    <form action='<%= request.getRequestURI() %>' method="POST">
        <%-- email --%>
        <font color=red><%= form.getErrorMessage("email") %></font><br>
        Email: <input type="TEXT" name="email" value='<%= form.getEmail() %>'>
        <br>
    
        <%-- zipcode --%>
        <font color=red><%= form.getErrorMessage("zipcode") %></font><br>
        Zipcode: <input type="TEXT" name="zipcode" value='<%= form.getZipcode() %>'>
        <br>
    
        <input type="SUBMIT" value="OK">
        <input type="HIDDEN" name="process" value="true">
    </form>
    
    </body>
    </html>
    
    <%!
        // Define error messages
        java.util.Map errorMap = new java.util.HashMap();
        public void jspInit() {
            errorMap.put(MyForm.ERR_EMAIL_ENTER, "Please enter an email address");
            errorMap.put(MyForm.ERR_EMAIL_INVALID, "The email address is not valid");
            errorMap.put(MyForm.ERR_ZIPCODE_ENTER, "Please enter a zipcode");
            errorMap.put(MyForm.ERR_ZIPCODE_INVALID, "The zipcode must be 5 digits");
            errorMap.put(MyForm.ERR_ZIPCODE_NUM_ONLY, "The zipcode must contain only digits");
        }
    %>
Here is the code for the com.mycompany.MyForm bean:
    package com.mycompany;
    import java.util.*;
    
    public class MyForm {
        /*  The properties */
        String email = "";
        String zipcode = "";
    
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email.trim();
        }
    
        public String getZipcode() {
            return zipcode;
        }
        public void setZipcode(String zipcode) {
            this.zipcode = zipcode.trim();
        }
    
        /* Errors */
        public static final Integer ERR_EMAIL_ENTER = new Integer(1);
        public static final Integer ERR_EMAIL_INVALID = new Integer(2);
        public static final Integer ERR_ZIPCODE_ENTER = new Integer(3);
        public static final Integer ERR_ZIPCODE_INVALID = new Integer(4);
        public static final Integer ERR_ZIPCODE_NUM_ONLY = new Integer(5);
    
        // Holds error messages for the properties
        Map errorCodes = new HashMap();
    
        // Maps error codes to textual messages.
        // This map must be supplied by the object that instantiated this bean.
        Map msgMap;
        public void setErrorMessages(Map msgMap) {
            this.msgMap = msgMap;
        }
    
        public String getErrorMessage(String propName) {
            Integer code = (Integer)(errorCodes.get(propName));
            if (code == null) {
                return "";
            } else if (msgMap != null) {
                String msg = (String)msgMap.get(code);
                if (msg != null) {
                    return msg;
                }
            }
            return "Error";
        }
    
        /* Form validation and processing */
        public boolean isValid() {
            // Clear all errors
            errorCodes.clear();
    
            // Validate email
            if (email.length() == 0) {
                errorCodes.put("email", ERR_EMAIL_ENTER);
            } else if (!email.matches(".+@.+\\..+")) {
                errorCodes.put("email", ERR_EMAIL_INVALID);
            }
    
            // Validate zipcode
            if (zipcode.length() == 0) {
                errorCodes.put("zipcode", ERR_ZIPCODE_ENTER);
            } else if (zipcode.length() != 5) {
                errorCodes.put("zipcode", ERR_ZIPCODE_INVALID);
            } else {
                try {
                    int i = Integer.parseInt(zipcode);
                } catch (NumberFormatException e) {
                    errorCodes.put("zipcode", ERR_ZIPCODE_NUM_ONLY);
                }
            }
    
            // If no errors, form is valid
            return errorCodes.size() == 0;
        }
    
        public boolean process() {
            if (!isValid()) {
                return false;
            }
    
            // Process form...
    
            // Clear the form
            email = "";
            zipcode = "";
            errorCodes.clear();
            return true;
        }
    }

 Related Examples
e1046. The Quintessential JSP Page
e1047. Running Java Code in a JSP Page
e1048. Saving Data in a JSP Page
e1050. Implementing a Form That Prevents Duplicate Submissions in a JSP Page
e1051. Precompiling a JSP Page
e1052. Preventing the Creation of a Session in a JSP Page

See also: Java Server Pages Headers    Java Server Pages Input    Java Server Pages Output   


© 2002 Addison-Wesley.