ИСПОЛЬЗОВАНИЕ ТЕХНОЛОГИИ JAXB ПРИ РАЗРАБОТКЕ XML ПРИЛОЖЕНИЙ CERN – European Organization for Nuclear Research IT Department – e-Business Section Afonin.

Презентация:



Advertisements
Похожие презентации
WORK WITH XML-files in Java Для студентов старших курсов университетов Ст.преподаватель Дудник О.А.
Advertisements

Практическое программирование на Java к.ф.-м.н. Козлов Дмитрий Дмитриевич Кафедра АСВК, Лаборатория Вычислительных комплексов.
Test 14 Вопрос 1. class Main { public void method() { static class One { public One() { System.out.println("From one"); } } public static void main(String...
Test 17 Вопрос 1. public class TKO { public static void main(String[] args) { String s = "-"; Integer x = 343; long L343 = 343L; if (x.equals(L343)) s.
Hibernate&EJB3 Studybook For students of university Author Sr.Java developer Dudnik Oxana.
Test 5 Вопрос 1. В результате компиляции каких строк будет происходить ошибка компиляции: public class Main { public static void main(String[] args) {
Интерфейсы в Java. Интерфейсы Множественное наследование не допускается при помощи классов Допускается множественное наследование при помощи интерфейсов.
Saint Petersburg, 2011 Java Lecture Generics. Quiz ArrayList lst = new ArrayList(); Collection c = lst; lst.add("one"); lst.add(two"); lst.add(three");
Test 9 Вопрос 1. public class A { private String runNow() { return "High"; } static class B extends A { public String runNow() { return "Low"; } } public.
Class Date { private int year = 0; private int month = 0; private int day = 0; public void SetDate (int y, int m, int d) { year = y; month = m; day = d;
Абстрактные типы данных 1. Абстрактная дата Date dt1, dt2; dt1 = new Date(1, Date.MARCH, 2006); dt2 = (Date)dt1.clone(); dt2.add(300); //
Test 4 Вопрос 1. public class TestOutput { public static void main(String[] args) throws IOException { PrintStream out = new PrintStream( new BufferedOutputStream(
Test15 Вопрос 1. class AClass { } public class Test { public static void main (String... args) { ArrayList a = new ArrayList (); AClass aaaClass = new.
Test 16 Вопрос 1. class Clazz { { System.out.println("non-static init"); } public static void main(String a[]) { System.out.println("main"); Clazz ob1.
Work with server by XMLRPC – library in Java For students Author: Dudnik Oxana.
Современные языки и технологии программирования Использование XML.
Test 3 Вопрос 1. 01:package test; 02: public class Test { 03: public static void main(String [] args) { 04: Test test = new Test(); 05: System.out.println(test.toString());}
Обработка исключительных ситуаций, работа с файлами Исключительные ситуации Классы File, InputStream, RandomAccessFile, FileReader, BufferedReader, BufferedWriter,
Синтаксис языка Java. Символы и синтаксис Перевод строчки эквивалентен пробелу Регистр в именах различается.
Java Collections Framework (JCF) in Java Tutorial for students of universities Author: Oxana Dudnik.
Транксрипт:

ИСПОЛЬЗОВАНИЕ ТЕХНОЛОГИИ JAXB ПРИ РАЗРАБОТКЕ XML ПРИЛОЖЕНИЙ CERN – European Organization for Nuclear Research IT Department – e-Business Section Afonin Alexey, Derek Mathieson e-Business section, IT department CERN – Geneva, Switzerland

JAXBJAXB JAXB: The Java Architecture for XML Binding The Java Architecture for XML Binding Спецификация принята 8 Января 2003 года Спецификация принята 8 Января 2003 года Доступные реализации: SUN, является частью Java Web Services Developer Pack SUN, является частью Java Web Services Developer Pack Apache JAXME Apache JAXME

Архитектура JAXB

Пример: XML First Order First Order Second Order Second Order 20.2

Пример: XML Schema

Пример: Генерация Java классов Из командной строки: %jwsdp.home%\jaxb\bin\xjc.bat -p generated -d src simple-order.xsd -p generated -d src simple-order.xsd Из скрипта Ant:

Пример: сгенерированные Java классы OrdersListType.java public interface OrdersListType { java.util.List getOrder(); } OrderType.java public interface OrderType { double getAmount(); double getAmount(); void setAmount(double value); void setAmount(double value); java.lang.String getDescription(); java.lang.String getDescription(); void setDescription(java.lang.String value); void setDescription(java.lang.String value); java.util.Calendar getDate(); java.util.Calendar getDate(); void setDate(java.util.Calendar value); void setDate(java.util.Calendar value); long getNumber(); long getNumber(); void setNumber(long value); void setNumber(long value);}

Пример: работа с JAXB JAXBContext jaxbCtx = JAXBContext.newInstance("generated"); Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller(); OrdersListType orders = (OrdersListType)unmarshaller.unmarshal( = (OrdersListType)unmarshaller.unmarshal( new File("simple-order.xml")); new File("simple-order.xml")); List ordersList = orders.getOrder(); for (int i = 0; i < ordersList.size(); i++) { OrderType order = (OrderType)ordersList.get(i); System.out.println("Number = " + order.getNumber() + ", amount = " + order.getAmount()); }... Чтение из XML файла

Пример: работа с JAXB... ObjectFactory objectFactory = new ObjectFactory(); Order newOrder = objectFactory.createOrder(); newOrder.setNumber(2006);newOrder.setDate(Calendar.getInstance()); newOrder.setDescription("New Order"); newOrder.setAmount(100);orders.getOrder().add(newOrder); Marshaller marshaller = jaxbCtx.createMarshaller(); marshaller.marshal(orders, new FileOutputStream(new File("simple-order.xml"))); new FileOutputStream(new File("simple-order.xml"))); Изменение XML файла

Пакет Связывания Binding Framework

Пакет Связывания Основные операции: маршаллинг (marshalling) маршаллинг (marshalling) демаршаллинг (unmarshalling) демаршаллинг (unmarshalling) проверка (validation) проверка (validation) Класс javax.xml.bind.JAXBContext - "точка входа" в JAXB API public abstract class JAXBContext { static JAXBContext newInstance(String contextPath) static JAXBContext newInstance(String contextPath) static JAXBContext newInstance(String contextPath, static JAXBContext newInstance(String contextPath, ClassLoader contextPathCL) ClassLoader contextPathCL) abstract Unmarshaller createUnmarshaller(); abstract Unmarshaller createUnmarshaller(); abstract Marshaller createMarshaller(); abstract Marshaller createMarshaller(); abstract Validator createValidator(); abstract Validator createValidator();}

Проверка XML документа JAXB предоставляет три варианта проверки XML документа: во время демаршаллинга (unmarshall-time validation) во время демаршаллинга (unmarshall-time validation) по требованию (on-demand validation) по требованию (on-demand validation) "на лету" (fail-fast validation) "на лету" (fail-fast validation) public interface Validator { ValidationEventHandler getEventHandler() ValidationEventHandler getEventHandler() void setEventHandler(ValidationEventHandler handler) void setEventHandler(ValidationEventHandler handler) boolean validate(java.lang.Object subrootObject) boolean validate(java.lang.Object subrootObject) boolean validateRoot(java.lang.Object rootObject) boolean validateRoot(java.lang.Object rootObject)} Validator позволяет проверять объектное представление документа

ДемаршаллингДемаршаллинг public interface Unmarshaller { boolean isValidating() throws JAXBException; boolean isValidating() throws JAXBException; void setValidating(boolean b) throws JAXBException; void setValidating(boolean b) throws JAXBException; ValidationEventHandler getEventHandler() ValidationEventHandler getEventHandler() throws JAXBException; throws JAXBException; void setEventHandler(ValidationEventHandler handler) void setEventHandler(ValidationEventHandler handler) throws JAXBException; throws JAXBException; Object unmarshal(File file) throws JAXBException; Object unmarshal(File file) throws JAXBException; Object unmarshal(InputStream is) throws JAXBException; Object unmarshal(InputStream is) throws JAXBException; Object unmarshal(URL url) throws JAXBException; Object unmarshal(URL url) throws JAXBException; Object unmarshal(Source source) throws JAXBException; Object unmarshal(Source source) throws JAXBException; Object unmarshal(Node node) throws JAXBException; Object unmarshal(Node node) throws JAXBException; Object unmarshal(InputSource is) throws JAXBException; Object unmarshal(InputSource is) throws JAXBException;} Unmarshaller читает XML документ, выполняет его проверку и строит объектную модель

МаршаллингМаршаллинг Marshaller сохраняет объектную модель в XML документ public interface Marshaller { ValidationEventHandler getEventHandler() throws JAXBException; ValidationEventHandler getEventHandler() throws JAXBException; void setEventHandler(ValidationEventHandler handler) void setEventHandler(ValidationEventHandler handler) throws JAXBException; throws JAXBException; void marshal(Object o, OutputStream os) throws JAXBException; void marshal(Object o, OutputStream os) throws JAXBException; void marshal(Object o, Writer writer) throws JAXBException; void marshal(Object o, Writer writer) throws JAXBException; void marshal(Object o, Result result) throws JAXBException; void marshal(Object o, Result result) throws JAXBException; void marshal(Object o, Node node) throws JAXBException; void marshal(Object o, Node node) throws JAXBException; void marshal(Object o, ContentHandler ch) throws JAXBException; void marshal(Object o, ContentHandler ch) throws JAXBException; Node getNode(Object o) throws JAXBException; Node getNode(Object o) throws JAXBException; Object getProperty(String s) throws PropertyException; Object getProperty(String s) throws PropertyException; void setProperty(String s, Object o) throws PropertyException; void setProperty(String s, Object o) throws PropertyException; String JAXB_ENCODING = "jaxb.encoding"; String JAXB_ENCODING = "jaxb.encoding"; String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output"; String JAXB_FORMATTED_OUTPUT = "jaxb.formatted.output";}

Связывание XML схемы и Java Представления Binding XML Schema to Java Classes

Связывание имен: XML Java XML ИмяИмя КлассаИмя МетодаИмя Константы mixedCaseNameMixedCaseNamegetMixedCaseNameMIXED_CASE_NAME Answer42 getAnswer42ANSWER_42 name-with-dashesNameWithDashesgetNameWithDashesNAME_WITH_DASHES other_punct-charsOtherPunctCharsgetOtherPunctCharsOTHER_PUNCT_CHARS

Связывание составных типов данных Составной тип XML схемы Java интерфейс public interface PersonType { long getDepartmentId(); long getDepartmentId(); void setDepartmentId(long value); void setDepartmentId(long value); java.lang.String getName(); java.lang.String getName(); void setName(java.lang.String value); void setName(java.lang.String value); long getId(); long getId(); void setId(long value); void setId(long value);}

Свойства (Properties) Простое свойство (Simple Property) Вложенные компоненты XML схемы Java свойства java.lang.String getName(); void setName(java.lang.String value); Группа свойств (Collection Property) java.util.List getItem();

Перечисление (Type Safe Enumeration) Производный атомарный тип данных с ограничением типа «перечисление» Перечисление (Type Safe Enumeration) public class CountryType { private final String value; private final String value; protected CountryType(String v) { value = v; } protected CountryType(String v) { value = v; } public final static CountryType FRANCE public final static CountryType FRANCE = new CountryType("FRANCE"); = new CountryType("FRANCE"); public final static CountryType SWITZERLAND public final static CountryType SWITZERLAND = new generated.CountryType("SWITZERLAND"); = new generated.CountryType("SWITZERLAND");...}

Связывание встроенных типов данных Таблица соответствия встроенных типов (Simple Built-in Types) Тип данных XML схемы Тип данных Java xsd:stringjava.lang.String xsd:integerjava.math.BigInteger xsd:intint xsd:longlong xsd:decimaljava.math.BigDecimal xsd:floatfloat xsd:doubledouble xsd:booleanboolean xsd:bytebyte xsd:dateTimejava.util.Calendar xsd:anySimpleTypejava.lang.String

НаследованиеНаследование Наследование XML типов через ограничение (restriction) или расширение (extension) Java наследование

НаследованиеНаследование Наследование XML типов через ограничение (restriction) или расширение (extension) Java наследование public interface Address { java.lang.String getCity(); java.lang.String getCity(); void setCity(java.lang.String value); void setCity(java.lang.String value); java.lang.String getStreet(); java.lang.String getStreet(); void setStreet(java.lang.String value); void setStreet(java.lang.String value); java.lang.String getName(); java.lang.String getName(); void setName(java.lang.String value); void setName(java.lang.String value);} public interface USAddress extends Address { java.lang.String getState(); java.lang.String getState(); void setState(java.lang.String value); void setState(java.lang.String value); long getZip(); long getZip(); void setZip(long value); void setZip(long value);}

Переопределение Связывания Customizing JAXB Bindings

Зачем Переопределять? Стандартное связывания (Default Binding) Переопределение связывания: создание документации (Javadoc) создание документации (Javadoc) изменение правил именования изменение правил именования разрешить конфликтов имен разрешить конфликтов имен определить имена для констант перечислений определить имена для констант перечислений определять свои типы данных для атрибутов определять свои типы данных для атрибутов переопределять связывание встроенных типов переопределять связывание встроенных типов переопределять маршаллинг / демаршаллинг для пользовательских типов данных переопределять маршаллинг / демаршаллинг для пользовательских типов данных

Встроенное и Внешнее Переопределение Встроенное переопределение – внутри XML схемы Внешнее переопределение – отдельный файл * *

Использование Внешнего Переопределения Командная строка xjc –b xjc –b Скрипт Ant

Глобальные Переопределения [ collectionType = "collectionType" ] [ generateIsSetMethod= "true" | "false" | "1" | "0" ] [ enableFailFastCheck = "true" | "false" | "1" | "0" ] [ underscoreBinding = "asWordSeparator" | "asCharInWord" ] [ typesafeEnumBase = "typesafeEnumBase" ] [... ]*

Переопределения Уровня Схемы [ package ] [ package ] [... ]* [... ]*

Переопределения Типов Данных и Компонент [ implClass= "implClass" ] > [... ] [... ] Связывание Классов

[ printMethod= "printMethod" ]/> Переопределения Типов Данных и Компонент Преобразование типов данных Java XML

Пример Настройки Связывания version="1.0">...

Пример Настройки Связывания

Пример: Разрешение Конфликтов Имен cern.edh.cxml.objects.Money cern.edh.cxml.objects.MoneyType cern.edh.cxml.objects.Money cern.edh.cxml.objects.MoneyType

Пример: Преобразование Типов Данных package cern.edh.cxml; public class DateConverter { public static java.util.Date parseDateTz(String lexicalDate) throws ParseException {...} public static String printDateTz(java.util.Date date) {...} } package cern.edh.cxml; public class DateConverter { public static java.util.Date parseDateTz(String lexicalDate) throws ParseException {...} public static String printDateTz(java.util.Date date) {...} }

public interface CXMLType {... java.util.Date getTimestamp(); void setTimestamp(java.util.Date value); } public interface CXMLType {... java.util.Date getTimestamp(); void setTimestamp(java.util.Date value); } Пример: Преобразование Типов Данных

Пример: Перечисление public class DeploymentModeValue { public final static DeploymentModeValue PRODUCTION = new DeploymentModeValue(_PRODUCTION); public final static DeploymentModeValue TEST = new DeploymentModeValue(_TEST);... } public class DeploymentModeValue { public final static DeploymentModeValue PRODUCTION = new DeploymentModeValue(_PRODUCTION); public final static DeploymentModeValue TEST = new DeploymentModeValue(_TEST);... }

JAXB vs. JAXP JAXB следует использовать когда нужно: Создавать объектные представления данных XML Создавать объектные представления данных XML Обрабатывать только верные данные Обрабатывать только верные данные Преобразовывать данные к различным типам Преобразовывать данные к различным типам JAXP следует использовать когда нужно: Обрабатывать документы, построенные на различных DTD Обрабатывать документы, построенные на различных DTD Обрабатывать документы, которые не обязательно являются правильными Обрабатывать документы, которые не обязательно являются правильными Применять XSLT преобразования Применять XSLT преобразования Обрабатывать лишь отдельные части XML документа Обрабатывать лишь отдельные части XML документа

Использование JAXB Система Электронного Документооборота (EDH) Приложение электронной коммерции B2B: стандарт cXML стандарт cXML ~ 100 интерфейсов объектной модели ~ 100 интерфейсов объектной модели ~ 100 классов реализации ~ 100 классов реализации

Спасибо за внимание!

XML элемент XML элемент Java интерфейс элемента Тип элемента объявлен составным (Complex type definition): public interface PersonType {... {... } public interface Person extends javax.xml.bind.Element, PersonType extends javax.xml.bind.Element, PersonType{}

XML элемент XML элемент Java интерфейс элемента Тип элемента объявлен простым (Simple type definition): public interface Name extends javax.xml.bind.Element extends javax.xml.bind.Element{ java.lang.String getValue(); java.lang.String getValue(); void setValue(java.lang.String value); void setValue(java.lang.String value);}

Уровни Действия Переопределения Каждый следующий уровень по отношению к предыдущему: наследует наследует переопределяет переопределяет Глобальные Переопределения Схема Тип Данных Компонент