В.В. Кулямин - Технологии программирования. Компонентный подход (1134162), страница 75
Текст из файла (страница 75)
При этом роль представленияиграют JSP-страницы, а роль обработчиков — сервлеты. Основные отличия Struts от стандартнойтехники J2EE связаны с большей специализацией сервлетов и некоторой стандартизацией обменаданными между сервлетом, обрабатывающим запросы пользователя, и JSP-страницей,представляющей их результаты.271Клиент —Web-браузерHTMLстраницыWeb-серверHTTPWeb-контейнерActionServlet иRequestProcessorДействияДействиеДействияФормадействияДействияJSPКомпонентымоделиданныхХранилищеданных(СУБД)База данныхРисунок 79.
Общая схема архитектуры Web-приложений на основе Struts.В рамках приложения на основе Struts используется ровно один стандартизированный сервлет(ActionServlet), анализирующий запросы пользователя и выделяющий из каждого запросадействие (action), которое пользователь пытается выполнить. Для Интернет-магазина такимдействиями, например, могут быть аутентификация (предоставление своего имени и пароля),получение данных о товаре, поиск товара, добавление товара к уже заказанным, изменение заказа,предоставление прав на скидку, выполнение заказа, получение статуса выполнения заказа, отменазаказа и пр.
Для каждого действия создается отдельный класс действия. Такой класс должен бытьнаследником класса org.apache.struts.action.Action из библиотеки Struts и перегружать методActionForward execute(ActionMapping, ActionForm, HttpServletRequest,HttpServletResponse) — именно он и вызывается для выполнения этого действия.Один из параметров метода execute() в классе действия имеет тип формы действияorg.apache.struts.action.ActionForm. Для каждого действия определяется свой класс формыдействия, наследующий классу ActionForm.
Объекты этого класса используются для передачипараметров действия — наиболее существенных данных запросов, описывающих данноедействие.В методе execute() класса действия обычно строятся или находятся компоненты бизнеслогики приложения, которые реализуют операции, соответствующие данному действию, а затемэти операции выполняются со значениями полей объекта формы действия в качестве аргументов.Привязка запросов к действиям описывается в дополнительном конфигурационном файлеstruts-config.xml в формате XML, в теге action-mappings.
Одно действие описывается с помощьювложенного тега action, который имеет следующие атрибуты.•pathОпределяет шаблон URI, обращения к которым будут интерпретироваться как выполнениеданного действия.•typeОпределяет имя класса данного действия.•nameЗадает уникальное имя для данного действия.Привязка действий к определенным для них формам происходит с помощью тегов from-bean,вложенных в тег form-beans. Каждый тег form-bean имеет атрибут name, указывающий имя272действия для данной формы, и type, указывающий имя класса формы действия. Кроме того, такойтег может содержать вложенные теги form-property, описывающие свойства формы (в смыслеJavaBeans) при помощи таких же атрибутов name (имя свойства) и type (тип свойства).Помимо описанного механизма декомпозиции обработки запросов, среда Struts включаетбиблиотеки классов Java, в том числе, классов часто встречающихся действий, и библиотекипользовательских тегов, предназначенных для более удобного описания размещенных на JSPстраницах элементов HTML-форм.Java Server FacesJava Server Faces (JSF) [4,5] включают библиотеку элементов управления WebUI javax.faces идве библиотеки пользовательских тегов, предназначенных для использования этих элементовуправления в рамках серверных страниц Java.
C помощью тегов библиотеки jsf/html элементыуправления размещаются на странице, а с помощью тегов из jsf/core описывается обработкасобытий, связанных с этими элементами, и проверка корректности действий пользователя.В аспекте построения WebUI на основе серверных страниц Java технология Java Server Facesявляется развитием подхода Struts (Struts включают решения и для других аспектов разработкиприложений), предлагая более богатые библиотеки элементов WebUI и более гибкую модельуправления ими. Эта модель включает следующие элементы.• Возможность различного изображения абстрактного элемента управления (например,элемент управления «выбор одного из многих» может быть изображен как группа радиокнопок, комбо-бокс или список).• Возможность изменения визуальных стилей элементов управления.• Возможность привязки изображаемых элементом управления значений к свойствамкомпонентов модели данных.• Возможность привязки элементов управления к методам проверки корректности значений,устанавливаемых в них пользователем.В дополнение к библиотекам элементов WebUI JSF предлагает определять правила навигациимежду страницами в конфигурационном файле приложения.
Каждое правило относится кнекоторому множеству страниц и при выполнении определенного действия или наступлениисобытия предписывает переходить на некоторую страницу. Действия и события связываются сдействиями пользователя или логическими результатами их обработки (такими результатамимогут быть, например, успешная регистрация заказа в системе, попытка входа пользователя всистему с неправильным паролем и пр.).Технология Java Server Face версии 1.2 войдет в состав будущей версии 5.0 платформыJ2EE [6].Управление данными приложения. HibernateТехнологии обеспечения синхронизации внутренних данных приложения и его базы данныхразвиваются в настоящий момент достаточно активно.
Технология EJB предоставляетсоответствующие механизмы, но за счет значительного снижения удобства разработки имодификации компонентов. Обеспечение той же функциональности при более простойвнутренней организации кода является основным направлением развития в данной области.Возможным решением этой задачи являются объектно-реляционные преобразователи(object-relation mappers, ORM), которые обеспечивают автоматическую синхронизацию междуданными приложения в виде наборов связанных объектов и данными, хранящимися в системеуправления базами данных (СУБД) в реляционном виде, т.е.
в форме записей в несколькихтаблицах, ссылающихся друг на друга с помощью внешних ключей.Одним из наиболее широко применяемых и развитых в технологическом плане объектнореляционных преобразователей является Hibernate [7-9].Базовая парадигма, лежащая в основе избранного Hibernate подхода, — это использованиеобъектов обычных классов Java (быть может, оформленных в соответствии с требованиями273спецификации JavaBeans — с четко выделенными свойствами) в качестве объектногопредставления данных приложения. Такой подход даже имеет название-акроним POJO (plain oldJava objects, простые старые Java-объекты), призванное показать его отличие от сложных техникпостроения компонентов, похожих на EJB.Большое достоинство подобного подхода — возможность использовать один раз созданныенаборы классов, представляющих понятия предметной области, в качестве модели данных любыхприложений на основе Java, независимо от того, являются ли они распределенными илилокальными, требуется ли в них синхронизация с базой данных и сохранение данных объектовили нет.AuthorsBooksBookAuthorsID : intFirstName : StringSurname : StringAuthorID : intBookID : intID : intTitle : StringISBN : StringРисунок 80.
Реляционное представление данных о книгах и авторах.Например, для представления в объектном виде данных о книгах и их авторах,соответствующих показанной на Рис. 80 группе таблиц, могут быть использованы представленныениже классы.import java.util.Set;import java.util.HashSet;public class Author{private int id;private String firstName;private String surname;private Set books = new HashSet();public int getId (){ return this.id; }private void setId (int id) { this.id = id;}public String getFirstName (){ return this.firstName;}public void setFirstName (String firstName) { this.firstName = firstName; }public String getSurname (){ return this.surname;}public voidsetSurname (String surname) { this.surname = surname; }public Set getBooks (){ return this.books; }public void setBooks (Set books) { this.books = books; }}public class Book{private int id;private String title;private String isbn;private Set authors = new HashSet();public int getId (){ return this.id; }private void setId (int id) { this.id = id;}public String getIsbn (){ return this.isbn; }public voidsetIsbn (String isbn) { this.isbn = isbn; }274public String getTitle (){ return this.title; }public voidsetTitle (String title) { this.title = title; }public Set getAuthors (){ return this.authors;}public void setAuthors (Set authors) { this.authors = authors; }}Для определения отображения объектов этих классов в записи соответствующих таблициспользуются конфигурационные файлы со следующим содержанием.
Первый фрагментпредставляет собой описание отображения объектов класса Author на записи таблицы Authors,которое обычно помещается в файл Author.hbm.xml.<hibernate-mapping><class name="Author" table="Authors"><id name="id" column="ID"><generator class="increment"/></id><property name="firstName" column="FirstName"/><property name="surname"/ column="Surname"><set name="books" table="BookAuthors" inverse="true"><key column="AuthorID"/><many-to-many column="BookID" class="Book"/></set></class></hibernate-mapping>Второй фрагмент представляет собой содержание аналогичного файла Book.hbm.xml,описывающего отображение объектов класса Book на записи таблицы Books.<hibernate-mapping><class name="Book" table="Books"><id name="id" column="ID"><generator class="increment"/></id><property name="title" column="Title"/><property name="isbn"/ column="ISBN"><set name="authors" table="BookAuthors" inverse="true"><key column="BookID"/><many-to-many column="AuthorID" class="Author"/></set></class></hibernate-mapping>При использовании объектов указанных классов в рамках приложения на основе Hibernateобеспечивается автоматическая синхронизация данных объектов с данными соответствующихзаписей, а также автоматическая поддержка описанного отношения типа «многие-ко-многим».Кроме того, Hibernate поддерживает удобные средства для описания сложных соответствиймежду объектами и записями таблиц при использовании наследования.