Java Servlet & JSP Cookbook

Problem

You want to process data that is part of a POST request.

Solution

Use the ServletRequest.getParameter(String name ) , getParameterMap( ) , getParameterNames( ) , or getParameterValues(String name) methods in the servlet's doPost method.

Discussion

The service method of a servlet calls the servlet's doPost method when a client sends a POST HTTP request. The servlet developer then has four different methods she can call to gain access to the posted data, which makes it pretty easy to process these requests . Just in case a client application uses a GET method to send the servlet its data as a query string, the servlet should also call:

doPost(request,response);

in the servlet's doGet( ) method. Example 7-2 demonstrates handling POST data with the oft-used getParameter(String name) method, as well as with the getParameterMap( ) method, which returns a java.util.Map . The map contains parameter keys and values. The getParameterNames( ) method returns a java.util.Enumeration of the parameter names . You can iterate through this Enumeration and pass the values to getParameter(String name) . Another ServletRequest method, getParameterValues(String name) , returns a String array of all the posted values for that parameter name (if there is only one value, the returned array contains one String ). Figure 7-1 shows the browser display of the PostHandler servlet after a user has submitted the form in Example 7-1.

Figure 7-1. Servlet displays name/value pairs from posted form input

Example 7-2. Using the ServletRequest.getParameter and getParameterMap methods to handle posted data

import javax.servlet.*; import javax.servlet.http.*; import java.util.Map; import java.util.Iterator; import java.util.Map.Entry; public class PostHandler extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { /* Use the ServletRequest.getParameter(String name), getParameterMap( ), getParameterNames( ), or getParameterValues( ) methods in the servlet's doPost method*/ String name = request.getParameter("username"); String depart = request.getParameter("department"); String email = request.getParameter("email"); response.setContentType("text/html"); java.io.PrintWriter out = response.getWriter( ); out.println("<html>"); out.println("<head>"); out.println("<title>Welcome</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Your Identity</h1>"); out.println( "Your name is: " + ( (name == null name.equals("")) ? "Unknown" : name)); out.println("<br><br>"); out.println( "Your department is: " + ( (depart == null depart.equals("")) ? "Unknown" : depart)); out.println("<br><br>"); out.println( "Your email address is: " + ( (email == null email.equals("")) ? "Unknown" : email)); out.println("<h2>Using ServletRequest.getParameterMap</h2>"); Map param_map = request.getParameterMap( ); if (param_map == null) throw new ServletException( "getParameterMap returned null in: " + getClass( ).getName( )); //iterate through the java.util.Map and display posted parameter //values //the keys of the Map.Entry objects are type String; the values are //type String[], //or String array Iterator iterator = param_map.entrySet( ).iterator( ); while(iterator.hasNext( )){ Map.Entry me = (Map.Entry)iterator.next( ); out.println(me.getKey( ) + ": "); String[] arr = (String[]) me.getValue( ); for(int i=0;i<arr.length;i++){ out.println(arr[i]); //print commas after multiple values, //except for the last one if (i > 0 && i != arr.length-1) out.println(", "); }//end for out.println("<br><br>"); }//end while out.println("</body>"); out.println("</html>"); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { doPost(request,response); } }

Getting the value of a parameter is as simple as using request.getParameter( parametername ) . Then you can test for the failure to return a valid value with code from Example 7-2:

out.println("Your name is: " + ( (name == null name.equals("")) ? "Unknown" : name));

If the name variable is an empty String or null , then the servlet prints "Unknown"; otherwise , it prints the name value. There are several design patterns you can use for validating form input, including client-side JavaScript and special validation JavaBeans.

Handling the java.util.Map type is more involved and entails more code. The servlet gets the parameter map by calling the ServletRequest method:

Map param_map = request.getParameterMap( )

Then the code gets a java.util.Iterator from the java.util.Set returned from Map.entrySet( ) . The Set contains Map.Entry objects, which are key/value pairs representing the parameter name and value. The servlet uses the iterator to cycle through the parameter names and values:

Iterator iterator = param_map.entrySet( ).iterator( ); while(iterator.hasNext( )){ Map.Entry me = (Map.Entry)iterator.next( ); out.println(me.getKey( ) + ": "); // The returned value is a String array String[] arr = (String[]) me.getValue( ); for(int i=0;i<arr.length;i++){ out.println(arr[i]); //print commas after multiple values, //except for the last one if (i > 0 && i != arr.length-1) out.println(", "); }//end for out.println("<br><br>"); }//end while

If this looks too elaborate for processing posted data, then reserve getParameterMap( ) for applications that are designed to deal with them, such as a validator bean that takes a Map as a constructor or method parameter. In addition, Recipe 7.2 shows a JSP that uses JSTL to conveniently process a parameter map.

See Also

Recipe 7.2 on handling a POST request in a JSP; Recipe 7.5 on posting data from a servlet; Recipe 7.7 on using a servlet to add a parameter to a query string; the ServletRequest API docs at http://java.sun.com/j2ee/1.4/docs/api/index.html.

Категории