В.В. Кулямин - Технологии программирования. Компонентный подход (1133554), страница 75
Текст из файла (страница 75)
Только после этого можно переходить к собственно выполнениюэтого запроса, что, казалось бы, является основной функцией сервлета. Таким образом,большое количество усилий тратится только на то, чтобы выделить из запроса операцию,которую пользователь хочет произвести, а также ее аргументы.• Неудобство использования в рамках JSP-страниц специализированных элементовпользовательского интерфейса. Для сравнения: в рамках ASP.NET можно использоватьбиблиотечные и пользовательские элементы управления, которые помещаются на страницупри помощи специального тега, а в параметрах этого тега указываются, в частности,методы для обработки событий, связанных с действиями пользователя.Для решения этих проблем используются различные библиотеки, инструменты икомпонентные среды, созданные в сообществе Java-разработчиков.
Некоторые такие библиотеки итехники станут стандартными средствами в рамках платформы J2EE новой версии 5.0 [1].Jakarta StrutsСреда Jakarta Struts [2,3] создавалась затем, чтобы упростить разработку компонентов Webприложения, предназначенных для обработки запросов пользователей, и сделать эту обработкуболее гибкой.Основные решаемые такими компонентами задачи можно сформулировать следующимобразом:• выделить сам логический запрос и его параметры из HTML документа, содержащегося вHTTP-запросе;• проверить корректность параметров запроса и сообщить пользователю об обнаруженнойнекорректности наиболее информативным образом;• преобразовать корректный логический запрос и его параметры в вызовы соответствующихопераций над объектами предметной области;• передать результаты сделанных вызовов компонентам, ответственным за построение ихпредставления для пользователя.Как и в рамках базовой платформы J2EE, в Struts основным архитектурным стилем для Webприложений является образец «данные-представление-обработка».
При этом роль представленияиграют 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; }}Для определения отображения объектов этих классов в записи соответствующих таблициспользуются конфигурационные файлы со следующим содержанием.