Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 3 Серверные Java-компоненты Servlet 181
31. public String getName() { return(name); }
32. public static SearchSpec[] getCommonSpecs() {
33. return(commonSpecs); }}
В шестой строке создается массив, далее в этот массив помещаются
значения, и если передаваемое имя совпадает с именем параметра, на­ходящегося в этом массиве, то пользователь попадает на необходимый адрес, в противном случае выводится сообщение об отсутствии нужно ресурса.
В строке три переменной searchString присваивается значение пере-
даваемого параметра.
В тринадцатой строке формируется сообщение, в случае если клиент
так и не выбрал какой-либо поисковый механизм. Далее описывается размещение в созданном массиве ссылок на популярные поисковые сер­веры, с кратким именем и полным адресом доступа.
Теперь HTML-страница для нашего поискового servlet должна вы-
глядеть следующим образом:
<FORM ACTION="/servlet/SearchEngines"> <CENTER> Search String: <INPUT TYPE="TEXT" NAME="search­String"><BR> Results to Show Per Page: <INPUT TYPE="TEXT" NAME="numResults" VALUE=10 SIZE=3><BR> <INPUT TYPE="RADIO" NAME="searchEngine" VALUE="altavista"> Altavista | <INPUT TYPE="RADIO" NAME="searchEngine" VALUE="infoseek"> Infoseek | <INPUT TYPE="RADIO" NAME="searchEngine" VALUE="lycos"> Lycos | <INPUT TYPE="RADIO" NAME="searchEngine" VALUE="hotbot"> HotBot <BR> <INPUTTYPE="SUBMIT"VALUE="Search"> </CENTER> </FORM> </BODY> </HTML>
УПРАВЛЕНИЕ СЕССИЕЙ
Под сессией подразумевается некоторое количество запросов, посту-
пивших от одного клиента или одного браузера в течение определенного промежутка времени. Объект сессии создается различными путями. Име­ет несколько уровней настройки и может иметь несколько копий при кла­стеризации. Во всех случаях объект request инициализирует создание объекта сессии. Только один servlet может создать объект сессии в дан­ный промежуток времени. В случае, когда несколько servlet одновремен­но вызывают метод serviсe() для каждого HTTP-запроса, пользователь­ские сессии блокируются до момента отправления ответа клиенту одним из servlet. Java Servlet API представляет элегантный и очень мощный способ управления взаимодействия между клиентом и сервером, клиент­ской сессией. javax.servlet.http.HttpSession интерфейс, описывающий множество методов получения информации о пользовательской сессии.
182 Часть 3 Серверные Java-компоненты Servlet
Существуют три основных подхода для создания объектно-ориентиро-
ванных многозвенных распределенных систем: с сервером без состояния, ориентированный на сеансы связи с клиентом и с использованием «долго­живущих» объектов. Сервером без состояния называется объект, кото­рый обеспечивает нужную функциональность путем предоставления на­бора операций, но не сохраняющий состояния между вызовами этих опе­раций. При обращении к такому объекту клиент не может полагаться на использование результата предыдущего вызова того же объекта.
Подход, ориентированный на использование сеансов, предполагает со-
здание в некотором промежуточном звене системы специального объек­та — «сеанса» (или «сессии»), который является представителем клиента. Обычно время существования такого объекта явно определяется клиен­том или серверным процессом, в котором существует данный объект. Клиент уничтожает объект, если он ему больше не нужен; сервер может уничтожить его, например, по тайм-ауту. Если серверный процесс завер­шен, имеющаяся у клиента ссылка на объект может потерять свой смысл. Модель системы с сохраняемыми объектами предполагает создание не­кой программной оболочки вокруг данных, хранящихся в некоторой БД, и создание набора операций для работы с этими данными. Созданный таким образом объект доступен одновременно для нескольких клиентов. Его время существования определяется временем существования в хранили­ще данных, объектным представлением которых он является.
Для получения информации о клиентской сессии в SDK servlet опи-
сан интерфейс javax.servlet.http.HttpSession, имеющий ряд методов, опи­сывающих как саму клиентскую сессию, так и передаваемые данные.
Сессией называется соединение клиента с сервером в течение опре-
деленного промежутка времени. Используя метод getSession(boolean) класса HttpServletRequest для управления сессией, значение false ука­зывает на создание новой сессии servlet.
Servlet API 2.1 содержит классы, предназначенные для работы с
клиентской сессией. Интерфейс javax.servlet.http.HttpSession описывает методы управления пользовательской сессией. Управление сессией мо­жет осуществляться различными способами, для которых определены разные уровни выполнения. Во всех случаях servlet предварительно ис­пользует метод javax.servlet.http.HttpServletRequest.getSession(boolean) для получения объекта типа сессии и в дальнейшем работать с данным объектом в одном из основных методов servlet.
Компания IBM поставляет свой аналог стандартного интерфейса
HttpSession интерфейс com.ibm.websphere.servlet.session.IBMSession. Интерфейс, поставляемый фирмой IBM, имеет ряд дополнительных ме­тодов, используемых в различных ситуациях, связанных с управлением сессией.
Создание сессии начинается с создания объекта класса HttpSession и
присвоения данному объекту значения клиентского запроса
HttpSession session = request.getSession(true);
Если возвращаемое значение null, то создается новая сессия. Обыч-
но такая ситуация довольно редка, поскольку каждый клиентский за­прос порождает новую сессию. Значение True говорит о том, что сессия
Часть 3 Серверные Java-компоненты Servlet 183
уже создана. Далее необходимо получить и сохранить пользователь­ские данные, идентифицирующие сессию. Так как идентифицирующих значений может быть несколько, неплохо воспользоваться какой-ни­будь коллекцией для работы со значениями сессии. Сессия живет на сервере, но ассоциирована с объектом request. При использовании объ­екта session можно воспользоваться методами putValue() и getValue() для установки и получения атрибутов клиентской сессии. В специфи­кации 2.2 эти методы заменены на методы getAttribute() и setAttribu­te(). Для получения всех параметров сессий используется метод getVa­lueNames(), замененный в более поздней версии на метод getAttributes­Names(). На следующем этапе может потребоваться создание HTML­страницы, содержащей данные сессии. Прежде чем сессия закончится, данные сохраняются в объекте, реализующем интерфейс javax.serv­let.http.HttpSessionBindingListener, определяющим связанность данных с сессией. Используя объект класса HttpSessionBindingEvent, можно узнать о данных, использующихся в сессии. Наконец после обновления данных о последней сессии они сохраняются на сервере. Для окончания сессии можно использовать метод invalidate() объекта Session.
Дополнительные методы, предназначенные для работы с клиентской
сессией: метод getId() возвращает уникальный идентификатор, создан­ный для каждой сессии; метод isNew() определяет, является ли новой клиентская сессия, т. е. клиент не осуществлял доступ к ресурсам сер­вера. Данный метод будет работать только с серверами, использующи­ми cookies для управления пользовательской сессией и при условии, что клиент не отключил поддержку cookies в своем браузере.
Метод getCreationTime() указывает время создания сессии. Время ука-
зывается в миллисекундах с момента начала новой эпохи, 1 января 1970 г. Еще один временной метод getLastAccessedTime() возвращает значение времени в миллисекундах от момента, когда совершалась последняя сес­сия. Метод getMaxInactiveInterval() указывает количество времени в се­кундах, за которое сессия не произвела никаких запросов. Отрицательное значение указывает, что сессия не должна прерываться. Метод setMaxI­nactiveInterval() устанавливает количество времени в секундах, прежде чем неактивная сессия будет уничтожена. Напарником метода установки, как обычно, является метод получения getMaxInactiveInterval(), с его по­мощью можно получить временное значение неактивности сессии.
Еще одним временным параметром сессии является дата рождения
данной сессии. Метод getCreationTime() предназначен для получения даты создания сессии. Правда, значение, возвращаемое этим методом, может быть очень большим, так как возвращается количество миллисе­кунд, прошедших со дня новой эпохи (1 января 1970 г.) Предназначен для любителей заниматься математическими вычислениями, но, навер­ное, может быть полезен.
Идентифицировать сессию можно, используя метод getID(). Каждая
HTTPSession имеет уникальный номер, сгенерированный сервером. Спо­соб генерации ID сессии для каждого сервера свой. Это не имеет боль­шого значения, поскольку определены специальные способы идентифи­кации сессии, применимые на любых серверах. Когда поступает клиент­ский запрос, создается объект класса HttpSession, и данному объекту
184 Часть 3 Серверные Java-компоненты Servlet
присваивается идентификационный номер ID, который посылается как cookie обратно клиенту. При повторном запросе ресурса браузер посы­лает обратно серверу cookie, содержащий ID первой сессии. Используя это значение, сервер находит объект, ассоциированный с данным поль­зователем. Однако иногда могут возникнуть ситуации, при которых coo­kies не работают. Некоторые старые версии браузеров не поддерживают работу с cookie, другие версии браузеров имеют специальную возмож­ность отключения работы с cookie. В этом случае сервер должен отсор­тировать данные клиента при различных сессиях. Первый запрос, по­ступивший на сервер, инициализирует создание объекта HttpSession, которому присваивается определенный идентификатор, отправляемый сервером обратно браузеру, как cookie. При повторном запросе создан­ный идентификатор пересылается обратно серверу, для того чтобы сер­вер нашел сессию, ассоциированную с данным пользователем.
Метод isNew() позволяет определить, является ли клиентская сессия
новой.
Самым приятным из всех методов можно назвать метод invalidate().
Установка этого метода для пользовательской сессии заканчивает ее в принудительном порядке. Метод определяет действующую сессию как неверную, и сервер прекращает работать с этой сессией.
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.net.*; import java.util.*; public class ShowSession extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws
ServletException, IOException {
HttpSession session = request.getSession(true); response.setContentType("text/html"); PrintWriter out = response.getWriter(); String heading;
if (session.isNew()) { heading = "Welcome, Newcomer"; } else { heading = "Welcome Back";
Integer oldAccessCount = (Integer)session.getValue("accessCount");
if (oldAccessCount != null) {
accessCount = new Integer(oldAccessCount.intValue() + 1); }
} session.putValue("accessCount", accessCount); out.println("<BODY BGCOLOR=\"#FDFDFD\">\n" +
"<H1 ALIGN=\"CENTER\">" + heading + "</H1>\n" +
"<H2> Информация о клиентской сесси:</H2>\n" +
"<TABLE BORDER=1 ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAAAA\">\n" +
" <TH>Info Type<TH>Value\n" +
"<TR>\n" + " <TD>ID\n" + "<TD>" + session.getId() + "\n" +
"<TR>\n" + "<TD>Creation Time\n" + "<TD>" +
new Date(session.getCreationTime()) + "\n" +
"<TR>\n" + "<TD>Time of Last Access\n" +
" <TD>" + new Date(session.getLastAccessedTime()) + "\n" +
Часть 3 Серверные Java-компоненты Servlet 185
"<TR>\n" + "<TD>Number of Previous Accesses\n" +
" <TD>" + accessCount + "\n" + "</TABLE>\n" +
"</BODY></HTML>"); }
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response); }}
В объекте HttpSession можно сохранить любой тип объекта. Типич­ный пример — сохранение в значении сессии параметров доступа к ба­зе данных, для получения информации о клиентских требованиях:
Connection con = driver.getConnection(databaseURL, user, password);
session.putValue("myappl.connection", con);
Теперь, используя данные сессии, можно получить параметры сое­динения с базой данных из другого servlet при помощи метода getVa­lue():
HttpSession session = request.getSession(true);
Connection con = (Connection)session.getValue("myappl.connection");
if (con != null) {
// Соединение с базой данных
Можно использовать для сохранения информации о пользователь­ской сессии, cookies, и каждый раз при обращении клиента к уже посе­щаемому в прошлом ресурсу использовать информацию, сохраненную в cookies. Информация хранится на сервере, а значит, доступна в любое время. Однако бывают ситуации, в которых cookies беспомощны. Испо­льзование cookies для хранения данных о клиентской сессии имеет ряд ограничений, во-первых, может потребоваться извлекать информацию из другого cookie, которых может быть очень много. Во-вторых, в cookie не рекомендуется хранить большой объем информации, наконец, не вся информация должна быть помещена в cookies. Часть клиентской ин­формации может носить конфиденциальный характер.
Некоторые старые версии браузеров не поддерживают работу с coo­kies. Другие позволяют пользователю самостоятельно отключить работу с cookies. Кроме того, cookies могут быть испорчены. В подобных случаях используется альтернатива — переделывание URL, метод, основанный на добавлении специальной информации к указанному адресу ресурса.
URL rewriting. Описывает добавление некоторой информации в ко­нец каждого URL, по которой сервер опознает сессию, и server может связывать этот идентификатор сессии с данными. Однако, как при ра­боте cookies, здесь присутствуют те же самые проблемы. На сервере производится слишком много работы по выделению нужной информа­ции. Кроме того, каждый возвращаемый пользователю URL необходимо контролировать на правильность дополненных данных.
Обычная HTML-ссылка
<a href="/shop/catalog">
переписывается как
<a href="shop/catalog;$sessionid$DA3224SGE2">
186 Часть 3 Серверные Java-компоненты Servlet
Когда пользователь снова получает ссылку на адрес, браузер пере­сылает запрос ñ óæå добавленным компонентом ;$sessionid$ DA3224SGE2, который является частью клиентского запроса и сохраня­ется как часть объекта session. Для использования способа идентифика­ции сессий по измененной URL используется метод объекта response:
response.encodeURL ("/store/catalog");
Используя метод переписывания URL, нет необходимости описывать все ссылки в HTML-файле с добавленными параметрами. Строка serv­let, создающего HTML тег ссылки:
out.println("<a href=\"/shop/catalog\">catalog<a>");
должна быть заменена на несколько различных операторов:
out.println("<a href=\"");
out.println(response.encodeURL ("/shop/catalog"));
out.println("\">catalog</a>");
Основным оператором здесь является оператор декодирования URL.
Существует еще один способ декодирования — метод encodeRedirec­tURL(). Если в servlet содержится строка перенаправления клиентского запроса:
response.sendRedirect ("http://myhost/store/catalog");
можно заменить на метод encodeRedirectURL() объекта response:
response.sendRedirect(response.encodeRedirectURL ("http://myhost/ shop/catalog"));
Методы encodeURL() и encodeRedirectURL() часть объекта HttpServ­letResponse. В обоих случаях необходимо проверить основной URL, прежде чем организовывать переписывание. В основном многие серверы автоматически определяют тип клиентского браузера и используют для идентификации пользовательской сессий либо cookies, либо rewtiying URL. Но иногда сам автор servlet должен заранее определить метод управления сессией.
Класс HTTPUtils расширяет возможности servlet по работе с HTTP­протоколом передачи данных.
Класс содержит набор методов, полезных при создании и использо­вании servlet, работающих с HTTP-протоколом. Основная роль объекта данного класса состоит в синтаксическом анализе переданных клиент­ских данных. Два метода — parsePostData()
и parseQueryString() — ра­ботают с данным и переданными способами POST и GET соответствен­но. Оба метода возвращают hash-таблицу, связанный массив. Замечате­льным свойством данных методов служит получение имени параметра и его нескольких значений, если таковые имеются. Синтаксический ана­лиз, проводимый методами на основе входящих потоков, строит hash­таблицу пар имя=значение для каждого передаваемого параметра.
Еще один метод данного класса getRequestURL() возвращает полный URL клиентского ресурса в виде объекта java.lang.StringBuffer, что да­ет возможность добавлять в запрос собственные параметры.
Часть 3 Серверные Java-компоненты Servlet 187
Глава 27. Изменения в версиях JSDK 1.1 и 2.1
JDK 1.1 и Java 2 платформа обеспечивают поддержку Java Servlet Development Kit (JSDK) опционально. JSDK 1.0 была первой версией набора разработчика, применяемой для создания servlet. С появлением платформы J2EE были выпущены новые версии JSDK — сначала 2.0 и последняя на настоящий момент, октябрь 2000 г. версия 2.2. Основная разница между премьерной версией и последующими — в добавлении некоторых новых классов, ну и как обычно, часть старых методов за­прещена к использованию. Поскольку некоторые серверы еще поддер­живают старые версии JSDK, необходимо соблюдать осторожность при создании servlet для этих Web-серверов.
JSDK 2.0 имеет следующие дополнения:
Добавлен интерфейс SingleThreadModel, определяющий однопо-
точный режим работы servlet. Символьные потоки Reader и Writer теперь стали доступны объек-
òàì ServletRequest Several HTTP session classes that can be used to provide state infor-
mation that persists over multiple connections and requests between an HTTP client and an HTTP server. Включена поддержка Cookie.
Several new HTTP response constants have been added to HttpServ-
letResponse.
Удалены обработчики методов DELETE, OPTIONS, PUT, и TRACE.
JSDK 2.0 deprecated one method:
Запрещен к использованию метод getServlets(), вместо него необ­ходимо использовать метод getServletNames()
è ServletResponse.
.
Разница между версиями 2.1. и 2.2 в запрещении использования ме­тодов getServlet(), getServletts(), getServletNames(), а также метода за­писи в системный журнал log() со строковым аргументом.
Кроме того, введена поддержка jar-архивов.
Добавлено свойство буферизации ответа (response).
Стало возможным получить доступ к объекту класса RequestDis­patcher по имени.
Теперь стало возможным использование относительного пути ре­сурса в объекте RequestDispatcher.
Добавлены следующие методы:
getServletName() в интерфейсе ServletConfig
getInitParameter() и getInitParameterNames() в интерфейсе Serv­letContext
getLocale() в интерфейсе ServletRequest
isSecure() в интерфейсе ServletRequest
getHeaders()в интерфейсе HttpServletRequest
getContextPath()в интерфейсе HttpServletRequest
IsUserInRole() и getUserPrinciple()в интерфейсе HttpServletRequest
188 Часть 3 Серверные Java-компоненты Servlet
AddHeader(), addIntHeader(), è addDateHeader()â интерфейсе
HttpServletResponse
В работе с сессией не рекомендуется использовать метод getSession­Context().Методы getValue(java.lang.String name), getValueNames(), put­Value() è removeValue() заменены íà методы getAttribute(ja­va.lang.String), getAttributeNames(), setAttribute(java.lang.String,ja­va.lang.Object) è setAttribute(java.lang.String, java.lang.Object) соответственно.
Глава 28. Сравнение между JSP и servlet
Компания SUN — создатель языка Java и технологии, Java рекомен­дует использование JSP и servlet именно на уровне Web-сервера, раз­деляя при этом сам Web-сервер на дополнительные, промежуточные компоненты. В общей Web-архитектуре Web-сервер, второе звено, обычно содержит HTTP-сервер и сервер приложений. Компания SUN дополнила этот список специальным средством, используемым при ра­боте с базами данных, называемый EJB-контейнер, речь о котором пой­дет ниже.
Дабы не уходить далеко от первоисточника, необходимо придержива­ться соответствующих требований, можно последовать рекомендациям компании SUN. Оба серверных компонента, и JSP, и servlet, могут при­меняться для решения идентичных задач, а могут использоваться и для специфических задач, решение которых лучше доверить одному из них.
Как правило, servlet используется для формирования документа, об­ращения к базе данных и обработки специфического клиентского запро­са. Servlet формирует ответ в стандартном выходном потоке system.out., что накладывает свои ограничения на помещение HTML тегов в выход­ной поток. JSP по своей природе уже является готовым выходным объ­ектом, изменение HTML тегов, в котором не требует никаких дополни­тельных усилий. С другой стороны, управление выходящим потоком с помощью servlet представляет более гибкие и мощные способы, чем стандартные средства, реализованные в JSP.
Ключевым моментом выбора в Web-приложении использования JSP или servlet можно конечно же считать используемый протокол переда­чи данных. Если основным протоколом будет служить HTTP, то лучше конечно же использовать JSP, поскольку именно в JSP можно тремя различным способами — скриплеты, пользовательские теги и JavaBe­an — достичь одной цели. В то время как servlet в силу специфических причин может использовать только компилируемые конструкции на языке Java. Также важно обратить внимание на то, как приложение бу­дет работать с данными, по какой схеме. Будет ли передача осуществ­ляться синхронно, асинхронно или еще по какому-либо иному способу.
Servlet можно инициировать различными способами, он может устанав­ливаться в момент старта Application Server, либо при первом обращении, либо при возникновении определенного события. JSP же является постоян­ным ресурсом, а значит, и занимает постоянное количество ресурсов.
Часть 3 Серверные Java-компоненты Servlet 189
Опять же удачный выбор способа вызова Web-компонента, JSP или servlet значительно облегчает работу по управлению всем приложением в целом. Но при изменении свойств servlet необходимо не только перекомпилирова­вать класс servlet, но и в некоторых случаях перезагрузить сам Web-сер­вер и провести заново регистрацию вновь созданного servlet.
Кроме использования JSP-страницы при работе с HTTP-протоколом, основной ролью JSP является вывод пользовательской информации. Это еще один большой плюс использования именно JSP в Web-приложении. Заказчик, каким бы продвинутым он ни был, всегда уделяет очень боль­шое внимание именно внешнему виду приложения, а ведь значительно легче заменить одну строку в HTML-странице, чем сидеть и в панике вспоминать класс servlet, в котором описана генерация данной HTML­страницы.
В отличие от JSP, представляющих данные, servlet легче использо­вать для внутренней работы и управления Web-приложением в целом. Одной из основных ролей использования servlet можно назвать технику сотрудничества двух различных servlet. В данном контексте именно два или более servlet участвуют в формировании ответа. Использование servlet в данном случае оправданно для многопоточных запросов и пе­реадресации в различные источники единовременно. Техника сотрудни­чества применяется в фильтрации и цепочной обработке данных. В дан­ном случае два servlet взаимодействуют только с Web-приложением. Парная работа servlet значительно лучше справляется с вызовами дру­гих Java-приложений, поскольку инстанцирование экземпляра класса и вызов его public методов осуществляется в любом месте тела servlet, а это немаловажно при асинхронной связи.
Так же как и у JSP, у каждого servlet имеется своя область видимо­сти, но, в отличие от JSP, у servlet таких областей всего три.
Использование JSP в ряде случаев снимает с программиста задачу создания апплетов, так затрудняющих жизнь обычных пользователей при получении данных. Порой все недостатки использования Java свя­зываются именно с применением апплетов. JSP с его тегами <use:Java­Bean> и <jsp:include> упрощает импортирование классов в клиентское приложение и полностью снимает проблему «долго идущих данных» — апплетов.
Отказ от апплетов помогает решить еще одну немаловажную проб­лему — проблему интернационализации данных на больших Web-сай­тах. По существу, электронная коммерция создана для того, чтобы раз­вивать обычную торговлю независимо от национальных, языковых или географических границ. Англоязычное развитие сайта приводит к по­тенциальной потере неанглоговорящей публики. Для решения проблем интернационализации создаваемого Web-приложения Java-технология предлагает одно решение. Но использовать это решение все-таки лучше в JSP, чем в servlet. Поскольку JSP прекрасно подходит для отображе­ния данных, а большинство данных локально привязаны к определен­ной языковой группе.
Итак, использование JSP лучше всего подходит для предоставления данных в виде HTML/XML-документа, а servlet прекрасно справляется с ролью управленца Web-приложения.
ЧАСТЬ 4. РАСПРЕДЕЛЕННЫЕ КОМПНЕНТЫ EJBЧАСТЬ 4. РАСПРЕДЕЛЕННЫЕ КОМПОНЕНТЫ ENTERPRISE
JAVA BEAN
В последние несколько лет широкое распространение WWW позво­лило различным компаниям использовать Интернет не только для обо­гащения своих информационных ресурсов, но и для проведения части финансовых операций, необходимых для функционирования бизнеса. Если раньше считалось хорошей традицией иметь свой сайт, то теперь представители бизнеса стали активно использовать сайты, позволяю­щие пользователям заказывать различные товары и услуги. На настоя­щий момент происходит глобальное слияние Web-систем с информаци­онными системами предприятий.
Большинство сайтов, использующих Java, используют только неко­торые технологи, в лучшем случае ограничиваясь использованием ап­плетов и servlet, отказываясь в большинстве случаев от еще только предлагаемых различными компаниями новшеств, также основанных на Java-технологии.
Сама идея распределенных компонентов не нова, но фирма SUN вы­кристаллизовала существующие решения и перенесла на свою плат­форму Java. Распределенные EJB давно стали неотъемлемой частью Web-приложений. Фирма SUN предложила свое решение, серверное приложение, обладающее транзакционными характеристиками, — En­terprise JavaBean (EJB). Основанные на новой технологии — Java Tran­saction Service (JTS) — EJB поддерживают все механизмы, присущие другим транзакционным EJB-приложениям. EJB создавались именно как распределенные приложения.
Распределенность компонентов по различным средам обязывает свое­временно и точно изменять данные, используемые распределенным EJ­Bми. Для точного выполнения работы все EJB в распределенной системе должны поддерживать механизм проверки выполнения всех операций. Все операции в системе можно разделить на определенные этапы — транзакции. Вообще под транзакцией подразумевается набор с последо­вательно выполняемыми действиями, как единого, неделимого деяния, или говоря проще, транзакция — это логическая единица работы.
В современной сфере программирования транзакции наиболее часто используются при работе с СУБД. В принципе понятия «базы данных» и «транзакция» стали неразделимы в программном мире. Практически любая операция с базами данных выполняется в контексте транзакции. Транзакция, исполняемая в базе данных, часто содержит несколько по­следовательных операций, говоря точнее SQL-операторов.