httpservlet запрос getparameter неотмеченных и отмеченных флажков в java

в моей форме есть несколько флажков (около 15), и проблема, с которой я сталкиваюсь, заключается в том, что имена флажков появляются в перечислении только в том случае, если они отмечены, но я хочу, чтобы все они были возвращены, так что когда я печатаю данные, это будет иметь имя флажка и сказать «отмечен» или «не отмечен». я думал об одном способе, которым я мог бы просто вручную установить флаг, чтобы увидеть, что присутствует, а что нет, но это не кажется отдаленно эффективным.

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();
        }

    }
}

person StraightEdge    schedule 30.07.2012    source источник


Ответы (4)


Вы должны подумать об обходном пути, потому что, как сказал вам @Alex, неотмеченные флажки не являются частью запроса.

Это просто идея, а для примера:

<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" />

Затем вы можете получить checkboxNamesList из запроса (это будет строка []), чтобы у вас были имена всех параметров флажков. Если вы получаете параметр для имени одного из флажков и значение равно null, это означает, что флажок не был установлен.

Отредактировано: уточнение

Ну, так как в запросе нет неотмеченных чекбоксов, вы не знаете, чьи чекбоксы в JSP не были отмечены, но вам нужно это знать, чтобы написать в вашем файле данных что-то вроде checkbox_name1=unchecked.

Итак, как это сделать? Во-первых, нужно знать, какие галочки (снятые или нет) присутствовали в запросе. Для этого вы можете использовать приведенный ниже код и получить имена всех флажков, присутствующих в JSP:

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

Затем поищите неотмеченные флажки:

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");

}
person jddsantaella    schedule 30.07.2012
comment
проблема, с которой я столкнулся, заключается в том, что я не могу оставить скрытые текстовые поля в файле данных, потому что это будет импортировано в другую программу. файл указан по имени поля и значению... если это правда, он вернет оба, но я только хочу, чтобы он возвращал фактический флажок, когда он истинен, а не возвращал скрытый - person StraightEdge; 31.07.2012
comment
Что вы подразумеваете под файлом данных? Скрытые поля являются лишь частью запроса. Цель здесь - узнать имена тех флажков, которые не были отмечены, чтобы вы могли делать с ними все, что хотите. - person jddsantaella; 31.07.2012
comment
я экспортирую данные из формы в файл csv, и он отформатирован: имя поля значение поля не вернет ли он скрытое поле? потому что, если я правильно понимаю, он вернет фактический флажок, когда он истинен, и он также вернет скрытое текстовое поле, когда оно ложно, что нежелательно - person StraightEdge; 31.07.2012
comment
ХОРОШО. Так в чем проблема? Если у вас есть список флажков (отмеченных и неотмеченных), ищите их в запросе, если параметр есть, то флажок установлен, если нет, то снят. - person jddsantaella; 31.07.2012
comment
извините, я не пытаюсь быть грубым или что-то в этом роде. я просто честно не понимаю, как это работает для решения моей проблемы. я не сомневаюсь, что это работает, я просто пытаюсь понять, как это реализовать, я действительно просто хочу понять. Например, как это работает... этот метод не вернет: значение поля fieldname chkbox1 true chkbox1txt false chkbox2 false chkbox2txt false, где chkbox1txt и chkbox2txt — это скрытые текстовые поля. если это так, я хочу исключить наличие истинного и ложного для одного и того же элемента (флажок и скрытое поле) - person StraightEdge; 31.07.2012
comment
Вы не были грубы ;-) Я отредактировал свой ответ. Надеюсь, теперь стало понятнее. Дай мне знать. Кстати, код я не проверял, так что простое копирование и вставка могут не сработать. - person jddsantaella; 31.07.2012
comment
это было намного яснее, извините, это был конец дня и я не думал ясно, теперь это выглядит так очевидно. еще раз спасибо! - person StraightEdge; 31.07.2012
comment
Я мог что-то упустить, но из своего опыта я понял, что request.getParameterValues(checkboxNamesList); возвращает только поля CHECKED - person Chris Neve; 07.10.2014

Вы можете использовать скрытые поля вместе с флажками. Переберите их и проверьте наличие выбора флажка.

<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" />

А на стороне сервера сделать что-то вроде этого:

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...
    }
}
person tuner    schedule 30.07.2012
comment
Я видел это решение раньше, как именно это помогает определить, что проверено, а что нет? - person StraightEdge; 31.07.2012
comment
Заботиться. Если вы используете одно и то же имя (плод) для всех флажков, вы будете работать с группой флажков, из которых можно отметить только один. - person jddsantaella; 31.07.2012
comment
Это правда. Вероятно, я использовал что-то подобное в форме с множеством динамических флажков и радиокнопок. Последние должны быть в группе, и один и тот же код работает для обоих. - person tuner; 31.07.2012

неотмеченные поля не будут частью запроса: см. http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.2

person Alex Snaps    schedule 30.07.2012

Создавайте скрытые поля как

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

Теперь в вашем сервлете как: String[] name = 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();
person Victor    schedule 27.04.2016