Выражение времени выполнения Struts2 OGNL

Я проверяю список объектов. Чтобы показать пользователям, что они набрали неправильно, мне нужно повторно заполнить поля при ошибке преобразования. Я читал, что для повторного заполнения значений полей на странице мне нужно сделать что-то вроде этого:

<s:textfield name="user.name" value="%{user.name}"/>

Для повторного заполнения массива я должен обращаться к ним через индексы. Как упоминалось здесь: обновить список значений в текстовом поле в struts2< /а>

У меня есть список пользователей, которых мне нужно проверить. У меня есть собственный счетчик индексов на итераторе по определенной причине.

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
   <s:textfield name="users[%{#counter}].birthdate" value="%{users[#counter].birthdate}"/>
   <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>

Я использую валидатор посетителей для объекта User.

<field name="birthdate">
    <field-validator type="conversion">
        <param name="repopulateField">true</param>
            <message>${getText("E011", {"birthdate"})}</message>
    </field-validator>
</field>

Как я уже сказал, я не использую счетчик индекса итератора по определенной причине.

Проблема в том, что эта часть value="%{users[#counter].birthdate}" не работает. Если я изменю counter на 0, он повторно заполнит значение users[0].birthdate справа. Похоже, он не получает значение счетчика в выражении OGNL.

Я пробовал с:

value="%{users[counter].birthdate}"
value="%{users[%{#counter}].birthdate}"
...
and so on.

Может ли кто-нибудь помочь мне сделать эту работу?

ОБНОВЛЕНИЕ

В итоге я должен был упомянуть свой особый случай:

<s:iterator value="users" var="user" status="status">
  <s:if test="#status.index != removeIndex">

Я обнаружил, что мне не нужно указывать значение для имени поля, чтобы оно повторно заполняло значения. Но мне нужно было использовать это из-за этой строки:

<s:if test="#status.index != removeIndex">

Мне потребуется много усилий, чтобы объяснить, почему вы меня неправильно поняли. Можем ли мы удалить этот пост? Спасибо


person batbaatar    schedule 10.02.2012    source источник
comment
значение счетчика будет работать, чтобы указать свойство дня рождения объекта в вашем списке, например users.get(0).getBirthDay();, что означает, что счетчика на самом деле нет.   -  person Umesh Awasthi    schedule 10.02.2012
comment
Какова конкретная причина не использовать то, что уже доступно?   -  person Dave Newton    schedule 10.02.2012
comment
хотя мы можем использовать перехватчик Prepare, который позаботится о том, чтобы сделать значения доступными, даже если есть какая-либо ошибка, но все же я не думаю, что ваше значение индекса будет там. Почему вы используете индекс ?? может быть может быть другой альтернативный   -  person Umesh Awasthi    schedule 10.02.2012
comment
На самом деле даже я использую #status.index, я не могу заставить это работать. Я опускаю некоторые значения в своем списке, фильтруя индексы. Вот почему я использую свой альтернативный счетчик индексов   -  person batbaatar    schedule 10.02.2012


Ответы (2)


Будет лучше, если вы спросите, как что-то сделать... а не скажете, что у вас есть причина делать это таким образом, и, конечно же, этот способ не работает. Это вызывает у меня головную боль...

Я не понимаю этого...

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
   <s:textfield name="users[%{#counter}].birthdate" value="{users[counter].birthdate}"/>
   <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>

Я перепишу (без проверки), что я думаю, что вы имеете в виду...

<s:iterator value="users">
   <s:textfield name="users.birthdate" value="birthdate"/>
</s:iterator>

Вышеупомянутое требует, чтобы были выполнены следующие условия... а) что «пользователи» — это список типа «Пользователь» и б) чтобы среде преобразования struts2 было сказано, что пользователи — это список типа «Пользователь», который выглядит как просто добавить аннотацию, например: http://struts.apache.org/2.3.1.2/docs/keyproperty-annotation.html

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

Теперь, почему вы ожидаете, что значения формы будут повторно заполнены после того, как она не была отправлена? Вот как вы используете проверку? Если по какой-то причине вы этого не сделаете, вы создали некоторое сопоставление действий со значением INPUT или ERROR, чтобы вернуться на страницу ввода (своего рода пустая трата усилий, когда существует структура проверки).

person Quaternion    schedule 10.02.2012
comment
Извините, если я упрямый здесь. В нашей компании есть определенные правила, мы должны максимально избегать аннотаций. Таким образом, приложение может иметь масштабируемость. Вот почему я использую обозначения массива. Согласно пользовательским спецификациям, значения формы должны быть заполнены заново, если она не проходит проверку. Я не знаю, почему ваш пересмотренный код не работает в моем проекте. Может быть, аннотация, я думаю?. Я использую Struts 2.2.3 и Hibernate 4.0. Извините, если я здесь единственный упрямец - person batbaatar; 11.02.2012
comment
@batbaatar: как масштабируемость связана с аннотацией? - person Umesh Awasthi; 11.02.2012
comment
Я думаю, мы не хотим вводить постоянные строки в java, а скорее в XML в файлах свойств. - person batbaatar; 11.02.2012
comment
Аннотации делают вещи более читабельными, мне нравится xml, но для вещей, которые имеют более глобальные настройки. Установка констант struts2 или определение стеков перехватчиков имеет для меня наибольший смысл в struts.xml, имеет смысл объявлять мои службы spring с помощью xml. Но в приведенном примере struts2 будет предполагать, что значением списка является String или значением карты является String. Из-за стирания он не может знать лучше, поэтому вам нужно сообщить ему тип, аннотация имеет смысл. Но вы можете, если вы действительно хотите использовать файл свойств... вы увидите, как это делается в документации. - person Quaternion; 12.02.2012

Пожалуйста, попробуйте с приведенным ниже кодом, он может работать

<s:set name="counter" value="0"/>
<s:iterator value="users" var="user">
  <s:textfield name="users[#counter].birthdate" value="%{users[#counter].birthdate}"/>
  <s:set name="counter" value ="%{#counter + 1}"/>
</s:iterator>
person mini    schedule 10.02.2012
comment
Я так не думаю, мой счетчик работает правильно с другими тегами Struts. Когда я меняю счетчик на 0, он получает правильное значение users[0].birthdate. Когда я использую приведенный выше код, он ничего не показывает в поле. - person batbaatar; 10.02.2012
comment
У меня нет переменной с именем COUNTER на моем JAVA, может ли это вызвать эту проблему? - person batbaatar; 10.02.2012
comment
Что вы подразумеваете под исправленным ОГНЛ. Что не так с моим OGNL? - person batbaatar; 10.02.2012
comment
В порядке. Но этот правильный OGNL не работает в моем проекте. Как я уже говорил, если я поставлю постоянное значение следующим образом: value=%{users[0].birthdate}, оно получит правильное значение. Вот почему я не думаю, что с моим списком что-то не так. - person batbaatar; 10.02.2012
comment
@DaveNewton Извините, я не верю, что вы пробовали это на своем компьютере. Можете ли вы показать мне весь код, который вы использовали? Использование pastebin или что-то в этом роде. Может быть, я смогу понять свои ошибки, увидев ваши - person batbaatar; 10.02.2012