Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
16
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

4.1 Технология JAXB

Язык Java имеет множество инструменов для обработки документов в формате XML. Все они объединяются под общим название JAXP или Java Architecture for XML Processing. Нам, в данной дисциплине, интересна технология связывания объектов JAVA-классов с представлением в формате языка XML, исвестная как JAXB.

JAXB (Java Architecture for XML Binding) — технология, позволяющая ставить в соответствие JAVA-классы и XML-представления, предоставляет две основные возможности:

а) маршалинг JAVA-объектов в формат документа XML; б) демаршалинг из документа XML обратно в JAVA-объект.

Рассмотрим сначала инструментальную часть языка Java, а затем — проведем демонстрацию этого инструментария конкретным примером.

4.1.1 Программное обеспечение технологии JAXB

Маршалинг (Marshaling) — упорядочивание или — процесс преобразования информации (данных или двоичного представления объекта), хранящейся в оперативной памяти, в формат, пригодный для хранения или передачи.

Демаршалинг (Unmarshaling) — обратная операция распаковки из стандартного формата в форму, приемлемую для принимающего процесса, которая сходна с операцией десериализации.

JAXB API — инструментарий языка Java, определенный в пакете javax.xml.bind и предоставляющий набор интерфейсов и классов для создания XML-документов и генерации классов Java.

Общий набор инструментов JAXB API представлен в таблице 4.1.

Центральное место в рассматриваемой технологии JAXB API занимает класс javax.xml.bind.JAXBContext, который и управляет связыванием между XML-документами и объектами Java.

Класс JAXBContext, с помощью метода newInstance(<класс>), предоставляет программисту объект контекста связывания, на основе которого формируются другие объекты преобразований. Например, для получения контекста класса Letter (см. листинг 3.1, стр. 134), необходимо выполнить:

JAXBContext context =

JAXBContext.newInstance(Letter.class);

176

Таблица 4.1 — Пакеты технологии JAXB [17]

Пакет

Описание пакета

javax.xml.bind

Фреймворк связывания среды выполнения, имеющий

 

возможность выполнять операции маршалин-

 

га, демаршалинга и проверки.

javax.xml.bind.annotation

Аннотации для настройки преобразований между

 

программой Java и XML-данными.

javax.xml.bind.annotation.

Классы-адаптеры JAXB.

adapters

 

javax.xml.bind.attachment

Выполнение маршалинга для оптимизации хранения

 

двоичных данных и демаршалинг корня документа,

 

содержащего форматы двоичных данных.

javax.xml.bind.helpers

Частичные стандартные реализации некоторых интерфейсов

 

javax.xml.binding.

javax.xml.bind.util

Набор вспомогательных классов.

На основе созданного объекта context можно создать еще два объекта типа Marshaller и Unmarshaller:

Marshaller marsh = context.createMarshaller();

Unmarshaller unmarsh = context.createUnmarshaller();

Дополнительно, объекту marsh можно установить свойство, требующее обеспечить вывод в формат XML в удобном читаемом виде, а не просто -вывод в виде текстовой строки:

marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

Теперь, используя методы объектов marsh и unmarsh, можно обеспечить преобразование объекта класса Letter в XML формат и обратно:

marsh.marshal(Letter letter, <объект вывода>);

Letter letter =

(Letter) unmarsh.unmarshal(<объект ввода>);

Обратите внимание, что методы marshal(...) и unmarshal(...) требуют указания объектов ввода и вывода.

177

Для вывода на терминал можно использовать объект System.out, а для вывода в файл — объект класса File.

Для чтения и восстановления объекта из XML-файла лучше использовать класс FileReader.

В общем случае, объектами чтения и записи являются потоки ввода/вывода InputStream и OutputStream.

4.1.2 Аннотации для связывания объектов Java

Правильное отображение JAVA-объекта в XML-представление требует использования аннотаций.

Полное описание технологии JAXB — достаточно объемно. Его можно найти по ссылке источника [26]. Наиболее важные аннотации, регулирующие правильное отображение объектов Java в XML-представление и достаточные для демонстрации простейших примеров, выборочно представлены в таблице 4.2.

