Нужен логический преобразователь Struts2 для Да, Нет, Пустые значения

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

<s:select key="invoice.productSold" list="${productSold}" />

ProductSold раскрывающийся список значений ''(пусто), 'Да', 'Нет'.

Мой логический преобразователь

public class BooleanConverter extends StrutsTypeConverter {

@Override
/*From form*/
public Object convertFromString(Map context, String[] values, Class toClass) {
        String value = values[0];
        if (value == "") {
            System.out.println("null");
                return null;
        }
        if ("No".equalsIgnoreCase(value) || "0".equals(value)) {
                return "false";
        } else if ("Yes".equalsIgnoreCase(value) || "1".equals(value)) {
                return "true";
        } else {
            return null;
        }
}

@Override
public String convertToString(Map context, Object o) {
        Boolean value = (Boolean) o;
        return String.valueOf(value);
}

}

public class Invoice{

Boolean productSold;
<getter>
<setter>
}

вопросы

  1. Моя выпадающая форма выбирает "Да" и обновляется; после обновления мой выпадающий список не показывает "Да". Отображается пустым.
  2. Метод ConvertFromString, возвращающий "true" при выборе "Да" в форме, и метод ConverToString, возвращающий "false".

Класс действий


public UpdateAction extends ActionSupport{
protected List<String> productSold;
public List<String> getProductSold() {
    List<String> myOptions= new ArrayList<String>();
       myOptions.add("");
       myOptions.add("Yes");
       myOptions.add("No");

    return myOptions;
}

2 ответа

Вам не нужен пользовательский логический преобразователь, используйте функцию интернационализации Struts2 для получения "хороших" текстов для логических выражений. Положил true = Yes а также false = No в свойствах ваших сообщений, а затем использовать listValue атрибут <s:select> тег для вызова getText метод получения сообщений для true а также false,

<s:select key="invoice.productSold" list="productSold" listValue="%{getText(top)}"/>

Кстати, вам не нужно использовать какие-либо "специальные" обозначения внутри list атрибут для получения значения из стека значений.

Кстати № 2: вам это не нужно productSold метод внутри вашего действия, вместо этого вы можете определить свой список да / нет прямо в JSP, используя нотацию OGNL для списков {...},

<s:select key="invoice.productSold" list='{"", true, false}' listValue="%{getText(top)}"/>

Попробуй это:

public UpdateAction extends ActionSupport{
    protected Map<Object, String> productSold;
    public Map<Object, String> getProductSold() {
        Map<Object, String> myOptions= new HashMap<>();
           myOptions.put(null, "");
           myOptions.put(Boolean.TRUE, "Yes");
           myOptions.put(Boolean.FALSE, "No");
        return myOptions;
}

И в JSP:

<s:select key="invoice.productSold" listKey="productSold.key"
          listValue="productSold.value"/>
Другие вопросы по тегам