IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Information Management  >

Интеграция пакета IBM Workplace Forms V2.6 с IBM DB2 версии 9

Использование XML-средств DB2 версии 9 в системе Workplace Forms

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Брайан Даниэл, инженер-консультант, IBM

19.06.2007

Узнайте, как использовать IBM DB2 версии 9 (IBM DB2 V 9) в качестве репозитория для хранения данных форм и как можно интегрировать DB2 с IBM Workplace Forms. IBM DB2 V 9 предоставляет возможность хранения XML-данных в исходном формате, то есть обеспечивает естественный союз с основанной на XML структурой форм Workplace Forms.

Как правило, в реляционных СУБД XML-данные хранятся в виде отдельного объекта "столбец-строка" (например, CLOB, BLOB или VARCHAR) или в виде XML-данных, разложенных ("разделенных") на несколько столбцов. Эти методы вызывают проблемы для многих приложений, включая увеличение времени разработки и сложность создания запросов, трудности в развитии схем в соответствии с новыми бизнес-требованиями и низкую производительность выполнения запросов к вложенным документам. Хранение XML-данных в базе данных в исходном формате позволяет пользователям полностью использовать преимущества новых возможностей XML-запросов, применять надежные функции индексации и хранения данных СУБД, увеличивать и изменять XML-схему.

Документы IBM Workplace Forms описаны полностью на XML, и естественным выбором является сохранение этих форм в базе данных с возможностью управления XML в исходных формах. На рисунке 1 показана общая архитектура, описанная в данной статье. Форма включает кнопку Submit (отправки), предназначенную для отправки HTTP-сообщения на серверный сервлет. Для извлечения данных и обработки формы этот сервлет использует API IBM Workplace Forms Server. Кроме того, можно выполнить любые операции бизнес-логики, например, размещение формы в потоке процессов. Для хранения формы в IBM DB2 версии 9 сервлет использует API IBM DB2 JDBC.


Рисунок 1. Общая архитектура
Обзор архитектуры

Остальная часть данной статьи разделена на этапы с описанием следующих операций:

  • Создание предварительных условий для интеграции;
  • Добавление к форме кнопки отправки;
  • Реализация сервлета, сохраняющего форму (и ее экземпляры данных на основе XML) в DB2 версии 9;
  • Применение DB2 V9 Control Center для проверки успешного сохранения данных формы.

Предварительные условия интеграции

Для запуска примера сервлета необходимо установить и настроить Workplace Forms Server API. Эти API используются сервлетом для извлечения данных из формы. Хотя для извлечения данных можно использовать базовые анализаторы XML, применение Workplace Forms Server API обеспечивает несколько преимуществ, среди которых: меньший объем кода, обработка цифровых подписей и возможность работы со сжатыми данными форм.

Важно обратить внимание на то, что вызовы Java Native Interface (JNI) к исходным библиотекам (то есть DLL) выполняют JAVA API. Для обеспечения поиска этих DLL-файлов убедитесь, что в системном пути указана папка "C:\Program Files\ibm\Workplace Forms\Server\2.6\API\redist\msc32". Кроме того, при выполнении API осуществляют поиск файла с именем PureEdgeAPI.ini, который определяет версию используемого API. Создайте файл PureEdgeAPI.ini в папке C:\Windows со следующим содержимым:

[API]
* = C:\Program Files\IBM\Workplace Forms\Server\2.6\API\redist\msc32\PureEdge\70

Подробные сведения по установке и настройке Workplace Forms Server API можно найти в руководстве Workplace Forms Server API Installation and Setup Guide.

Необходимо установить DB2 версии 9 и создать базу данных для хранения форм. (DB2 Express-C доступен для бесплатной загрузки). При использовании примера, прилагаемого к данной статье, запустите в окне команд DB2 следующие команды:

  1. Create db ordersdb using codeset utf-8 territory us;
  2. Connect to ordersdb;
  3. Create schema acme;
  4. Create table acme.orders [ID int primary key generated always as identity (start with 0 increment by 1), CUSTOMERNUM VARCHAR(64), CUSTOMERNAME VARCHAR(64), ORDERDETAIL XML, ORDERFORM XML];
  5. Disconnect ordersdb.
