БЖД методичка. Метод указания лаб - последняя редакция (1). Методические указания к лабораторным работам СанктПетербург Издательство спбгэту лэти 2013
Скачать 1.15 Mb.
|
5.2. Выбор файла для записи или чтения Перед началом операции записи или чтения необходимо указать имя файла. Для выбора файла рекомендуется использовать класс FileDialog, оп- ределенный в пакете java.awt. Объект FileDialog это модальное окно с вла- дельцем типа Frame, содержащее стандартное окно выбора файла операци- онной системы для загрузки или сохранения файла. Конструктор FileDialog (Frame owner, String title, int mode) создает окно загрузки или со- хранения файла. Первый аргумент указывает фрейм, в котором должно ото- бразиться окно, второй – задает текст заголовка окна, третий определяет тип окна и имеет 2 значения: FileDialog.LOAD или FileDialog.SAVE. Можно установить начальный каталог для поиска файла и имя файла методами setDirectory (String dir) и setFile (String fileName). Вместо конкрет- ного имени файла fileName можно написать шаблон, например *.txt (первые символы, звездочка и точка), тогда в окне будут видны только имена файлов, заканчивающиеся точкой и словом txt. Визуализацию окна осуществляет метод setVisible с параметром true. Выбранные каталог и имя файла можно получить с помощью методов класса getDirectory () и getFile, которые возвращают выбранный каталог и имя фай- ла в виде строки string. Ниже приведен код для создания диалогового окна выбора файла для сохранения данных. FileDialog save = new FileDialog(bookList, "Сохранение данных", FileDialog.SAVE); save.setFile("*.txt"); save.setVisible(true); // Отобразить запрос пользователю // Определить имя выбранного каталога и файла String fileName = save.getDirectory + save.getFile(); if(fileName == null) return; // Если пользователь нажал «отмена» 30 Аналогичным образом будет выглядеть код создания диалогового окна выбора файла для чтения данных. Эти фрагменты должны быть вставлены соответственно в обработчики кнопки «save» и кнопки «open». 5.3. Сохранение текста в файле Для сохранения текста рекомендуется использовать буферизованный символьный поток записи. Если требуется сохранить табличные данные, то необходимо воспользоваться методами модели таблицы, позволяющими оп- ределить число строк и столбцов таблицы, а также извлечь значение из ячей- ки таблицы. Ниже приведен фрагмент кода по сохранению текстовых дан- ных таблицы (списка книг библиотеки) в файле: try { BufferedWriter writer = new BufferedWriter (new FileWriter(fileName)); for (int i = 0; i < model.getRowCount(); i++) // Для всех строк for (int j = 0; j < model.getColumnCount(); j++) // Для всех столбцов {writer.write ((String) model.getValueAt(i, j)); // Записать значение из ячейки writer.write("\n"); // Записать символ перевода каретки } writer.close(); } catch(IOException e) // Ошибка записи в файл { e.printStackTrace(); } Следует обратить внимание, что операции с файлом должны быть за- ключены в конструкцию try-catch с указанием в качестве исключительной ситуации IOException (ошибка ввода-вывода). В обработчике ошибки ввода- вывода можно воспользоваться методом printStackTrace(), который распеча- тает стек вызова исключения в стандартный поток ошибок. Стек вызова по- казывает последовательность вызова методов, которая привела к точке воз- никновения исключения. 5.4. Чтение текста из файла Для загрузки текста рекомендуется использовать буферизованный символьный поток чтения. Если данные загружаются в таблицу, то ее пред- варительно надо очистить с помощью метода модели removeRow(0). Ниже приведен фрагмент кода построчной загрузки в таблицу списка книг биб- лиотеки из файла. Этот фрагмент предполагает, что данные в файле разделе- ны символом перевода каретки (Enter): 31 try { BufferedReader reader = new BufferedReader(new FileReader(fileName)); int rows = model.getRowCount(); for (int i = 0; i < rows; i++) model.removeRow(0); // Очистка таблицы String author; do { author = reader.readLine(); if(author != null) { String title = reader.readLine(); String have = reader.readLine(); model.addRow(new String[]{author, title, have}); // Запись строки в таблицу } } while(author != null); reader.close(); } catch (FileNotFoundException e) {e.printStackTrace();} // файл не найден catch (IOException e) {e.printStackTrace();} 5.5. Порядок выполнения лабораторной работы 1. Создайте новый проект, который будет дублировать проект лабораторной работы № 4. 2. Проанализируйте разрабатываемое приложение и подготовьте в текстовом редакторе данные для его работы. 3. Напишите и добавьте в проект обработчики кнопок загрузки текста в файл и выгрузки из него. 4. Загрузите данные в экранную форму приложения. 5. Внесите изменения в загруженные данные и сохраните их в файле. 6. Просмотрите сохраненный файл и убедитесь в правильности работы приложения. 7. Сгенерируйте документацию с помощью Javadoc и просмотрите ее в браузере. 5.6. Содержание отчета Отчет по лабораторной работе должен содержать: 1. Распечатки содержимого файлов с данными до и после внесения изменений. 2. Скриншоты, иллюстрирующие процесс загрузки данных в файл и выгрузки из него. 3. Текст документации, сгенерированный Javadoc. 4. Фрагменты кода, отвечающие за сохранение и чтение данных из файла. 32 Лабораторная работа № 6. Обработка XML-документов Цель работы: знакомство с технологией обработки XML-документов и файлов. 6.1. Понятие XML-документа XML (extensible Markup Language, расширяемый язык разметки) это утвержденный стандарт разметки документов. Под понятием «разметка» бу- дем понимать расстановку тегов в документе, предназначенную для описания структуры документа. Тег это общее название для конструкций в угловых скобках. Структура XML-документа представляет собой дерево, в узлах ко- торого находятся элементы. Дерево элементов порождается вложением од- них элементов в другие, которые должны быть выполнены без перекрытий. Элементы определяются либо парными тегами (открывающим и закрываю- щим), либо одиночным тегом. Признаком конца одиночного тега являются символы />. Текст внутри открывающего и закрывающего тегов называется содержанием (значением) элемента. Дополнительную информацию об эле- менте можно указать с помощью атрибутов, которые не рассматриваются как потомки элемента. Они указываются в открывающем или одиночном теге по- сле имени элемента как имя_атрибута="значение". Следует иметь в виду, что каких-либо правил относительно того, какую информацию задавать в виде элемента, а какую в виде атрибута нет. Если в элементе содержится только текст, то такой узел называется текстовым. XML-документ может содержать комментарии, которые записываются между символами . В общем случае XML-документ должен удовлетворять следующим синтаксическим правилам: документ должен начинаться с заголовка, в котором могут указы- ваться 3 атрибута: номер версии Рекомендации XML, которой должен соот- ветствовать XML-документ, вид кодировки символов документа, признак ис- пользования внешних объявлений разметки; в документе должен быть один элемент, включающий в себя все дру- гие элементы, который называется корнем документа, или корневым элемен- том; каждый открывающий тег, определяющий некоторую область дан- ных в документе, обязательно должен иметь парный закрывающий тег; имена открывающего и закрывающего тегов должны совпадать, причем с учетом регистра. 33 В качестве примера ниже представлено описание XML-документа, в котором указывается список из двух книг библиотеки с использованием ат- рибутов автор книги, наличие в библиотеке и название книги: 6.2. Объектная модель XML-документа Объектная модель документа (DOM) задает интерфейсы, которые по- зволяют программе создавать, открывать и модернизировать структуру XML- документов. Объект языка программирования, который реализует такой ин- терфейс, называется XML-парсером. В языке Java для создания DOM- парсера используются классы DocumentBuilderFactory и DocumentBuilder, определенные в пакете javax.xml.parsers. Первый класс позволяет получить парсер, порождающий дерево объектов XML-документа, а второй создать пустой документ или документ по указанному XML-файлу. Метод newDocumentBuilder, порождающий парсер, может вызвать исключение ParserConfigurationException, если по какой-либо причине парсер не может быть создан. Поэтому фрагмент кода, связанный с порождением парсера, должен быть заключен в блок try-catch, чтобы перехватить это исключение. Ниже представлен фрагмент кода для построения парсера и пустого документа: import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; try { // Создание парсера документа DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); // Создание пустого документа Document doc = builder.newDocument(); } catch (ParserConfigurationException e) { e.printStackTrace(); } 34 6.3. Создание нового документа и запись его в XML-файл Объектная модель предоставляет множество удобных классов для соз- дания XML-документов. Эти классы хранятся в пакете org.w3.dom, и в них определены виртуальные методы DOM, с помощью которых строится дерево документа. Построение дерева начинается с корневого элемента, а затем в него включаются дочерние элементы и атрибуты. Значения элементов и ат- рибутов можно задавать либо константами, либо брать из полей экранной формы или объектов приложения. После завершения построения документа его содержимое сохраняется в файле. Ниже представлен фрагмент кода, где создается структура для хранения списка книг библиотеки, а значения атри- бутов элементов берутся из полей таблицы экранной формы, модель которой описана в лабораторной работе № 2. import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import java.io.File; // Создание корневого элемента booklist и добавление его в документ Node booklist = doc.createElement("booklist"); doc.appendChild(booklist); // Создание дочерних элементов book и присвоение значений атрибутам for (int i = 0; i < model.getRowCount(); i++) { Element book = doc.createElement("book"); booklist.appendChild(book); book.setAttribute("author", (String)model.getValueAt(i, 0)); book.setAttribute("title", (String)model.getValueAt(i, 1)); book.setAttribute("have", (String)model.getValueAt(i, 2)); } try { // Создание преобразователя документа Transformer trans = TransformerFactory.newInstance().newTransformer(); // Создание файла с именем books.xml для записи документа java.io.FileWriter fw = new FileWriter(“books.xml”); // Запись документа в файл trans.transform(new DOMSource(doc), new StreamResult(fw)); 35 } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Поскольку XML-данные являются просто текстом, их можно формати- ровать любым способом. Один из способов, который разработчики часто вы- бирают для сериализации XML-документа, заключается в его тождественном преобразовании без использования таблицы стилей. Например, для преобра- зования дерева объектов в документ, записываемый в файл, используют классы пакета javax.xml.transform. Вначале методом newlnstance создается экземпляр transFactory фабрики объектов-преобразователей, а затем с помо- щью фабрики преобразователей создается объект-преобразователь класса Transformer, который напрямую передает документ в файл. Следует обратить внимание, что необходимо заключить код создания преобразователя и запись в файл в конструкцию try-catch с указанием в ка- честве исключительных ситуаций TransformerConfigurationException (ошибка создания XML-преобразователя), TransformerException (ошибка ра- боты XML-преобразователя), IOException (ошибка ввода-вывода). 6.4. Чтение и разбор XML-файла Чтобы загрузить XML-файл в объектную модель, необходимо создать парсер и с помощью него построить в памяти XML-документ и проверить его корректность. Корректность проверяется методом normalize() и заключа- ется в нормализации текстового содержимого корневого узла дерева. Норма- лизация состоит в том, что пустые текстовые узлы удаляются, а соседние текстовые узлы сливаются в один. В результате остаются только текстовые узлы, разделенные какими-либо символами разметки (тегами, комментария- ми). Нормализованная форма элементов дерева обеспечивает неизменность его структуры при сохранении и загрузке файла. Если документ загружен, то приложение может двигаться по структуре для обзора, поиска и отображения информации. Для этого используются сле- дующие методы библиотечного класса org.w3c.dom: Element root =doc.getDocumentElement() – доступ к корневому эле- менту документа; NodeList children = elem.getChildNodes() – получить список дочерних узлов элемента; 36 NodeList nl = doc.getElementsByTagName(String tagname) – получить список узлов документа с указанным именем; Node elem = nl.item(index) – получить узел из списка элементов по номеру; Element elem = doc. getElementById(String elementId) – найти элемент по значению атрибута id; NamedNodeMap attrs = elem.getAttributes() – получить список атрибу- тов элемента; String value = attrs.getNamedItem(attrName).getNodeValue() – чтение значения атрибута по его имени. Ниже представлен фрагмент кода, реализующий чтение данных из XML-файла и загрузку их в таблицу экранной формы, разработанной в лабо- раторной работе № 2: try { // Создание парсера документа DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); // Чтение документа из файла doc = dBuilder.parse(new File(“books.xml”)); // Нормализация документа doc.getDocumentElement().normalize(); } catch (ParserConfigurationException e) { e.printStackTrace(); } // Обработка ошибки парсера при чтении данных из XML-файла catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // Получение списка элементов с именем book NodeList nlBooks = doc.getElementsByTagName("book"); // Цикл просмотра списка элементов и запись данных в таблицу for (int temp = 0; temp < nlBooks.getLength(); temp++) { // Выбор очередного элемента списка Node elem = nlBooks.item(temp); // Получение списка атрибутов элемента NamedNodeMap attrs = elem.getAttributes(); // Чтение атрибутов элемента String author = attrs.getNamedItem("author").getNodeValue(); String title = attrs.getNamedItem("title").getNodeValue(); String have = attrs.getNamedItem("have").getNodeValue(); // Запись данных в таблицу model.addRow(new String[]{author, title, have}); } 37 6.5. Порядок выполнения лабораторной работы 1. С помощью текстового редактора создайте файл, в котором будет описана структура XML-документа и данные для загрузки в экранную форму, разработанную в лабораторной работе № 5. Проверьте корректность XML-файла, открыв его в любом web-браузере (например, Internet Explorer или Google Chrome). 2. Создайте новый проект, который будет дублировать проект лабораторной работы № 5. 3. Напишите и замените в проекте обработчики кнопок загрузки данных в XML-файл и выгрузки из него. 4. Загрузите данные в экранную форму из XML-файла. Убедитесь, что данные в экранной форме соответствуют данным XML-файла. 5. Внесите изменения в данные экранной формы и сохраните их в XML-файле. 6. Просмотрите в браузере сохраненный XML-файл и убедитесь в правильности работы приложения. 7. Сгенерируйте документацию с помощью Javadoc и просмотрите ее в браузере. 6.6. Содержание отчета Отчет по лабораторной работе должен содержать: 1. Распечатки XML-файлов до загрузки данных в экранную форму и после их выгрузки. 2. Скриншоты, иллюстрирующие процесс загрузки данных в XML- файл и выгрузки из него. 3. Текст документации, сгенерированный Javadoc. 4. Фрагменты кода, отвечающие за сохранение и чтение данных из XML-файла. 38 Лабораторная работа № 7. Построение отчетов в PDF- и HTML- форматах Цель работы: знакомство со способами формирования отчетов с использованием конструктора Jaspersoft iReport Designert. 7.1. Применение системы Jaspersoft для построения отчетов JasperReports это Java-библиотека для создания отчетов. Библиотека представляет собой генератор отчетов, которые могут быть интегрирова- ны в Java-приложения. Библиотека позволяет отображать отчеты на экране или экспортировать их в определенный конечный формат. Поддерживаются такие форматы, как PDF, OpenOffice, DOCX и многие др. Кроме того, можно передавать результат через web-приложение или отправить итого- вый документ непосредственно на принтер. В состав Jaspersoft входит гра- фический редактор iReport. Программные продукты Jaspersoft предоставля- ются бесплатно и могут быть найдены на различных интернет-ресурсах ( http://jasperforge.org/projects/ireport/ ). В рамках данной лабораторной работы предлагается с использованием визуального конструктора iReport создать отчет, который может быть заполнен из Java-приложения и сохранен как в формате HTML, так и в формате PDF. Для начала работы с дизайнером отче- тов надо скачать инсталлятор iReport Designer и запустить его. После уста- новки дизайнера нужно проверить, подключена ли библиотека xalan.jar. Для этого надо войти в пункт меню Tools/Options и в открывшемся окне выбрать закладку Classpatch. Если библиотека xalan.jar отсутствует в списке, то доба- вить ее в список, нажав кнопку AddJAR. Эта бибиотека находится в папке ireport\libs каталога, в который был инсталлирован дизайнер. |