Запросить запрос из нескольких динамических флажков с помощью Spark

У меня есть html-список флажков, который динамически создается с помощью Freemarker. Html выглядит так:

<div data-role="collapsible">
    <h4>Software</h4>
    <form action="/" method="POST">
        <ul data-role="listview" >
            <#list softwareoptions as software>
                <input type="checkbox" id="softwarefilter" name="softwarefilter" value="${software}" autocomplete="off" >${software}
            </#list>
        </ul>
    </form>
</div>

Вот сгенерированный список:

<div data-role="collapsible">
<h4>Software</h4>
<form action="/" method="POST">
    <ul data-role="listview" >
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Adobe Creative Cloud" autocomplete="off" >Adobe Creative Cloud
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Adobe Web Premium" autocomplete="off" >Adobe Web Premium
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="MATLAB" autocomplete="off" >MATLAB
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Quicken" autocomplete="off" >Quicken
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Steam" autocomplete="off" >Steam
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="IBM SPSS Statistics" autocomplete="off" >IBM SPSS Statistics
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft SQL Server 2008" autocomplete="off" >Microsoft SQL Server 2008
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft SQL Server 2012" autocomplete="off" >Microsoft SQL Server 2012
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Office" autocomplete="off" >Microsoft Office
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Autodesk Infrastructure Design Suite" autocomplete="off" >Autodesk Infrastructure Design Suite
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Visual Studio 2010" autocomplete="off" >Microsoft Visual Studio 2010
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Visual Studio 2013" autocomplete="off" >Microsoft Visual Studio 2013
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Visual Studio 2015" autocomplete="off" >Microsoft Visual Studio 2015
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Visio" autocomplete="off" >Microsoft Visio
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Unity 3d" autocomplete="off" >Unity 3d
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="GIMP" autocomplete="off" >GIMP
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Maxon CINEMA 4D Broadcast" autocomplete="off" >Maxon CINEMA 4D Broadcast
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="CrazyBump" autocomplete="off" >CrazyBump
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="FRAPS" autocomplete="off" >FRAPS
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="InfraRecorder" autocomplete="off" >InfraRecorder
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Garageband" autocomplete="off" >Garageband
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Microsoft Project" autocomplete="off" >Microsoft Project
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Numbers" autocomplete="off" >Numbers
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Pages" autocomplete="off" >Pages
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Fontographer" autocomplete="off" >Fontographer
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Keynote" autocomplete="off" >Keynote
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Wacom Tablet" autocomplete="off" >Wacom Tablet
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Arduino" autocomplete="off" >Arduino
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="iBooks" autocomplete="off" >iBooks
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="iMovie" autocomplete="off" >iMovie
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="Logic Pro X" autocomplete="off" >Logic Pro X
            <input type="checkbox" id="softwarefilter" name="softwarefilter" value="iTunes" autocomplete="off" >iTunes
    </ul>
</form>
</div>

Чтобы запросить значения флажков, я использую код Java:

Object softstring = request.queryParams("softwarefilter");

Однако это возвращает только строковое значение имени первого установленного флажка. Например, если отмечены Adobe Creative Suite и MATLAB, softstring = "Adobe Creative Suite".

Когда я использую:

 Object softstring = request.queryParamsValues("softwarefilter");

or

QueryParamsMap softmap = request.queryMap("softwarefilter");

Я получаю пустой массив и нулевую карту соответственно. Любые намеки на то, что я могу упустить?


person Joe Caruso    schedule 06.02.2016    source источник
comment
Вы поместили <label> непосредственно внутри <ul>, что, вероятно, является неправильной разметкой.   -  person Pmpr    schedule 06.02.2016
comment
Впрочем, без разницы, удалю.   -  person Joe Caruso    schedule 06.02.2016
comment
Какую версию Spark вы используете? Вы отправляете форму GET или POST? Показать HTML, сгенерированный FreeMarker, и другой код Java.   -  person rostanek    schedule 08.02.2016
comment
Я использую искру 2.3. Я знаю, что это работает на каком-то уровне, так как страница возвращает значение первого отмеченного поля, но не все из них.   -  person Joe Caruso    schedule 08.02.2016
comment
Иметь один и тот же идентификатор для всех входов неправильно. Все входные данные флажка должны иметь одно и то же имя, а не один и тот же идентификатор. Это может не повлиять на поведение, которое вы упомянули, но это плохая практика и ненужная.   -  person k.liakos    schedule 16.02.2016
comment
Я воспроизвел ваш пример, как написал @vandershraaf, и queryParamsValues работает нормально, но ваш вызов queryMap недействителен. Попробуйте request.queryMap().toMap().get("softwarefilter") — это вернет String[]. Возможно проблема с отправкой формы на сервер. Вы размещаете его в простой форме или, может быть, AJAX?   -  person rostanek    schedule 19.02.2016


Ответы (1)


Я использовал те же HTML-коды, что и в вопросе, за исключением того, что добавил в форму тег отправки.

На основе проверки все выбранные параметры находятся в части данных формы.

введите здесь описание изображения

Таким образом, параметры можно получить из req.body();. Например, если я выберу «Adobe Creative Cloud» и «Adobe Web Premium», вывод из req.body(); будет

softwarefilter=Adobe+Creative+Cloud&softwarefilter=Adobe+Web+Premium

Теперь нужно проанализировать эту необработанную строку, чтобы выбрать все параметры. Надеюсь это поможет.

person vandershraaf    schedule 18.02.2016