1. Значение преобразования типов
Для интеллектуальной инфраструктуры MVC неизбежно реализовать преобразование типов. Поскольку параметры запроса приложений структуры B/S (браузер/сервер) отправляются на сервер через браузер, эти параметры не могут иметь расширенные типы данных, поэтому тип данных. преобразование должно быть завершено на стороне сервера
Платформа MVC представляет собой решение уровня представления и должна обеспечивать поддержку преобразования типов. Struts2 обеспечивает очень мощную поддержку преобразования типов.
2. Обработка данных уровня представления.
1. В веб-приложениях уровень представления в основном используется для взаимодействия с пользователями, включая сбор вводимых пользователем данных и представление пользователям статуса сервера. Таким образом, поток данных на уровне представления в основном имеет два направления: входные данные и выходные данные.
2. Для входных данных: необходимо выполнить преобразование строковых данных в несколько типов данных. Программа обычно не может быть завершена автоматически и ее необходимо вручную преобразовать в код.
3. Для выходных данных: как Java, так и JSP поддерживают прямой вывод нескольких типов данных.
4. Еще одна обработка данных на уровне представления: проверка данных, которая разделена на проверку клиента и проверку на стороне сервера. Это будет подробно объяснено позже.
3. Преобразование типов
1. Все параметры HTTP являются строковыми типами. Сохраненные данные могут быть строкой, числом, логическим значением, датой и временем и т. д. или типом JavaBean. Преобразование типа вручную, например преобразование строки в дату, путем: получения строки с помощью метода request.getParameter; проверки того, является ли она пустой; преобразования строки в объект Date с помощью метода DateFormat.parse;
2. Преобразование типов Struts2
Встроенное преобразование типов Struts2
Строковые и логические значения завершают преобразование между строковыми и логическими значениями.
Преобразование строк и символов между обычными строками и символами
String, int и Integer завершают преобразование строк и целых чисел.
String и Long завершают преобразование между строковыми и длинными целочисленными значениями.
String, double и Double завершают преобразование строк и значений с плавающей запятой двойной точности.
String и Float завершают преобразование между строками и числами с плавающей запятой одинарной точности.
Строка и дата завершают преобразование между строковыми типами и типами даты. Формат даты использует формат SHORT языкового стандарта, который запрашивает пользователь.
Строка и массив. По умолчанию элементом массива является строка. Если пользователь определяет преобразователь типов, это также могут быть другие составные типы данных.
Строка, карта и список
Встроенное преобразование типов Struts2
Строковые и логические значения завершают преобразование между строковыми и логическими значениями.
Преобразование строк и символов между обычными строками и символами
String, int и Integer завершают преобразование строк и целых чисел.
String и Long завершают преобразование между строковыми и длинными целочисленными значениями.
String, double и Double завершают преобразование строк и значений с плавающей запятой двойной точности.
String и Float завершают преобразование между строками и числами с плавающей запятой одинарной точности.
Строка и дата завершают преобразование между строковыми типами и типами даты. Формат даты использует формат SHORT языкового стандарта, который запрашивает пользователь.
Строка и массив. По умолчанию элементом массива является строка. Если пользователь определяет преобразователь типов, это также могут быть другие составные типы данных.
Строка, карта и список
3. Встроенное преобразование типов.
4. API преобразования типов Struts
Преобразователь типов Struts2 фактически реализован на основе OGNL. В проекте OGNL есть интерфейс ognl.TypeConverter. Этот интерфейс необходимо реализовать для реализации преобразователя типов. Интерфейс определен следующим образом:
общедоступный интерфейс TypeConverter {
общедоступный объект ConvertValue (Map arg0, Object arg1, Member arg2, String arg3,
Объект arg4, класс arg5) {
вернуть ноль;
}
Чтобы реализовать преобразователь типов, необходимо реализовать описанный выше TypeConverter. Однако методы в приведенном выше интерфейсе слишком сложны, поэтому проект OGNL также предоставляет класс реализации этого интерфейса: ognl.DefaultTypeConverter. Вы можете реализовать свой собственный преобразователь типов. наследующий этот класс. Класс определяется следующим образом:
публичный класс DefaultTypeConverter расширяет объект, реализует TypeConverter{
public Object ConvertValue (Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//Другие методы
}
Роль метода ConvertValue заключается в завершении преобразования типа, но это преобразование типа является двунаправленным. Когда строку необходимо преобразовать в экземпляр объекта, этот метод также используется. использовал. Это преобразование выполняется с помощью типа параметра toType, который является целевым типом, который необходимо преобразовать. Таким образом, направление преобразования можно определить на основе параметра toType.
Параметры метода ConvertValue и возвращаемое значение. Первый параметр: context — это контекст среды преобразования типов. Второй параметр: value — это параметр, который необходимо преобразовать. Значение параметра value также различается в зависимости от направления преобразования.
Третий параметр: toType — это преобразованный целевой тип. Возвращаемое значение этого метода — это значение после преобразования типа. Тип значения также меняется в зависимости от направления преобразования. Видно, что преобразованный метод ConvertValue принимает значение, которое необходимо преобразовать, целевой тип, который необходимо преобразовать, является параметром, а затем возвращает преобразованное целевое значение.
Почему Value представляет собой строковый массив?
Конвертер DefaultTypeConverter должен учитывать наиболее распространенную ситуацию, поэтому он обрабатывает все параметры запроса как строковые массивы, а не строки. Эквивалентно значениям параметров, полученным методом getParameterValues().
4. Реализация преобразователя типов
1. Страница регистрации первого шага
2. Второй шаг: реализация класса инкапсуляции User.
3. Третий шаг: реализация класса Action.
5. Шаг 5. Зарегистрируйте преобразователь типов. Существует три метода регистрации:
1. Зарегистрируйте преобразователь локального типа: преобразователь локального типа работает только со свойствами определенного действия.
2. Зарегистрируйте преобразователь глобального типа. Преобразователь глобального типа будет применяться ко всем конкретным атрибутам действия.
3. Используйте аннотации JDK1.5 для регистрации преобразователя типов: создайте преобразователь типов посредством регистрации.
6. Формат имени файла регистрации регистрации конвертера частичного типа: ActionName-conversion.properties: ActionName — это имя класса действия, для которого преобразователь должен вступить в силу, а следующая строка -conversion.properties — это типичный файл свойств при исправлении части или дополнительная часть файла. Он состоит из пар ключ-значение. Содержимое файла: propertyName = класс преобразователя типов. Ниже приводится содержимое файла UserAction-conversion.properties.
#Укажите, что атрибут пользователя в UserAction должен использовать класс redarmy.user.UserConverter для завершения преобразования типа
пользователь = redarmy.user.UserConverter
Примечание. Приведенный выше файл свойств должен находиться в том же пакете, что и UserAction. То есть в приведенном выше случае описанный выше метод можно использовать для достижения локального преобразования типов.
7. Формат регистрационного имени преобразователя глобального типа: файл xwork-conversion.properties. Этот файл также является файлом свойств, и его содержимое также состоит из элемента «составной тип = соответствующий класс преобразователя типов».
Ниже приводится содержимое файла xwork-conversion.properties:
#Укажите преобразователь типов всех классов redarmy.user.User как redarmy.user.UserConverter
redarmy.user.User=redarmy.user.UserConverter
Примечание. Файл xwork-conversion.properties должен быть создан в папке класса, то есть в src.
5. Преобразование пользовательского типа Struts2
Класс StrutsTypeConverter предоставляется в Struts2 для упрощения разработки пользовательского преобразования типов. Этот класс имеет два абстрактных метода, которые необходимо реализовать.
(1) общедоступный объект ConvertFromString (контекст карты, значения String [], класс toClass);
Параметры метода обработки, используемые для преобразования данных типа String в пользовательские типы:
context --- контекстная информация, связанная с действием.
значения --- значения параметров, полученные из запроса
toClass --- целевой тип для преобразования
(2) общедоступная строка ConvertToString (контекст карты, объект Object);
Используется для преобразования пользовательских типов в String.
параметр:
context --- контекстная информация, связанная с действием.
obj --- объект пользовательского типа
Пример анализа: проектирование и настройка преобразования типа даты
(1) Создайте MyDateTypeConverter, унаследуйте StrutsTypeConverter и опишите два его метода. Справочный код выглядит следующим образом:
public Object ConvertFromString (контекст карты, значения String [], класс toClass) {
SimpleDateFormat sdf = новый SimpleDateFormat("гггг-ММ-дд");
пытаться{
Дата v = sdf.parse(значения[0]);
вернуть v;
}catch(Исключение е){
е.printStackTrace();
вернуть новую дату();
}
}
Продолжение
public String ConvertToString (контекст карты, объект Object) {
SimpleDateFormat sdf = new SimpleDateFormat("гггг год ММ месяц дд день");
Дата v = (Дата)объект;
вернуть sdf.format(v);
}
Хотя Struts2 по умолчанию поддерживает преобразование строк и дат, он поддерживает только преобразование короткого формата и локализованного формата даты, что может не соответствовать вашим потребностям. Нам необходимо реализовать собственное преобразование типов.
(2) Добавьте атрибут дня рождения в класс UserInfo, тип которого — java.util.Date.
общественный класс UserInfo {
частный целочисленный идентификатор;
частное имя строки;
личный строковый пароль;
личная дата рождения;
...
}
(3) Настройте преобразователь типов для компонента UserInfo. Сначала создайте файл свойств на основе имени класса компонента UserInfo. Формат имени файла — имя класса-преобразование.свойства.
Например UserInfo-conversion.properties
Этот файл должен находиться в том же пакете, что и компонент UserInfo.
Формат содержимого этого файла функций следующий:
день рождения=demo.converter.MyDateTypeConverter
проиллюстрировать:
день рождения — это имя атрибута типа java.util.Date в компоненте UserInfo.
demo.converter.MyDateTypeConverter — это собственный класс реализации преобразования.
Платформа Strus2 учитывает это и предоставляет простой способ справиться с этим.
Чтобы настроить преобразователь типов на глобальном уровне, просто напишите файл свойств с именем xwork-conversion.properties, который должен находиться в каталоге /WEB-INF/classes, со следующим содержимым:
java.util.Date=demo.converter.MyDateTypeConverter
6. Конвертер нестандартных типов
Свойства типа java.util.Date могут получать значения параметров запроса в формате 2009-07-20. Но если нам нужно получить параметры запроса в формате 20091221, мы должны определить преобразователь типов, иначе struts2 не сможет автоматически завершить преобразование типов.
импортировать java.util.Date;
публичный класс HelloWorldAction {
частная дата, время создания;
публичная дата getCreatetime() {
вернуть время создания;
}
public void setCreatetime (Date createtime) {
this.createtime = время создания;
}
}
публичный класс DateConverter расширяет DefaultTypeConverter {
@Override public Object ConvertValue (контекст карты, значение объекта, класс toType) {
SimpleDateFormat dateFormat = новый SimpleDateFormat("ггггММдд");
пытаться {
if(toType == Date.class){//Когда строка преобразуется в тип даты
String[] params = значение (String[]);// Request.getParameterValues()
вернуть dateFormat.parse(params[0]);
}else if(toType == String.class){//Когда дата преобразуется в строку
Дата дата = значение (Дата);
вернуть датуFormat.format(дата);
}
} catch (ParseException e) {}
вернуть ноль;
}
}
Зарегистрируйте вышеуказанный преобразователь типов как локальный преобразователь типов:
Поместите файл ActionClassName-conversion.properties в пакет, в котором расположен ActionClassName, — это имя класса Action, а следующий параметр —conversion.properties — это фиксированный метод записи. В этом примере имя файла должно быть таким. HelloWorldAction-conversion.properties. Содержимое файла свойств:
Имя свойства = полное имя класса преобразователя типов. В этом примере содержимое файла HelloWorldAction-conversion.properties следующее:
createtime= cn.csdn.conversion.DateConverter
Зарегистрируйте приведенный выше преобразователь типов в качестве преобразователя глобального типа:
Поместите файл xwork-conversion.properties в папку WEB-INF/classes. Содержимое файла свойств:
Преобразуемый тип = полное имя класса преобразователя типов. В этом примере содержимое файла xwork-conversion.properties:
java.util.Date= cn.csdn.conversion.DateConverter
Свойства типа java.util.Date могут получать значения параметров запроса в формате 2009-07-20. Но если нам нужно получить параметры запроса в формате 20091221, мы должны определить преобразователь типов, иначе struts2 не сможет автоматически завершить преобразование типов.
импортировать java.util.Date;
публичный класс HelloWorldAction {
частная дата, время создания;
публичная дата getCreatetime() {
вернуть время создания;
}
public void setCreatetime (Date createtime) {
this.createtime = время создания;
}
}
публичный класс DateConverter расширяет DefaultTypeConverter {
@Override public Object ConvertValue (контекст карты, значение объекта, класс toType) {
SimpleDateFormat dateFormat = новый SimpleDateFormat("ггггММдд");
пытаться {
if(toType == Date.class){//Когда строка преобразуется в тип даты
String[] params = значение (String[]); // Request.getParameterValues()
вернуть dateFormat.parse(params[0]);
}else if(toType == String.class){//Когда дата преобразуется в строку
Дата дата = значение (Дата);
вернуть датуFormat.format(дата);
}
} catch (ParseException e) {}
вернуть ноль;
}
}
Зарегистрируйте вышеуказанный преобразователь типов как локальный преобразователь типов:
Поместите файл ActionClassName-conversion.properties в пакет, в котором находится ActionClassName, — это имя класса Action, а следующий параметр —conversion.properties — это фиксированный метод записи. В этом примере имя файла должно быть таким. HelloWorldAction-conversion.properties. Содержимое файла свойств:
Имя свойства = полное имя класса преобразователя типов. В этом примере содержимое файла HelloWorldAction-conversion.properties следующее:
createtime= cn.csdn.conversion.DateConverter
Зарегистрируйте приведенный выше преобразователь типов в качестве преобразователя глобального типа:
Поместите файл xwork-conversion.properties в папку WEB-INF/classes. Содержимое файла свойств:
Преобразуемый тип = полное имя класса преобразователя типов. В этом примере содержимое файла xwork-conversion.properties:
java.util.Date= cn.csdnconversion.DateConverter