Данный набор команд служит для создания базы данных, содержащей одну таблицу. В каждой строке таблицы содержатся обычные реляционные данные и более новые данные на основе XML.

В заключение будет показано, как для сервлета интеграции используется IBM Rational Application Developer for WebSphere. Кроме того, сервлет запускается в среде тестирования IBM WebSphere Application Server V6.0 с Rational Application Developer. Можно загрузить полнофункциональную пробную версию Rational Application Developer.



В начало


Добавление к форме кнопки отправки

Для заполненной формы должен иметься механизм ее отправки, обработки и хранения. Одним из таких методов явялется простая XFDL-кнопка, отправляющая всю форму на сервлет. (Другой метод заключается в использовании кнопки XForms, позволяющей отправлять только экземпляр данных). В данном примере форма будет сохраняться целиком. Для демонстрации процесса отправки данных воспользуемся простой формой заказа (Purchase Order), загрузить которую можно по ссылке в разделе Download в конце статьи. Примечание: процесс добавления кнопки отправки можно также применять к собственным пользовательским формам). Пример формы заказа, разработанный с помощью IBM Workplace Forms Designer, содержит простые текстовые поля для получения пользовательских данных (см. рисунок 2).


Рисунок 2. Пример формы заказа
Пример формы заказа

Для обновления формы заказа (Purchase Order) запустите Workplace Forms Designer. Далее создайте новый проект. Для этого выберите меню File - New - Project. Создайте простой проект и назовите его FormsDB2V9. Затем, после создания проекта, импортируйте пример формы заказа. Для этого выполните следующие операции:

  1. Выберите меню File - Import;
  2. Выберите File System и нажмите Next;
  3. Найдите и выберите файл PurchaseOrder.xfdl;
  4. Задайте в качестве папки для импорта папку FormsDB2V9;
  5. Нажмите Finish.

После импорта дважды нажмите форму для ее открытия в Designer Perspective. В этой перспективе к форме можно добавить кнопку Submit (отправки) XFDL, как это показано на рисунке 3. После размещения на форме, щелкните по кнопке правой кнопкой мыши и выберите Convert Items - XFDL, чтобы убедиться, что используется кнопка нужного типа.


Рисунок 3. Добавление к форме кнопки Submit (отправки)
Добавление к форме кнопки отправки

Свойства кнопки следует задать в соответствии со значениями, указанными в таблице 1:


Таблица 1. Свойства кнопки отправки
СвойствоЗначение
sidcmdSubmit
valueSubmit
typeSubmit
urlhttp://localhost:9080/SaveFormApp/SaveForm

После добавления и настройки кнопки отправки экспортируйте форму. Для этого щелкнте по ней правой кнопкой мыши и выберите в контекстном меню Export. В качестве назначения экспорта выберите File System, затем следуйте запросам для сохранения формы в выбранной папке. При открытии формы в IBM Workplace Forms Viewer на ней должна появиться новая кнопка отправки. Но кнопка не действует, поскольку еще не реализован сервлет.




В начало


Реализация сервлета

После обновления примера формы заказа и включения в нее кнопки отправки займемся сервлетом, принимающим данные формы. Можно создать код сервлета в IDE, удобном для разработчика, но в данной статье описан процесс создания сервлета в Rational Application Developer. Для изучения работы сервлета импортируйте в новый проект предоставленный файл ресурса Web-приложений (WAR). В Rational Application Developer переключитесь на Web-перспективу (Windows - Open Perspective) и выполните следующие действия для импорта примера сервлета:

  1. Выберите меню File - Import;
  2. Выберите файл WAR и нажмите Next;
  3. Укажите WAR-файл SaveFormApp.war (доступен для загрузки по ссылке в конце данной статьи);
  4. В качестве целевого сервера выберите WebSphere Application Server V6.0;.
  5. Не изменяйте остальные значения/параметры, нажмите Finish. Проект должен выглядет так, как показано на рисунке 4.


Рисунок 4. Проект сервлета
Проект сервлета

