Тег выбора формы Spring не выделяет несколько элементов

Я установил тег формы «выбрать» Spring на странице jsp, используемой для ввода параметров поиска и отображения результатов. Тег выбора формы Spring позволяет пользователю выбирать более одного элемента благодаря опции «multiple=true». У меня возникла проблема с отображением результатов, чтобы подчеркнуть, что было выбрано несколько элементов.

Он отлично работает, если пользователь выбирает один элемент, он выделяется при повторном отображении формы (при этом введенные параметры поиска по-прежнему отображаются в верхней половине страницы, а результаты поиска отображаются в нижней половине).

Выбран один элемент:

Выбран один элемент

Один элемент по-прежнему отображается как выбранный на дисплее ответа:

Один элемент по-прежнему отображается как выбранный на дисплее ответа

Однако, если выбрано несколько элементов, они вообще не выделяются на экране результатов:

Выбрано несколько элементов:

Выбрано несколько элементов:

Отображение нескольких элементов, не отображаемых в результатах:

Несколько элементов не отображаются в результатах поиска

Вот соответствующий код jsp:

Команда действия:

<form:form action="/${localePath}/search/ssSearch.do" method="post"  modelAttribute="searchCommand" onsubmit="return trackSearch();">

Выберите код:

<tr valign="top"><td>Test Items</td><td>
<form:select path="testItems" multiple="true" size="4">
        <form:option value="">All Items</form:option>
        <form:options items="${testItems}" />
</form:select>

Java-код:

Вот код «testItems» в объекте SearchCommand:

private String testItems;

    public String getTestItems() {
        return testItems;
    }

    public void setTestItems(String testItems) {
        this.testItems = testItems;
    }

Вот код запроса контроллера:

@RequestMapping(value = "/*/search/ssSearch.do", method=RequestMethod.POST) 
public String searchResults( HttpServletRequest request, 

@ModelAttribute("searchCommand") SearchCommand command,  ModelMap map)
            throws Exception 
    {
        return searchResultsDo(command,  map, request);
    }

Вот код, используемый для заполнения testItems:

    Map<String, String> testItemsMap = new TreeMap<String, String>();
    testItemsMap.put("item1 name", "item 1 value");
    testItemsMap.put("item2 name", "item 2 value");
    testItemsMap.put("item3 name", "item 3 value");
    testItemsMap.put("item4 name", "item 4 value");
    testItemsMap.put("item5 name", "item 5 value");
    testItemsMap.put("item6 name", "item 6 value");
    testItemsMap.put("item7 name", "item 7 value");
    testItemsMap.put("item8 name", "item 8 value");

    map.addAttribute("testItems", testItemsMap);

Как я могу выделить несколько выбранных элементов на странице ответа?


person Jack BeNimble    schedule 31.03.2016    source источник


Ответы (1)


Ответ состоял в том, чтобы собрать карту выбранных элементов в коде, а затем обратиться к ней в jsp следующим образом:

                <form:select path="testItems2" multiple="true" size="4">
                     <form:option value="">All Items</form:option>              
                      <c:forEach items="${testItems2}" var="testItem2">
                       <c:choose>
                        <c:when test="${not empty items2SelectedMap[testItem2.key]}">
                          <form:option value="${testItem2.key}" selected="true">${testItem2.value}</form:option>
                          </c:when>
                          <c:otherwise>
                          <form:option value="${testItem2.key}" >${testItem2.value}</form:option>
                        </c:otherwise>                            
                       </c:choose>
                    </c:forEach>                            
                </form:select> 

Java-код:

        Map<String, String> testItemsMap2 = new TreeMap<String, String>();

        List<String> items2SelectedList = null;
        if(StringUtils.isNotBlank(command.getTestItems2())){
            String[] items2Selected = command.getTestItems2().split(",");
            items2SelectedList = Arrays.asList(items2Selected);
        }


        Map<String, String> items2SelectedMap = new HashMap<String, String>();
        if (items2SelectedList != null) {
            for (String item2 : items2SelectedList) {
                items2SelectedMap.put(item2, item2);
            }
        }
        map.addAttribute("items2SelectedMap", items2SelectedMap);
person Jack BeNimble    schedule 01.04.2016