Электронный магазин на Java и XML

         

Начало кода класса Product (Product.java)



Листинг 6.17. Начало кода класса Product (Product.java)

package com.XmlEcomBook.Chap06; import java.io.*; import java.util.*; import java.text.*; import org.w3c.dom.*; public class Product { private String id; private String keywords; private String name; private Vector authors = new Vector();
private Vector artists = new Vector();
private String description; private double price; private Integer discount; private int quantityInStock; private Vector images = new Vector();
private DateTime onSaleDate = new DateTime();
private Vector clips = new Vector();

Посмотрев на определения полей, вы можете заметить, что одно из них вам незнакомо. Для поля discount не имеется соответствующего дочернего элемента или атрибута в элементе product. Так получилось потому, что элемент price довольно-таки просто устроен — он содержит данные типа PCDATA и один атрибут discount, как показано ниже:

<!ELEMENT price (#PCDATA)>
<!ATTLIST price discount CDATA #IMPLIED>

Вместо того чтобы создавать для этого элемента новый класс всего лишь с двумя полями, мы включим оба этих поля прямо в класс Product. Поле discount имеет тип Integer. В данном случае мы не можем задействовать примитивный тип int, так как элемент discount является необязательным и может отсутствовать. В такой ситуации нужно воспользоваться объектом null типа Integer.

Другое отличие связано с полем description. В DTD это поле было представлено следующим образом:

<!ENTITY % running_text "(#PCDATA|bold|italics| quote|link|general)*">
<!ELEMENT description (paragraph|general)* >


<!ELEMENT paragraph %running_text;>
<!ELEMENT bold (#PCDATA)>
<!ELEMENT italics (#PCDATA)>
<! ELEMENT quote (#PCDATA)>
<!ATTLIST quote attrib CDATA #IMPLIED>
<!ELEMENT link (#PCDATA)>
<!ATTLIST link href CDATA «REQUIRED alt CDATA #IMPLIED>
<!ELEMENT general (#PCDATA)>
<!ATTLIST general type CDATA #REQUIRED>

Это сложная модель содержимого, включающая большое количество дочерних элементов, которые могут повторяться в произвольном порядке, что приводит к следующим двум затруднениям. Первое связано с представлением поля description в Java-программе. Вам нужно было бы создать класс description, которому можно передать объекты paragraph и general, а затем этот класс снова должен был бы получать к ним доступ. Сам класс Paragraph был бы классом сложного типа, способным содержать любой из своих пяти дочерних элементов и текстовых элементов. Второе затруднение связано с отображением всех этих данных в виде, допускающем редактирование. Было бы очень трудно отобразить эту структуру в формате HTML. Мы решили упростить обработку этих элементов.

Если вы посмотрите на определения полей в классе Product, вы увидите, что тип description определен как String. Вместо того чтобы копировать структуру элемента description, мы предпочли просто хранить ее в виде необработанной строки XML, то есть в виде простого текста, содержащего символьные данные вместе с разметкой. Когда нам потребуется предоставить пользователю описание товара (содержимое элемента description), мы просто отобразим необработанный текст XML, который и будет редактироваться пользователем.

Для класса Product предусмотрены два конструктора, показанные в листинге 6.18. Первый из них не имеет никаких аргументов и используется для создания нового элемента Product. Другому конструктору передается объект DOM Element, и на основе исходного кода XML конструктор создает объект Product. Конструктор сначала получает два атрибута, id и keywords, из элемента product. Для остальных полей созданы методы для извлечения всех элементов, дочерних по отношению к элементу product.



Содержание раздела