Импортированное Web-приложение содержит два файла классов: SaveForm.java и DBController.java. SaveForm представляет класс сервлета и выполняет функции приема формы, для извлечения данных формы класс использует Workplace Forms Server API. DBController вызывается классом SaveForm и использует DB2 JDBC API для сохранения значений данных и формы в DB2. Хотя пример является завершенным, все же стоит выполнить упражнения и просмотреть определенные разделы реализации. Откройте класс сервлета SaveForm и найдите метод init() (листинг 1). Этот метод вызывается, когда сервлет впервые инициализируется контейнером. Обратите внимание, что Workplace Forms Server API инициализируется по вызову метода DTK.initialize().


Листинг 1. Инициализация Workplace Forms Server API
                
public void init(ServletConfig config) throws ServletException
{
	try
	{
		// Инициализация API
		DTK.initialize("SaveFormApp", "1.0.0", "7.0.0");
	}
	catch (Exception e)
	{
		System.out.println(e.getMessage());
		e.printStackTrace();
	}
}

Затем просмотрите метод doPost() (листинг 2), который вызывается при передаче формы в сервлет (то есть когда пользователь нажимает кнопку отправки, ранее добавленную к форме). Обратите внимание, что метод saveForm() вызывается для сохранения формы в базу данных. В этом методе содержится логика извлечения из формы необходимых данных экземпляра, а затем их сохранения в базу данных.


Листинг 2. Прием запроса на сохранение формы
protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
	throws ServletException, IOException 
{
	try
	{
		System.out.println("Received request to save form.");
		
		// Вызов метода для сохранения формы
		saveForm(req); 
		
		// При отсутствии ошибок выдается сообщение об успешном выполнении
		resp.getWriter().println("PO succesfully submitted.");
	}
	catch (Exception e)
	{
		// При возникновении ошибок выдается сообщение об ошибке
		resp.getWriter().println("Error: " + e.getMessage());
	}		
}

Хотя форму можно целиком сохранить в таблице в виде отдельной XML-структуры, в некоторых случаях можно сохранять значения основной формы в собственных столбцах вместе с формой на основе XML. Именно это сделано в примере, прилагаемом к данной статье. Идентификатор пользователя, имя пользователя и элементы заказа хранятся в виде значений в собственных столбцах. Форма сохраняется в четвертом столбце. При этом обеспечивается простой доступ к наиболее часто используемым данным исключительно реляционным способом, а также имеется возможность создавать запросы и работать с оставшимися структурированными XML-данными.

Основная задача по извлечению данных из формы и их передаче на хранение в базу данных обрабатывается методом saveForm() (листинг 3). Обратите внимание, что форма представляет собой ни что иное, как документ на основе XML, и ее можно обрабатывать при помощи стандартных XML-анализаторов на основе Java. Как было ранее указано, использование для работы с формой Workplace Forms Server API имеет определенные преимущества и является рекомендованным методом для форм Workplace Forms. Workplace Forms Server API предоставляют контейнер для анализаторов XML на основе Java, уменьшая таким образом объем кодирования. Работа со значениями и полями форм, использование цифровых подписей и обработка двоичных вложений - это всего лишь некоторые из функций, предоставляемые API. Кроме того, если форма отправлена в сжатом формате (доступная опция), Workplace Forms Server API прозрачно выполняют расжатие данных формы.

Использование Workplace Forms API для получения формы из объекта запроса и извлечения значений полей из формы представлено в листинге 3. Для извлечения специальных данных из формы несколько раз используется метод extractXFormsInstance() объекта FormNodeP. Первым параметром этого метода является идентификатор извлекаемой модели. Поскольку в данном примере используетеся модель по умолчанию, задано значение null. Второй параметр указывает на элемент экземпляра данных (то есть, custnumb в экземпляре данных с именем INSTANCE1), который требуется извлечь. Третий параметр определяет, следует ли также извлекать нехарактерные данные экземпляра. Четвертый параметр определяет, следует ли игнорировать ошибки проверок или ограничений. Пятый параметр null определяет, что узел, выполняющий этот метод, наследует необходимые пространства имен. Последний параметр представляет поток вывода, содержащий или хранящий извлеченные данные. Также важно обратить внимание на применение метода destroy(). Поскольку для доступа к базовым исходным библиотекам API используют JNI, сервлет должен в явном виде использовать метод destroy() для очистки использованных ресурсов и исключения утечек памяти.

