Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struts 2: конвертеры 
V
    Опции темы
MaxPayneC
Дата 10.3.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Суть проблемы в следующем - если передан массив, то есть в урл или посте есть что-то вроде ...&value=v1&value=v2&value=v3&..., то конвертер должен корректно обрабатывать массив значений.

В связи с этим предлагается реализация конвертера (в примере строк в даты):
Код

public class DateConverter extends StrutsTypeConverter
{
        /**
         * Метод конвертирует строку с датой в java.util.Date. Валидными считаются даты, имеющие формат дд.мм.гггг
         *
         * @param context - Контекст вызова
         * @param value   - Массив со значениями, которые необходимо конвертировать
         * @param toType  - Тип, к которому необходимо привести строку
         * @return - Объект типа java.util.Date, содержащий дату, полученную в результате конвертации.
         * @throws TypeConversionException в случае недопустимой даты на входе
         */
        @Override
        public Object convertFromString(Map context, String[] value, Class toType) throws TypeConversionException
        {
                if (toType.equals(Date.class))
                {
                        try
                        {
                                SimpleDateFormat dfDate = new SimpleDateFormat("dd.MM.yyyy");
                                Object[] result = new Object[value.length];

                                for (int i = 0; i < value.length; ++i)
                                {
                                        result[i] = dfDate.parse(value[i]);
                                }

                                return result;
                        }
                        catch (ParseException ex)
                        {
                                throw new TypeConversionException("Недопустимый формат даты.");
                        }
                }

                throw new IllegalArgumentException("Недопустимый класс запрошен для конвертации.");
        }

        /**
         * Конвертирует объект в строку вида дд.мм.гггг
         *
         * @param context Контекст вызова
         * @param o       Объект, строковое представление которого необходимо получить.
         * @return Строковое представление объекта.
         */
        @Override
        public String convertToString(Map context, Object o)
        {
                SimpleDateFormat dfDate = new SimpleDateFormat("dd.MM.yyyy");
                return dfDate.format((Date) o);
        }
}

Но, если использовать такую реализацию, в экшн не приходят даты. А если в 27й строке написать return result[0], то есть забить на массив и возвращать вместо Date[] Date, все работает замечательно. Возникают вопросы:
1. Что делать с массивами значений?
2. Как правильно писать конвертеры?

Буду признателен за критику моей реализации конвертера)
PM   Вверх
MisterCleric
Дата 11.3.2010, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет. Я бы на твоем месте не заморачивался и действовал так:
1. Принимал в Action массив строк
2. Первым методом в методе execute использовал бы простую конвертацию строк в даты и перегонкой в новый массив.


Где-то я читал, что необходимо быть внимательным при реализации конвертера дат. Что и как уже не помню...


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MaxPayneC
Дата 11.3.2010, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Нужно реализовать этот функционал именно в конвертере, в каждом экшне это не вариант. Причем конвертер должен адекватно работать и для случая одной строки, и для случая массива строк. Это реально сделать?
PM   Вверх
MisterCleric
Дата 11.3.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Слушай, так вот документация пишет, что все должно быть ок:
Type convert


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MaxPayneC
Дата 11.3.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Не нашел в этой статье ответа на вопрос из первого поста..
PM   Вверх
MisterCleric
Дата 11.3.2010, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Почему это нет? Там идет речь об автоконвертации массивов и их элементов. Просто строки дат должны принимать определенный формат, что бы корректно сконвертися. И там же написано, как построить свой конвертер, как его настроить и куда положить. И исходники говорят о том же:
XWorkBasicConverter


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MaxPayneC
Дата 16.3.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 3
Всего: 9



Вопрос снят. Конвертер, возвращающий один объект, адекватно работает и для объявленных в экшне массивов.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0686 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.