Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 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="searchString"><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() и setAttribute(). Для получения всех параметров сессий используется метод getValueNames(), замененный в более поздней версии на метод getAttributesNames(). На следующем этапе может потребоваться создание HTMLстраницы, содержащей данные сессии. Прежде чем сессия закончится,
данные сохраняются в объекте, реализующем интерфейс javax.servlet.http.HttpSessionBindingListener, определяющим связанность данных
с сессией. Используя объект класса HttpSessionBindingEvent, можно
узнать о данных, использующихся в сессии. Наконец после обновления
данных о последней сессии они сохраняются на сервере. Для окончания
сессии можно использовать метод invalidate() объекта Session.
Дополнительные методы, предназначенные для работы с клиентской
сессией: метод getId() возвращает уникальный идентификатор, созданный для каждой сессии; метод isNew() определяет, является ли новой
клиентская сессия, т. е. клиент не осуществлял доступ к ресурсам сервера. Данный метод будет работать только с серверами, использующими cookies для управления пользовательской сессией и при условии,
что клиент не отключил поддержку cookies в своем браузере.
Метод getCreationTime() указывает время создания сессии. Время ука-
зывается в миллисекундах с момента начала новой эпохи, 1 января 1970 г.
Еще один временной метод getLastAccessedTime() возвращает значение
времени в миллисекундах от момента, когда совершалась последняя сессия. Метод getMaxInactiveInterval() указывает количество времени в секундах, за которое сессия не произвела никаких запросов. Отрицательное
значение указывает, что сессия не должна прерываться. Метод setMaxInactiveInterval() устанавливает количество времени в секундах, прежде
чем неактивная сессия будет уничтожена. Напарником метода установки,
как обычно, является метод получения getMaxInactiveInterval(), с его помощью можно получить временное значение неактивности сессии.
Еще одним временным параметром сессии является дата рождения
данной сессии. Метод getCreationTime() предназначен для получения
даты создания сессии. Правда, значение, возвращаемое этим методом,
может быть очень большим, так как возвращается количество миллисекунд, прошедших со дня новой эпохи (1 января 1970 г.) Предназначен
для любителей заниматься математическими вычислениями, но, наверное, может быть полезен.
Идентифицировать сессию можно, используя метод getID(). Каждая
HTTPSession имеет уникальный номер, сгенерированный сервером. Способ генерации ID сессии для каждого сервера свой. Это не имеет большого значения, поскольку определены специальные способы идентификации сессии, применимые на любых серверах. Когда поступает клиентский запрос, создается объект класса HttpSession, и данному объекту

184 Часть 3 Серверные Java-компоненты Servlet
присваивается идентификационный номер ID, который посылается как
cookie обратно клиенту. При повторном запросе ресурса браузер посылает обратно серверу cookie, содержащий ID первой сессии. Используя
это значение, сервер находит объект, ассоциированный с данным пользователем. Однако иногда могут возникнуть ситуации, при которых cookies не работают. Некоторые старые версии браузеров не поддерживают
работу с 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 при помощи метода getValue():
HttpSession session = request.getSession(true);
Connection con = (Connection)session.getValue("myappl.connection");
if (con != null) {
// Соединение с базой данных
Можно использовать для сохранения информации о пользовательской сессии, cookies, и каждый раз при обращении клиента к уже посещаемому в прошлом ресурсу использовать информацию, сохраненную в
cookies. Информация хранится на сервере, а значит, доступна в любое
время. Однако бывают ситуации, в которых cookies беспомощны. Использование cookies для хранения данных о клиентской сессии имеет ряд
ограничений, во-первых, может потребоваться извлекать информацию
из другого cookie, которых может быть очень много. Во-вторых, в cookie
не рекомендуется хранить большой объем информации, наконец, не вся
информация должна быть помещена в cookies. Часть клиентской информации может носить конфиденциальный характер.
Некоторые старые версии браузеров не поддерживают работу с cookies. Другие позволяют пользователю самостоятельно отключить работу
с 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-файле с добавленными параметрами. Строка servlet, создающего HTML тег ссылки:
out.println("<a href=\"/shop/catalog\">catalog<a>");
должна быть заменена на несколько различных операторов:
out.println("<a href=\"");
out.println(response.encodeURL ("/shop/catalog"));
out.println("\">catalog</a>");
Основным оператором здесь является оператор декодирования URL.
Существует еще один способ декодирования — метод encodeRedirectURL(). Если в servlet содержится строка перенаправления клиентского
запроса:
response.sendRedirect ("http://myhost/store/catalog");
можно заменить на метод encodeRedirectURL() объекта response:
response.sendRedirect(response.encodeRedirectURL ("http://myhost/
shop/catalog"));
Методы encodeURL() и encodeRedirectURL() часть объекта HttpServletResponse. В обоих случаях необходимо проверить основной 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).
•
Стало возможным получить доступ к объекту класса RequestDispatcher по имени.
•
Теперь стало возможным использование относительного пути ресурса в объекте RequestDispatcher.
Добавлены следующие методы:
•
getServletName() в интерфейсе ServletConfig
•
getInitParameter() и getInitParameterNames() в интерфейсе ServletContext
•
getLocale() в интерфейсе ServletRequest
•
isSecure() в интерфейсе ServletRequest
•
getHeaders()в интерфейсе HttpServletRequest
•
getContextPath()в интерфейсе HttpServletRequest
•
IsUserInRole() и getUserPrinciple()в интерфейсе HttpServletRequest

188 Часть 3 Серверные Java-компоненты Servlet
AddHeader(), addIntHeader(), è addDateHeader()â интерфейсе
•
HttpServletResponse
В работе с сессией не рекомендуется использовать метод getSessionContext().Методы getValue(java.lang.String name), getValueNames(), putValue() è removeValue() заменены íà методы getAttribute(java.lang.String), getAttributeNames(), setAttribute(java.lang.String,java.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 можно тремя
различным способами — скриплеты, пользовательские теги и JavaBean — достичь одной цели. В то время как 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:JavaBean> и <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 предложила свое решение, серверное
приложение, обладающее транзакционными характеристиками, — Enterprise JavaBean (EJB). Основанные на новой технологии — Java Transaction Service (JTS) — EJB поддерживают все механизмы, присущие
другим транзакционным EJB-приложениям. EJB создавались именно
как распределенные приложения.
Распределенность компонентов по различным средам обязывает своевременно и точно изменять данные, используемые распределенным EJBми. Для точного выполнения работы все EJB в распределенной системе
должны поддерживать механизм проверки выполнения всех операций.
Все операции в системе можно разделить на определенные этапы —
транзакции. Вообще под транзакцией подразумевается набор с последовательно выполняемыми действиями, как единого, неделимого деяния,
или говоря проще, транзакция — это логическая единица работы.
В современной сфере программирования транзакции наиболее часто
используются при работе с СУБД. В принципе понятия «базы данных» и
«транзакция» стали неразделимы в программном мире. Практически
любая операция с базами данных выполняется в контексте транзакции.
Транзакция, исполняемая в базе данных, часто содержит несколько последовательных операций, говоря точнее SQL-операторов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