Важно заметить, что при обработке объекта класса DBController пример сервлета передает в базу данных идентификатор пользователя и пароль в виде параметров. В данном примере используются идентификатор пользователя и пароль db2admin. Для запуска примера сервлета, возможно, потребуется обновить эти значения в соответствии со средой.


Листинг 3. Обработка запроса на сохранение формы
private void saveForm(HttpServletRequest req)
{
	FormNodeP theForm = null;
	ByteArrayOutputStream stream = new ByteArrayOutputStream();	
	
	try
	{
		// Получение XFDL-объекта из статического объекта IFSSingleton
		XFDL theXFDL = IFSSingleton.getXFDL();
		
		// Считывание формы из входного потока HTTP-запроса
		theForm = theXFDL.readForm(req.getInputStream(), 0);
			
		// Извлечение из формы числового значения пользователя. getValue()
		// является частным методом, отделяющим знаки < и >.
		stream.reset();
		theForm.extractXFormsInstance(null, 
			"instance('INSTANCE1')/customer/custnumb", 	false, false, null, stream);
		String customerNum = getValue( stream.toString() );
		System.out.println("customerNum=" + customerNum);
			
		// Извлечение из формы значения имени заказчика 
		stream.reset();
		theForm.extractXFormsInstance(null, 
			"instance('INSTANCE1')/customer/custname", false, false, null, stream);
		String customerName = getValue( stream.toString() );
		System.out.println("customerName=" + customerName);
			
		// Извлечение из формы сведений о заказе. Это полностью xml
		// структура для экземпляра данных INSTANCE2, соответствующая 
		// элементам items, выбранным в таблице заказа.
		stream.reset();
		theForm.extractXFormsInstance(null, 
			"instance('INSTANCE2')", false, false, null, stream);
		String orderDetail = stream.toString();	
		System.out.println("orderDetail=\n" + orderDetail);
			
		// Запись всей формы в виде переменной, поэтому ее также можно 
                // сохранить в базе данных вместе с полученными ранее метаданными. 
                // Эта переменная также представляет собой xml структуру.
		stream.reset();
		theForm.writeForm(stream, null, 0);
		String form = stream.toString();			
		
		// Использование класса DBController для записи идентификатора заказчика, 
                // имени заказчика, сведений о заказе и формы в базу данных. Примечание:  
                // сведения о заказе и форма хранятся в БД в исходном XML-формате.
		DBController dbController = new DBController("db2admin", "db2admin", "ordersdb");
		dbController.createOrder(customerNum, customerName, orderDetail, form);			
	}
	catch (Exception e)
	{
		System.out.println(e.getMessage());
		e.printStackTrace();
	}
	finally
	{
		// Блок кода finally вызывается сразу перед данным методом 
		// (независимо от возникновения ошибок). In here we call the XFDL.destroy()
		// для очистки ресурсов. ЕСЛИ НЕ ВЫЗЫВАТЬ ЭТОТ МЕТОД, ТО
		// ВОЗНИКНЕТ УТЕЧКА ПАМЯТИ, ПОСКОЛЬКУ БАЗОВЫЕ ИСХОДНЫЕ БИБЛИОТЕКИ 
		// Е БУДУТ ОСВОБОЖДАТЬ ВЫДЕЛЕННУЮ ДЛЯ НИХ ПАМЯТЬ!!!
		
		if ( theForm != null )
		{
			try 
			{
				theForm.destroy();
			} 
			catch (Exception e) 
			{
				System.out.println(e.getMessage());
				e.printStackTrace();
			}
		}
	}		
}	

Сохранение пробелов
При хранении форм на основе XML в DB2 в виде исходного XML-документа убедитесь, что используется опция сохранения пробелов. Если данную опцию не использовать, при записи формы символы пробелов будут удалены. Если форма ранее подписана, она будет считаться недостоверной, поскольку изменилось исходное содержимое. В результате, при извлечении формы из базы данных для просмотра клиент Workplace Forms Viewer выводит предупредительное сообщение о том, что форма изменена.

