Отправьте выбор тега ‹s:radio› с атрибутом, отличным от отображаемого

Для простоты я определю сценарий следующим образом: класс Person определяет объект с атрибутами id (int) и name (String). Я создал List<Person> persons, которые загружаются на страницу JSP с помощью соответствующего метода класса Action (getPersons()), чтобы заполнить тег <s:radio>. Пока все хорошо, JSP соответственно заполняет <s:radio>. Я могу выбрать и отправить вариант в класс действий (определенный в элементе <form> JSP). Моя проблема в том, что я могу отправить только имя выбранного человека в <s:radio>, тогда как я действительно хочу отправить id человека. Как мне это сделать?

Практический пример: у меня есть 2 человека в списке <s:radio>, Джон (с ID=1) и Питер (с ID=2). Я хочу отобразить их имена в элементе <s:radio>, но если я выберу Peter, я хочу отправить 2 в класс действия вместо его имени.

Код ниже:

JSP

<form action="submitData" class="ink-form all-100 small-100 tiny-100" method="post">
    <s:radio label="persons" name="personId" list="persons.{name}" />
</form>

Класс действия (действие submitData)

public class SubmitData extends ActionSupport
{
    private String personId;

    public String execute()
    {
        System.out.println("Person ID: "+personId);

        return SUCCESS;
    }

    public void setPersonId(String PersonId)
    {
        this.personId = personId;
    }
}

person João Fernandes    schedule 14.07.2015    source источник


Ответы (1)


В OGNL этот persons.{name} называется проекцией, и он вам не нужен в теге <s:radio>. Используйте атрибуты listKey и listValue, чтобы определить, какие свойства объектов внутри списка будут отображаться, а какие отправлены.

<s:radio label="persons" name="personId" list="persons" listKey="id" listValue="name" />

Еще кое-что. Человек id является int, и вы пытаетесь отправить его personId, который является строкой. Конечно, это сработает, но рассмотрите возможность замены personId на int. Таким образом, позже, когда вы захотите получить объект Person из базы данных, вам не нужно будет преобразовывать String обратно в int.

person Aleksandr M    schedule 14.07.2015
comment
Ранее я пытался использовать как listKey, так и listValue безуспешно (и спасибо, что указали на неправильный тип personId, кстати!). Еще одно сомнение: теперь у меня проблемы с предустановкой значения <s:radio> (с атрибутом value). Раньше я вызывал метод getDefaultPersonName() в классе действий (что-то вроде value="defaultPersonName"), и он работал, но после того, как я начал использовать эти новые 2 атрибута, он исчез. Вы знаете, как я могу это исправить? (и если вы найдете это более подходящим, я могу задать новый вопрос) - person João Fernandes; 15.07.2015
comment
@jaff: Теперь вы отправляете id вместо name, поэтому value также должно быть id. - person Aleksandr M; 15.07.2015