-->

httpservlet request getparameter of unchecked and

2019-07-07 02:14发布

问题:

my form has several checkboxes on it (around 15) and the issue im having is that the names of the check boxes only appear in the enumeration if they are checked but i want all of them to be returned so that when i print the data it will have the name of the checkbox and say "checked" or "unchecked". i had thought of one way that i could just manually set the flag to see what is present and what isnt, but that doesnt seem remotely efficient.

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
 {

        try
        {
            FileWriter writer = new FileWriter("OrderFormData.csv");
            writer.append("FieldName");
            writer.append(',');
            writer.append("Value");
            writer.append('\n');
            @SuppressWarnings("unchecked")
            Enumeration <String> paramNames = request.getParameterNames();
            while(paramNames.hasMoreElements()) 
            {
                String paramName = (String)paramNames.nextElement();
                writer.append(paramName);
                writer.append(',');
                String[] paramValues = request.getParameterValues(paramName);
                if (paramValues.length == 1)
                {
                    String paramValue = paramValues[0];
                    if (paramValue.length() == 0)
                    {
                        writer.append("No Value");
                        writer.append('\n');
                    }
                    else
                    {
                        writer.append(paramValue);
                        writer.append('\n');
                    }
                }
                else
                {
                    for(int i = 0; i<paramValues.length; i++)
                    {
                        writer.append(paramValues[i]);
                        writer.append(',');
                    }
                    writer.append('\n');
                }


            }
            writer.flush();
            writer.close();
        }
        catch(IOException e)
        {
             e.printStackTrace();
        }

    }
}

回答1:

You should think in a workaround because as @Alex told you, unchecked checkboxes are not part of the request.

This is just an idea, but for example:

<input type="hidden" name="checkboxNamesList" value="nameCheckbox1" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox2" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox3" />
<input type="hidden" name="checkboxNamesList" value="nameCheckbox4" />

Then, you can get checkboxNamesList from the request (it will be a String[]) so you will have all the checkboxes params names. If you get a parameter for one of the checkboxes name and value is null, it means that checkboxe was not checked.

Edited: clarification

Well, as unchecked checkboxes are not present in the request you don't know whose checkboxes in the JSP were not checked but you need to know it in order to write in your data file something like checkbox_name1=unchecked.

So, how to do that? First, you need to know what checkboxes (uncheck or not) were present in the request. For that, you can use the code below and get name of all checkboxes present in the JSP:

String[] checkboxNamesList= request.getParameterValues("checkboxNamesList");

Then, let look for unchecked checboxes:

for (int i = 0; i < checkboxNamesList.length; i++) {

    String myCheckBoxValue = request.getParameterValues(checkboxNamesList[i]);

    // if null, it means checkbox is not in request, so unchecked 
    if (myCheckBoxValue == null)
        writer.append(checkboxNamesList[i] + "=unchecked");

    // if is there, it means checkbox checked
    else
        writer.append(checkboxNamesList[i] + "=checked");

}


回答2:

You can use hidden fields together with checkboxes. Iterate through them and check the presence of checkbox selection.

<input type="checkbox" name="fruit" value="Apple" />
<input type="hidden" name="fruit_option" value="Apple" />
<input type="checkbox" name="fruit" value="Orange" />
<input type="hidden" name="fruit_option" value="Orange" />

And at the server side do something like this:

Enumeration<String> paramNames = req.getParameterNames();
while(paramNames.hasMoreElements()) {
    String paramName = paramNames.nextElement();

    if (!paramName.endsWith("_option")) continue; // Skip checkboxes. Only process hidden fields

    String [] options = req.getParameterValues(paramName); // All options
    String [] selections = req.getParameterValues(paramName.replace("_option", "")); // Real checkboxes

    List <String> selectionList = Arrays.asList(selections); // Easier to work with

    // Iterate through checkbox group options
    for (String o : options) {
        boolean contains = selectionList.contains(o);
        // Do something with it. Write yes/no to file for example...
    }
}


回答3:

unchecked boxes won't be part of the request: see http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.2



回答4:

Create hidden fields as

<input type="checkbox" name="checkbox" checked/> <input type="hidden" name="checkbox" checked />

Now in your servlet as: String[] names = request.getParameterValues("checkbox");

    PrintWriter pw = new PrintWriter(new File("/Desktop/sticker.txt"));
    for(int i=0; i < names.length; i++) {
        if(i + 1 < names.length && names[i].equals(names[i+1])) {
            pw.write(names[i] + ",true\n");
            ++i;
        } else {
            pw.write(names[i]+",false\n");
        }

    }
    pw.close();