Остальная часть кода, важная для этой реализации, содержится в методе DBController.createOrder() (представленном в листинге 4). После извлечения данных формы метод sameForm() вызывает метод DBController.createOder() для сохранения формы в базе данных. Если пользователи ранее работали с JDBC API, эта часть кода должна быть им знакома. Обратите внимание на два важных различия. Первое заключается в применении в SQL-команде функции xmlparse, используемой для выполнения явного анализа данных для XML-хранения. Второе относится к опции сохранения пробелов, относящейся к сохранению ограничивающих символов пробелов, определенных в XML-документе. Если данную опцию не включить, перед записью в базу данных форма будет изменена (ограничивающие пробелы будут удалены). Если форма была подписана, то она будет считаться недействительной.


Листинг 4. Сохранение данных формы в базу данных
public void createOrder(String customerNum, String customerName, 
	String orderDetail, String theForm) throws Exception
{		
	Connection conn = null;
	
	try
	{
		conn = getConnection();
							
		PreparedStatement pstmt = conn.prepareStatement("INSERT INTO 
			ACME.ORDERS (CUSTOMERNUM, CUSTOMERNAME, ORDERDETAIL, ORDERFORM) 
			VALUES (?, ?, xmlparse(document cast(? as clob(5k)) preserve whitespace), 
			xmlparse(document cast(? as clob(512k)) preserve whitespace))");
	
		pstmt.setString(1, customerNum );
		pstmt.setString(2, customerName );
		pstmt.setString(3, orderDetail );						
		pstmt.setString(4, theForm );
			
		int rc = pstmt.executeUpdate();
			
		pstmt.close();
	}
	catch (Exception e)
	{			
		System.out.println("Error storing form in DB. Msg=" + e.getMessage());		
		throw new Exception(e.getMessage());
	}	
	finally 
	{
		try 
		{
			if (conn!=null) conn.close();
		}
		catch (Exception e) {}
	}
}



В начало


Запуск сервлета

Для разработки и тестирования сервлета используйте среду тестирования WebSphere Application Server V6.0. Данная среда позволяет быстро изменить и повторно развернуть код сервлета. Кроме того, в коде можно создавать точки прерывания, что позволяет применять отладчик. В Rational Application Developer создайте конфигурацию сервера для данного проекта. Для этого выполните следующие действия:

  1. Выберите меню File - New - Other, затем Server - Server и нажмите кнопку Next;
  2. Выберите Websphere v6.0 Server в качестве типа сервера и нажмите Next;
  3. Нажмите Next, не изменяя настроек и порта сервера по умолчанию;
  4. На экране добавления и удаления проектов "Add and Remove Projects" выберите проект, в который импортирован WAR-файл (SaveFormAppEAR) и нажмите кнопку Add для перемещения этого проекта в список сконфигурированных проектов;
  5. Нажмите Finish для сохранения новой конфигурации сервера.
После создания конфигурации сервер необходимо запустить. Для этого перейдите в панель Servers (Window - Show View - Servers). Выберите новый созданный сервер и нажмите кнопку Start, как это показано на рисунке 5.


Рисунок 5. Запуск WebSphere v6.0 Server
Запуск WebSphere v6.0 Server

Для отображения консоли сервера перейдите на вкладку Console (Window - Show View - Console). В консоли можно просмотреть ход запуска сервера. В этой консоли также отображаются все сообщения/ошибки, выводимые сервлетом интеграции.

Для успешного использования сервлетом DB2 JDBC API необходимо обновить параметр classpath сервера приложений. Если этого не сделать, не будет обнаружено исключение класса COM.ibm.db2.jdbc.app.DB2Driver. После запуска сервера выполните следующие действия и используйте консоль администрирования WebSphere Application Server для обновления параметра classpath:

  1. Откройте браузер и введите в адресной строке http://localhost:9060/ibm/console;
  2. Зарегистрируйтесь как admin;
  3. Разверните узел Servers - Application Servers и выберите server1;
  4. Разверните раздел с именем Java and Process Management;
  5. Перейдите к узлу Process Definition - Java Virtual Machine;
  6. Выберите поле свойств с именем classpath, затем введите местоположение файла db2java.zip (C:/Program Files/ibm/SQLLIB/java/db2java.zip);
  7. Нажмите OK. Нажмите ссылку Save в верхней части страницы для сохранения изменений;
  8. Перезапустите сервер для обновления classpath. Для этого вернитесь в панель Servers (Windows - Show View - Servers). В этой панели можно остановить и снова запустить сервер приложений.



В начало


Сохранение формы

После запуска сервлета сборку можно протестировать. Для этого откройте файл PurchaseOrder, ранее обновленный и экспортированный в файловую систему из Workplace Forms Designer. Заполнив форму, нажмите кнопку Submit. В это время средство просмотра выполняет отправку HTTP-сообщения по URL-адресу, определенному в операции submit (в данном примере http://localhost:9080/SaveFormApp/SaveForm). Перед сохранением формы в базе данных сервлет выводит данные о пользователе в консоль, как это показано на рисунке 6.


Рисунок 6. Выходные данные в консоли
Выходные данные в консоли

Если выводится похожее сообщение об ошибке, убедитесь, что в системном пути указана папка с файлом pe_cc.dll:

SRVE0100E: Did not realize init() exception thrown by servlet SaveForm:
java.lang.UnsatisfiedLinkError: Can't find library pe_cc (pe_cc.dll) in
sun.boot.library.path or java.library.path

Убедиться, что данные сохранены в DB2, можно при помощи центра управления DB2 (DB2 Control Center) или с помощью запросов в строке команд DB2. Для использования DB2 Control Center выполните следующие действия:

  1. Запустите DB2 Control Center;
  2. Перейдите к All Databases - ORDERSDB - Tables;
  3. Нажмите правой кнопкой мыши таблицу ORDERS и выберите Open. В строке данных таблицы отображаются как обычные данные, так и данные XML-типа. В двух столбцах XML-типа содержатся таблица заказов и форма;
  4. Нажмите кнопку "..." в столбце ORDERDETAIL для просмотра сохраненного экземпляра XML-данных (см. рисунок 7).

Рисунок 7. DB2 Control Center - столбец ORDERDETAIL
DB2 Control Center - столбец ORDERDETAIL

Кроме того, для тестирования сохраненных данных формы в окне команд DB2 можно выполнять простые запросы. В таблице 2 представлены некоторые из таких запросов.


Таблица 2. Свойства кнопки отправки
Команда запросаОписание
select * from ACME.ORDERSВозвращает все данные, как реляционные, так и XML-данные, сохраненные в таблице заказов.
xquery db2-fn:xmlcolumn('ACME.ORDERS.ORDERDETAIL')/order/itemВозвращает заказанные элементы в XML-формате.
xquery db2-fn:xmlcolumn('ACME.ORDERS.ORDERDETAIL')/order/item[itemname='Nail']/quantityВозвращает заказанное количество элементов Nail.



В начало


Заключение

В этой статье было показано, как можно интегрировать IBM Workplace Forms с IBM DB2 версии 9. Более конкретно, форма была сохранена в базе данных DB2 версии 9 (DB2 V9) с сохранением структуры экземпляра данных на основе XML. Для этого к форме заказа была добавлена кнопка отправки всей формы на сервлет. Затем в IBM Rational Application Developer была настроена среда для тестирования примера сервлета интеграции. Данный сервлет для извлечения данных из формы использует IBM Workplace Forms Server API. Затем JDBC API применяются для сохранения данных и формы в базе данных. Наконец, DB2 Control Center был использован для проверки фактического сохранения формы в базе данных и подтверждения сохранения XML-иерархии.

Описанный в данной статье сервлет интеграции можно улучшить за счет добавления кода, необходимого для размещения отправленной формы в потоке процессов. Кроме того, IBM Workplace Forms API можно использовать для обновления формы перед ее сохранением по уникальному идентификатору. При этом, в случае дальнейшего извлечения формы из базы данных, ее обновления и повторной отправки, сервлет вместо создания новой строки может обновить соответствующую строку в базе данных.




В начало


Загрузка

ИмяРазмерМетод загрузки
SaveFormApp.war1131 KBHTTP
PurchaseOrder.xfdl26 KBHTTP
Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии

Обсудить


Об авторе

Брайан Даниэл (Bryan Daniel) является инженером-консультантом в IBM ISV и Developer Relations. В настоящее время он обеспечивает комплексную поддержку разработчиков решений на основе программных продуктов WebSphere Portal и Lotus Collaborative. У него также есть опыт работы в области IBM DB2 Content Management, Брайан является соавтором сертификационного теста и учебного руководства по DB2 Content Manager версии 8.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты