Struts2, проверка строки на нуль

Я пытаюсь выполнить нулевую проверку строки, но это не сработает.

<s:iterator value="matrix" var="row">
    <tr>
       <s:iterator value="value" var="col">
            <td>    
                <s:if test="%{#col==null}">0</s:if>
                <s:else><s:property value="col"/></s:else>
            </td>
        </s:iterator>
    </tr>
</s:iterator>

матрица представляет собой

Map<Integer, List<String>>

Переменной "col" правильно присвоено строковое значение из списка.
Список может выглядеть следующим образом [ "hello" , null , "world ]

Текущий вывод: hello world
Требуемый вывод: hello 0 world

/Заранее спасибо


person Farmor    schedule 19.08.2010    source источник


Ответы (5)


Попробуйте без #.

 <s:if test="%{col==null}">0</s:if>

Я думаю, что has попытается сначала разрешить «col» и использовать значение col в качестве имени свойства. Поскольку это будет пусто, будет выполнено сравнение "" в качестве имени свойства, которое является вершиной стека значений. Я не уверен, как это будет оцениваться здесь.

Я всегда использую что-то вроде этого:

<s:if test="%{licenseStatusString != null}">
 ... something that uses licenseStatusString
</s:if>
person Shawn D.    schedule 19.08.2010
comment
‹s:if test=%{col==null}›0‹/s:if› дает Выход: 0 0 0 - person Farmor; 19.08.2010
comment
замените 'col' в if на 'top' и посмотрите - person Shawn D.; 19.08.2010
comment
Спасибо за ответ, к сожалению, это дает ту же проблему с пустой ячейкой вместо нуля. Я думаю, что больше не буду беспокоиться об этой проблеме со стойками и внесу изменения в JAVA, т.е. прокрутите массив и измените значение null на 0. - person Farmor; 20.08.2010

Это зависит от того, используете ли вы Struts2.0.x или более позднюю версию, поскольку атрибут id был заменен для атрибута var в s:iterator, начиная с Struts2.1.x.

Предполагая Struts 2.1.x, лучший способ - назначить атрибут var и использовать его как переменную (как вы уже предложили)

<s:iterator value="bar" var="foo">
    <s:if test="#foo==null || #foo==''">0</s:if>
</s:iterator>

Вы также можете использовать переменную top для получения верхнего значения стека, но это может привести к конфликту с атрибутами ваших объектов. Тем не менее это работает

<s:iterator value="bar">
    <s:if test="top==null || top==''">0</s:if>
</s:iterator>

Но если вам нужно только напечатать результат String без условий, будь то null или пустой, просто сделайте это так же просто, как это

<s:iterator value="bar">
    <s:property /> <!-- prints iterator current value or '' if its null -->
</s:iterator>

Пс. Нет необходимости использовать разметку ognl %{} внутри атрибута test для s:if или атрибута value для s:property.

Дополнительные примеры см. в документе по итератору struts2.

person I.G. Pascual    schedule 15.04.2011

Вы можете сделать это в одной строке (один оператор if):

<s:property value="%{col==null ? '0':col}"/></s:else>

Или добавьте больше строки

<s:property value="%{col==null ? '0': 'The column is' + col}"/></s:else>
person Alireza Fattahi    schedule 08.08.2016

Я решил свою проблему.

<s:if test="%{#col==''}">0 </s:if>

Значение в массиве строк было не нулевым, а пустой строкой.

person Farmor    schedule 20.08.2010

Для этого внутри итератора в Struts2; внутри «Тестового предложения» используйте «#» для ссылки на переменную контекста.

            <s:iterator value="pageVo.voList" var="vo">
                    <s:if test="%{#vo.iconclass != null}">
                        <i class="${vo.iconclass}"></i>
                    </s:if>
                    <s:if test="%{#vo.label != null}">
                        ${vo.label}
                    </s:if>
                </button>
            </s:iterator>
person Dan    schedule 16.05.2017