|
||||||
Quick Links |
2. Разработка Model-компонентов |
|||||
---|---|---|---|---|---|---|
2.1 Обзор |
||||||
Обычно много внимания при разработке web-приложений уделяется View. Однако, вы должны гарантировать, что обработка каждого посланного пользователем запроса также ясно определена с точки зрения Model. Обычно разработчик Model-компонентов сосредотачивается на создании JavaBean-классов, которые поддерживают функциональные требования. Точные характеристики beans, требуемых конкретным приложением могут сильно меняться в зависимости от этих требований, они они в общем могут быть классифицированы и подразделены на несколько категорий, обсуждаемых ниже в этом разделе. Однако первым делом мы рассмотрим краткую концепцию термина “scope” (англ. область) и его связь с beans. |
||||||
2.2 JavaBeans и Scope |
||||||
Внутри web-приложений объекты JavaBeans могут сохраняться в (и извлекаться из) наборе различных коллекций “атрибутов”. Каждая коллекция имеет различные правила, регламентирующие время жизни коллекции и видимость объектов-beans, помещенных в нее. В совокупности, правила времени жизни и видимости beans называется scope (областью видимости) beans. Спецификация JavaServer Pages (JSP) определяет различные варианты scope, используя следующие термины (эквивалентные концепции из Servlet API приведены в круглых скобках):
Важно помнить о том, что сервлеты и JSP-страницы в одном web-приложении совместно используют тот же самый набор коллекций beans. Например, bean, сохраненный в атрибуте запроса (request attribute) в сервлете примерно так:
немедленно становится видимым на JSP-странице, на которую Сервлет передал управление, используя стандартный тэг:
|
||||||
2.3 ActionForm Beans |
||||||
Примечание: ActionForm beans на самом деле ближе к View, чем к Model. При использовании Struts обычно предполагается, что
необходимо определить ActionForm bean (то есть, Java-класс,
расширяющий класс ActionForm) для каждой формы ввода, требуемой
для вашего приложения.
Когда вы будете программировать ваши ActionForm beans, старайтесь соблюдать следующие принципы:
Вы должны заметить, что “form” (форма) в том смысле, как это обсуждается здесь, не обязательно соответствует единственной JSP-странице в пользовательском интерфейсе. Обычное дело во многих приложениях – это иметь “form” (c точки зрения пользователя), которая “растянута” по многим страницам. Подумайте, например, о стиле пользовательского интерфейса в виде мастеров (wizard style user interface), который обычно используется во время установки нового программного обеспечения. Struts дает возможность определить единственную ActionForm bean, которое содержит свойства для всех полей, вне зависимости от того, на какой странице они в действительности будут отображены. Аналогично, различные страницы для одной и той же формы должны быть переданы на обработку (submitted) к одному и тому классу Action. Если вы следуете этим предложениям, то дизайнеры могут изменять порядок расположения полей на и между различными страницами, и часто без изменения логики обработки. |
||||||
2.4 System State Beans (Beans состояния системы) |
||||||
Реальное состояние системы обычно представлено как набор из нескольких JavaBeans классов, чьи свойства определяют текущее состояние. Система корзины покупателя, например, будет включать bean для представления корзины, который будет храниться для каждого отдельного покупателя и будет (помимо других вещей) включать набор тех продуктов, которые покупатель в данный момент отобрал для покупки. Отдельно, система будет включать различные beans для хранения информации о профиле пользователя (включая его кредитную карту и ShipTo адрес), так же как и каталог доступных продуктов и их текущие количества на складе. В небольших системах, или когда информацию о состоянии не нужно хранить длительное время, набор beans состояния системы может содержать все знания, которые система когда-либо имеет. Или, как это часто случается, beans состояния системы представляют информацию, которая постоянно хранится в некой внешней базе данных (например, объект CustomerBean который соответствует конкретной строчке в таблице CUSTOMERS), и создаются и уничтожаются из хранилища на сервере когда это необходимо. В очень больших приложениях для этих целей используются Entity Enterprise JavaBeans. |
||||||
2.5 Business Logic Beans (Beans бизнес-логики) |
||||||
Вы должны инкапсулировать функциональную логику вашего приложения в виде вызовов методов классов JavaBeans, спроектированных для этой цели. Эти методы могут быть частью тех же классов, которые используются для Beans состояния системы, или же они могут быть в отдельных классах, выделенных для выполнения логики. В последнем случае, как правило, вам необходимо будет передавать beans состояния системы в качестве параметров. Чтобы обеспечить максимальное повторное использование
кода, beans бизнес-логики должны быть спроектированы и реализованы
так, чтобы они ничего не знали о том, что они запускаются в
среде web-приложения. Если вы импортируете классы из
В зависимости от сложности и масштаба вашего приложения, beans бизнес-логики могут быть обычными JavaBeans, которые взаимодействуют с beans состояния системы, передаваемые как в качестве параметров, или обычными JavaBeans, которые обращаются к базе данных используя вызовы JDBC. Для крупных приложений, вместо этих beans часто используются stateful или stateless (с сохранением состояния или без сохранения состояния)Enterprise JavaBeans (EJBs). |
||||||
2.6 Доступ к реляционным базам данных |
||||||
Struts могут определять datasources (источники данных) для приложения в своем стандартном конфигурационном файле. Также предусмотрен простой пул JDBC-соединений. Подробнее смотрите Конфигурационный файл Action Mappings, и Utilities Developer Guide. После определения datasource, можно воспользоваться примером установления соединения внутри метода perform() класса Action. public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { javax.sql.DataSource dataSource = servlet.findDataSource(null); java.sql.Connection myConnection = dataSource.getConnection(); //делайте что вам нужно с экземпляром myConnection } catch (SQLException sqle) { getServlet().log("Connection.process", sqle); } finally { //завершает все это блок finally, который //гарантирует, что connection закрыт try { myConnection.close(); } catch (SQLException e) { getServlet().log("Connection.close", e); } } }Обратите внимание, что общий пул соединений Struts являет опциональным компонентом. Множество приложений на базе Struts использует другие пулы соединений для получения наилучшей производительности, особенно на промышленных системах большого объема.Далее: Разработка View-компонентов |
||||||
|
||||||
Copyright (c) 2000-2002, Apache Software Foundation |