Как показать 2 объединенных списка массивов, объединенных с помощью s:merge в одном и том же s:select в Struts2

У меня есть два массива на моем jsp, один массив хранится в контексте сервлета, а другой - в запросе в Struts2.

Теперь я объединяю их с помощью s:merge следующим образом:

<s:merge id="thirdList">
   <s:param value="#application[@list1]"/>
   <s:param value="#request.list2"/>
</s:merge>

Я проверил, объединены ли они или нет, используя следующий фрагмент кода.

<s:iterator value="thirdList">
   <s:property/>
</s:iterator>

Оба массива относятся к POJO, поэтому он отображает ссылку на эти POJO на странице jsp.

Теперь я хочу отобразить весь список в раскрывающемся списке, поэтому я использую для этого.

<s:select ...... list="thirdList">
</s:select>

Таким образом, на странице jsp в раскрывающемся списке отображаются POJO в раскрывающемся списке. Теперь я хочу отображать некоторые строковые значения в раскрывающемся списке вместо ссылок POJO.

Проблема в том, что список1 является массивом класса (POJO) объекта1, а список2 является массивом класса (POJO) объекта2 и хочет, чтобы их различные свойства отображались в раскрывающемся списке.

Например, есть 5 POJO типа object1 в list1 и 10 POJO типа object2 в list2, и мой раскрывающийся список должен содержать всего 15 записей.

Чтобы отобразить эти свойства на странице jsp, я использовал этот код

<s:iterator value="thirdList">
        <s:property value="id_list1"/>
        <s:property value="description_list1"/>
        <s:property value="id_list2"/>
        <s:property value="description_list2"/>
</s:iterator>

Список правильно напечатан. Теперь в теге s:select используются атрибуты listKey и listValue.

Поскольку мне нужно использовать объединенный список для отображения в теге <s:select>, каким должно быть мое значение для id_list1, id_list2, description_list1, description_list2, которое я должен использовать в listKey и listValue.


person azaveri7    schedule 17.02.2015    source источник


Ответы (2)


Прежде всего: Не выполняйте такую ​​работу на уровне представления. Вы должны написать объект, который будет содержать значения, которые вам нужно отобразить в JSP, итерировать оба ваших списка, создавая новый экземпляр этот объект view с необходимыми значениями и помещая его в некоторый список. Затем в JSP вы можете повторить этот список объектов view.

При этом ... продвигаясь к хакерскому, а не к лучшему решению. Я продемонстрирую это на списке, который состоит из String и Integer, если это Integer, то мы хотим вызвать метод intValue(), в случае String будет вызван метод toUpperCase(). Поскольку по умолчанию вызов несуществующего свойства не дает значения, которое мы можем сравнить, мы будем abиспользовать #attr для оценки вызовов свойств экземпляра.

<s:select list="{'teststring', 2, 'somestring', 3}"
   listValue="#attr['top.intValue()'] == null ? top.toUpperCase() : top.intValue()" />

Обратите внимание, что это не будет работать, если в ваших свойствах есть нулевые значения.

И снова не делайте этого в представлении.

person Aleksandr M    schedule 17.02.2015

Вы правы Александр. Я не должен делать это в слое просмотра. Но потом мне интересно, какая польза от тега s:merge.

Чтобы решить эту проблему, я сделал следующее:

В классе действий я создал новый arraylist. Я создал новый POJO, скажем, POJO t с двумя переменными-членами: int 'id' и string 'value'.

Для обоих массивов я повторил их, скопировал их идентификатор и описание, которые мне нужно показать в раскрывающемся списке на странице jsp, в новый POJO t и вставил этот экземпляр «t» во вновь созданный массив. Затем я сохранил этот массив в объекте запроса.

Затем на странице jsp в теге s: select я перебрал этот новый список, а для listKey и listValue я использовал

listKey="id" and listValue="value"

И это сработало.

Простое решение сложной проблемы.

person azaveri7    schedule 17.02.2015
comment
Я пытаюсь проголосовать за свой ответ, но он говорит, что я не могу проголосовать за свой ответ в течение 2 дней. - person azaveri7; 17.02.2015
comment
В любом случае, эти теги имеют место, когда есть доступ к JSP, но нет действия. К сожалению, это случается время от времени, так что это позволяет парням, работающим с интерфейсом, приводить вещи в форму, но это не идеально, если у вас есть доступ к действию (как уже установлено). Я думаю, что Дэйв Ньютон где-то это написал, так что заслуга в этом принадлежит не мне. - person Quaternion; 18.02.2015