Таблица 4.2 — Наиболее важные аннотации технологии JAXB [17]

Аннотация

Описание

@XmlRootElement(name)

Обязательная аннотация, необходимая любому классу для

 

связывания в качестве корневого элемента XML. Ставится

 

возле класса.

@XmlType(name, propOrder)

Аннотирует класс как комплексный тип в схеме XML.

 

Ставится возле класса. Позволяет задавать имя тега и

 

порядок отображения элементов.

@XmlElement(name)

Ставится около поля. Поле будет представлено в XML-

 

элементом. Позволяет задать имя для тэга.

@XmlAttribute(name)

Ставится около поля и оно будет представлено в XML-

 

атрибутом. Позволяет задать имя для атрибута.

@XmlElementWrapper(name,

Ставится около поля и позволяет задать обрамляющий тег

nillable = true)

для группы элементов. Позволяет задать имя для тэга.

@XmlJavaTypeAdapter(...)

Ставится около поля и позволяет задать класс, который

 

будет преобразовывать данные поля в строку.

@XmlTransient

Ставится возле поля и информирует JAXB, что не нужно

 

связывать атрибут.

Обратите внимание, что почти все аннотации имеют атрибут name, который позволяет изменить отображаемое имя поля или класса. Если этот атрибут не указан, то имя поля или класса не изменяется. Кроме того, если переменная класса имеет спецификатор доступа private, то аннотация ставится передсоответствующим публичным методом get*(...).

178

Если никакой атрибут перед полем не ставится, то имя поля не меняется и считается, что оно отображается как элемент.

Важно также отметить, что при отображении поля могут следовать не в том порядке, как они заданы в описании класса Java. Чтобы задать необходимый порядок отображения атрибутов, используется параметр propOrder аннотации @XmlType.

Для примера, рассмотрим класс Letter, представленный ранее на листинге 3.1 (стр. 134), в котором поля заданы в следующем порядке: id, date, name и text.

Допустим мы хотим, чтобы объект класса Letter отображался в XML-файл под корневым тегом <letter-object> и содержал приватную переменную id в качестве атрибута, а остальные приватные переменные date, name и text как элементы. Тогда исходный текст класса Letter должен быть аннотирован, как показано на листинге 4.1.

Листинг 4.1 — Аннотация класса Letter.java для отображения в XML

package rsos.lab5;

import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Date;

import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType;

@XmlType(propOrder={"date", "name", "text"}) @XmlRootElement(name="letter-object")

public class Letter implements Serializable

{

// Идентификатор сериализации

private static final long serialVersionUID = 1L;

// Поля данных класса Letter private int id;

private Date date; private String name; private String text;

/** * Конструкторы, геттеры, сеттеры и другие бизнес-методы */

public Letter() {

}

public Letter(Date date, String name, String text) { this.date = date;

this.name = name; this.text = text;

}

// Геттеры и сеттеры POJO-класса

179

@XmlAttribute

public int getId() { return id;

}

public void setId(int id) { this.id = id;

}

@XmlElement

public Date getDate() { return this.date;

}

public void setDate(Date date) { this.date = date;

}

@XmlElement

public String getName() { return name;

}

public void setName(String name) { this.name = name;

}

@XmlElement

public String getText() { return text;

}

public void setText(String text) { this.text = text;

}

// Дополнительные функции форматирования public String toString() {

return Integer.toString(id) + " " + date.toString() + " " + name + " " + text;

}

public String getDateString() { SimpleDateFormat sdf =

new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); return sdf.format(this.date);

}

}

В целом, заканчивая теоретическую часть изучения технологии JAXB, отметим, ее возможности — гораздо шире тех, что рассмотрены здесь. Для наших целей полученной информации — вполне достаточно, чтобы обеспечить теоретические и практические потребности изучения последующих тем. Студентам, желающим более подробно изучить технологию, рекомендуем воспользовантся документацией [26] или иным подходящим источником.

180