Таблица 2.3 (продолжение)
Replicator.java |
courseExample/Replicator.class |
Remote-интерфейс EJB-компонента |
ReplicatorBean.java |
courseExample/ReplicatorBean.java.class |
Принимает массив объектов Row, запрашивает соединение с DB2, выполняет SQL-запросы и помещает результаты в журнал репликации |
Journal.java |
Journal.class |
Сервлет. Пользовательский интерфейс журнала репликации |
2.7.5. Описание программных модулей
Стартовая страница index.jsp предоставляет пользователю HTML-форму для загрузки XML-документа. Эта страница показана на рисунке 2.80:
Рис. 2.80 Стартовая страница приложения
Форму обслуживает сервлет XMLReceiver. Если клиентом является не пользователь, а другое приложение, то это приложение должно самостоятельно сформировать multipart HTTP-запрос напрямую к сервлету XMLReceiver (минуя index.jsp). XMLReceiver лишь принимает запрос и отображает результат последующих операций. Вспомогательный для XMLReceiver класс MultiPartParser обрабатывает все части multipart запроса, которые являются файлами, полагая, что все они XML-файлы. Таким образом, в одном запросе к серверу для репликации можно передать несколько XML-документов. Но в данном приложении для простоты пользователю дана возможность загрузить лишь один документ через HTML-форму. Для приложения-клиента это ограничение не действует. Классы RowSet и Row совместно создают SQL-оператор для соответствующей строки XML-файла. Оператор хранится в свойстве класса Row, которое называется sql. Для получения доступа к EJB-компоненту ReplicatorBean классом MultiPartParser используется контекст JNDI, создаваемый сервером WebSphere. EJB-компонент должен быть опубликован в контексте и иметь JNDI-имя "REPLICATOR". В качестве параметра EJB-компоненту передается массив объектов Row, точнее Java-контейнер ArrayList, содержащий эти объекты. Для того чтобы использовать класс Row в качестве параметра EJB этот класс реализует Java-интерфейс Serializable. ReplicatorBean представляет собой простейший EJB - SessionBean без состояния. Для соединения с DB2 ReplicatorBean использует разделяемый пул соединений. При работе с современными СУБД и J2EE серверами нет необходимости самому программно реализовывать возможности такого пула соединений. Эту задачу решает СУБД и сервер приложений. DB2 предоставляет реализацию java-интерфейса javax.sql.ConnectionPoolDataSource (класс COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource), а сервер WebSphere используя этот класс, создает пул соединений - WebSphere ресурс DataSource (источник данных). Имя пользователя и пароль для доступа к DB2 можно указать единожды при создании в DataSource. EJB-компонент в свою очередь тоже использует JNDI - для получения доступа с объекту DataSource. Для нужд данного приложения DataSource должен быть опубликован в контексте, и иметь JNDI-имя "DOROGADB". Для прикладного программиста разница в прямом использовании JDBC -драйвера и объекта DataSource ощутима только в коде запроса соединения. Вот как выглядит код, использующий JDBC -драйвер DB2 напрямую:
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
...
try{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver")
Connection conn=DriverManager.getConnection("jdbc:db2:DOROGADB","uid","pwd");
Statement stm = conn.createStatement();
...
} catch (Exceptin ex){
ex.printStackTrace(System.out);
}
А вот как выглядит код, использующий пул соединений и JNDI:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
imort javax.sql.DataSource;
import java.sql.Connection;
import java.sql.Statement;
...
try{
Context ctx = new InitialContext();
Object ref = ctx.lookup("DOROGADB");
DataSource ds = (DataSource)ref;
Connection conn = ds.getConnection();
Statement stm = conn.createStatement();
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.