Разработка программного обеспечения при помощи технологий Java и PHP в AIX 5.3 : Часть 3. Интеграция бизнес-приложения на Java с DB2 Version 9

Для AIX® можно создавать приложения, одновременно использующие технологии Java™ и PHP-технологии. Java-код используется для реализации основной логики работы приложения, а для реализации Web-интерфейса применяются все преимущества PHP. В этой статье будет показано, как связать приложение, созданное во второй части цикла, с базой данных DB2(R) для хранения вопросов и ответов анкеты.

Мартин Браун, внештатный автор, консультант

Мартин Браун (Martin Brown) пишет статьи уже более семи лет. Он является автором многочисленных книг и статей по различным темам. Его квалификация охватывает множество платформ и языков разработки - Perl, Python, Java™, JavaScript, Basic, Pascal, Modula-2, C, C++, Rebol, Gawk, Shellscript, Windows®, Solaris, Linux, BeOS, Mac OS X и т.д., а также Web-программирование, системное управление и интеграция. Мартин является внутренним экспертом (SME) компании Microsoft® и регулярно пишет для ServerWatch.com, LinuxToday.com и IBM developerWorks. Он также принимает участие в блогах Computerworld, The Apple Blog и на других сайтах. Связаться с ним можно через его Web-сайт.



Дуг Монро, консультант по системному администрированию, DMA Inc.

Дуг Монро (Doug Monroe) работает консультантом и преподавателем по системному администрированию UNIX в DMA Inc. Он обладает степенью бакалавра компьютерных наук, полученной в Университете штата Орегон (Oregon State University), и обеспечивает поддержку различных UNIX-систем с 1984 года. Связаться с ним можно по электронной почте monroe@sqnt.com.



28.04.2008

Об этом цикле статей

PHP является ведущим языком для Web-разработки, а технология Java® широко используется при разработке бизнес-приложений. Таким образом, для использования сильных сторон каждого языка в ОС AIX™ Version 5.3 был реализован PHP Java Bridge. Этот цикл статей объясняет, как при программировании для AIX 5.3 интегрировать технологии PHP и Java при разработке Web-приложений.

Для этого в соответствии с перечисленными ниже этапами разработки ПО будет создано простое приложение для анкетирования:

  • Разработка основного Java-приложения.
  • Расширение Java-приложения до Web-приложения посредством Java-сервлетов.
  • Добавление возможности хранения информации внутри базы данных.
  • Представление исходного приложения в качестве Web-сервиса и создание PHP-интерфейса к этому приложению.
  • Повторная разработка PHP-интерфейса с использованием специального PHP Java Bridge.

Этот цикл статей состоит из 6 частей:

  • Часть 1 рассматривает приложение и подготавливает среду для создания Java-приложений и поддержку Web-приложений на Java при помощи Tomcat.
  • Часть 2 посвящена основному коду приложения и разработке простого Java-сервлета для предоставления Web-интерфейса к информации.
  • Часть 3 связывает основное приложение с базой данных DB2® для хранения запросов и ответов.
  • Часть 4 преобразует исходное приложение в приложение, доступ к которому осуществляется как к Web-сервису, и создает основу PHP-интерфейса.
  • Часть 5 затрагивает создание PHP-интерфейса к Java-приложению при помощи PHP Java Bridge.
  • Часть 6 реконструирует приложение, чтобы использовать PHP Java Bridge вместо интерфейса Web-сервиса.

Введение

В этой статье проводится интеграция бизнес-приложения на Java, созданного во второй части, с базой данных DB2 Version 9. Данные, содержащиеся в базе данных, будут предоставляться бизнес-приложением на Java, и впоследствии их можно использовать для сбора статистической информации по ответам.

Эта статья охватывает:

  • Использование базы данных в приложении для анкетирования.
  • Установку DB2.
  • Структуру базы данных.
  • Создание таблиц базы данных.
  • Вставку данных в таблицы.
  • Создание отчетов о хранимых данных.

Назначение базы данных

База данных этого приложения выполняет несколько функций. С точки зрения сбора и хранения данных база данных предоставляет приложению простой способ сохранить данные. Существует много возможных решений для хранения информации, от использования текстовых файлов до полноценных реляционных СУБД, таких как сервер базы данных IBM DB2.

Текстовые файлы не подходят для хранения данных Web-приложения, подобного нашему, из-за высокого параллелизма. В решении на основе базы данных корпоративного класса проблемы с блокировками и порчей данных решаются ядром базы данных.

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

База данных нужна для хранения необработанных данных, полученных из анкеты, и для представления информации приложению.

Установка DB2 Version 9 на AIX

Несмотря на то, что DB2 Version 8 доступен на инсталляционном диске AIX, мы решили использовать DB2 Version 9 на случай, если позже потребуется воспользоваться преимуществами возможностей DB2 Version 9 PureXML. IBM предоставляет 90 дней для ознакомительного использования корпоративного сервера DB2 Version 9. Ознакомительная версия, системные требования и ссылки на документацию по инсталляции доступны в разделе Ресурсы.

Для инсталляции DB2 Version 9 на AIX необходимо 64-битное ядро уровня 5300-04, Service Pack 5300-04-02 и библиотека C++ уровня среды исполнения - xlC.rte 8.0.0.4.

На используемом сервере AIX 5L™ pSeries® для определения текущего уровня ядра выполним команду oslevel -s; если окажется, что уровень ядра равен 5300.0.3, значит его надо обновить. В разделе Ресурсы есть ссылка на обновления AIX.

Узнать, какая версия среды исполнения C++ установлена на используемой системе, можно с помощью команды lslpp. Если команда lslpp -L xlC.rte выведет для используемого сервера версию 6.0.0.0, то среду выполнения C++ надо обновить. Ссылки на Fix Central, где можно получить обновления, можно найти в разделе Ресурсы.

Если на системе до сих пор не установлен Web-браузер, надо его установить. Версию Mozilla для AIX можно загрузить с сайта IBM (см. раздел Ресурсы).

База данных DB2 Version 9 легко инсталлируется. При желании можно использовать интерфейс X-windows для инсталляции в графическом режиме.

  1. Загрузим на сервер AIX программное обеспечение. Для этого требуется регистрация, но она бесплатна. Название файла - db2_v9_ese_aix.tar.gz.
  2. Под учетной записью root распакуем образ gzip tar и выполним установку DB2 (см. листинг 1).
    Листинг 1. Распаковка и установка DB2
    # gunzip -c db2_v9_ese_aix.tar.gz | tar -xvf -
    # cd ese_t/disk1
    # ./db2setup

    На стартовой странице можно можно по ссылкам просмотреть документацию по DB2 (для этого требуется Web-браузер).
  3. Для продолжения установки выберем пункт Install a Product (инсталлировать продукт).
  4. Выберем Install New to enter the DB2 Setup Wizard. Мастер установки поможет выполнить оставшуюся часть инсталляции.

Есть несколько моментов, которые следует знать при инсталляции:

  • Каталогом установки по умолчанию для DB2 является /opt/IBM/db2/V9.1. Для установки данного продукта требуется 474MB. У меня не было столько свободного места в каталоге /opt моего сервера, поэтому для этого упражнения я предпочел создать новую файловую систему, /DB2. А установочным каталогом я сделал каталог /DB2/V9.1.
  • Мастер инсталляции создает в системе административные регистрационные имена. По умолчанию база данных, созданная пользователем, будет находиться в домашнем каталоге этого пользователя. Я решил поместить эти домашние каталоги в /DB2, поэтому домашним каталогом будет /DB2/home.

Продолжим работу с мастером инсталляции корпоративного сервера DB2.

Проверим только что установленную систему, установив тестовую базу данных. Чтобы сделать это, войдем в систему под учетной записью db2inst1 и выполним следующие команды (команды выделены полужирным шрифтом):

  1. Запустим программу администрирования базы данных командой db2start (см. листинг 2).
    Листинг 2. Выполнение команды db2stsart
    $ db2start
    06/09/2007 12:46:46     0   0   SQL1063N  DB2START processing was successful.
    SQL1063N  DB2START processing was successful.
  2. Создадим тестовый образец базы данных при помощи команды db2sampl (см. листинг 3).
    Листинг 3. Создание тестовой базы данных
    $ db2sampl
    
    Creating database "SAMPLE"...
    Connecting to database "SAMPLE"...
    Creating tables and data in schema "DB2INST1"...
    
    'db2sampl' processing complete.
  3. Для проверки подключимся к базе данных и выполним запрос к ней (см. листинг 4).
    Листинг 4. Проверка того, что база данных была создана
    $ db2
    (c) Copyright IBM Corporation 1993,2002
    Command Line Processor for DB2 ADCL 9.1.0
    
    db2 => connect to sample
    
    Database Connection Information
    
    Database server        = DB2/AIX64 9.1.0
    SQL authorization ID   = DB2INST1
    Local database alias   = SAMPLE
    
    db2 => select * from staff where dept = 20
    
    ID     NAME      DEPT   JOB   YEARS  SALARY    COMM
    ------ --------- ------ ----- ------ --------- ---------
    10 Sanders       20 Mgr        7  98357.50         -
    20 Pernal        20 Sales      8  78171.25    612.45
    80 James         20 Clerk      -  43504.60    128.20
    190 Sneider       20 Clerk      8  34252.75    126.50
    
    4 record(s) selected.
    
    db2 => quit
    DB20000I  The QUIT command completed successfully.
    $

Теперь, когда DB2 установлена, можно приступить к ее использованию в связке с бизнес-приложением.

Подключение бизнес-приложения на Java к базе данных DB2

Для подключения базы данных к бизнес-приложению на Java лучшим решением будет использовать интерфейс JDBC (Java Database Connectivity interface). JDBC является интерфейсом для доступа к базе данных, одинаковым для любой системы базы данных, для которой существует соответствующий драйвер JDBC. JDBC является универсальным решением, используемым при разработке приложений, где конечная целевая платформа базы данных неизвестна.

Для нашей задачи JDBC является наиболее удобным методом подключения к системе DB2. Стандартная схема подключения к базе данных DB2 с использованием JDBC и бизнес-приложения на Java показана в листинге 5.

Листинг 5. Простое подключение JDBC
import java.sql.*;

public class PHPJavaAddData {
    public static void main(String[] args) {
        Connection conn = null;
        
        try {
            Class.forName("com.ibm.db2.jcc.DB2Driver");
            conn = DriverManager.getConnection("jdbc:db2://localhost:50000/SURVEY",
                    "db2inst","surveypw");
            System.out.println("Yay, connected");
        } catch (Exception ex) {
            System.out.println("SQLException: " + ex.getMessage());
        }
    }
}

URL-адрес для подключения = строка, передаваемая в метод getConnection(), определяет базу данных (DB2), имя хоста, на котором расположен сервер базы данных, имя базы данных и имя пользователя с паролем, которые используются при соединении.

Чтобы скомпилировать и запустить эти JDBC-примеры, использовались тестовое регистрационное имя владельца db2inst1 и пароль surveypw. Необходимо модифицировать эту пользовательскую среду, определив путь к исполняемым файлам java5 и добавив в переменную CLASSPATH путь к jar-файлам DB2 JDBC. Также нам понадобится главный jar-файл JDBC и лицензионное соглашение, поставляемое с ним, которые доступны внутри каталога Java. Для выполнения всех этих действий нужно войти систему под учетной записью db2inst1 и выполнить следующие команды:

$ PATH=/usr/java5_64/bin:$PATH
$ export PATH
$ CLASSPATH=/DB2/V9.1/java/db2jcc.jar:/DB2/V9.1/java/db2jcc_license_cu.jar:.
$ export CLASSPATH

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

Затем необходимо создать базу данных SURVEY:

$ db2 create database SURVEY

Для каждого из примеров скомпилируем и выполним соответствующий программный код (например, файл PHPJavaAddData.java из примера выше):

$ javac PHPJavaAddData.java
$ java PHPJavaAddData

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

Создание структуры базы данных

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

В зависимости от сложности анкеты способы организации базы данных могут сильно разниться. Для простой анкеты вполне возможно поместить всю информацию о каждом вопросе в поле одной таблицы. Для этого необходимо, чтобы анкета и таблица оставались неизменными, или по крайней мере синхронизировались, поскольку незначительное изменение в анкете (которая запрограммирована в классах бизнес-приложения на Java) будет требовать изменения в полях таблицы для этой анкеты.

Это означает, что необходимо создать более гибкую структуру базы данных, которая сможет принимать более гибкие входные данные (согласно формату анкеты), что означает необходимость создания отдельной таблицы для хранения результатов, где каждая строка таблицы содержит информацию только по одному вопросу.

Чтобы идентифицировать все ответы (на все вопросы) для отдельной анкеты (и, например, для отдельного пользователя), понадобится способ идентифицировать группу ответов в целом и вопросы анкеты по отдельности. Это позволит получать информацию из базы данных как по анкете в целом для конкретного пользователя, так и для сопоставления ответов из нескольких анкет.

На рисунке 1 показана простая структура базы данных.

Рисунок 1. Простая структура базы данных
Простая структура базы данных

Первая таблица survey_response используется для сопоставления ответов с анкетой, а уникальный идентификатор (unique ID, последовательный тип данных) используется для идентификации анкеты и вопросов, на которые получен ответ. В примере структуры базы данных выше определено только одно поле, уникальный идентификатор, которое будет автоматически генерироваться базой данных. Для идентификации групп ответов в таблице survey_response_detail будет использоваться уникальный идентификатор. Нельзя использовать поле с автоинкрементным значением в таблице survey_response_detail: для каждой группы ответов это значение должно быть уникальным. Так как мы храним каждый ответ в отдельной строке, то новый уникальный идентификатор мы получаем для каждого отдельного вопроса, а не для анкеты в целом, что нежелательно.

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

Java-класс CreateDB в листинге 6 создает таблицы, которые потребуются.

Листинг 6. Создание таблиц для приложения
import java.sql.*;

public class CreateDB {
    public static void main(String[] args) {
        Connection conn = null;
        
        try {
            Class.forName("com.ibm.db2.jcc.DB2Driver");
            conn = DriverManager.getConnection("jdbc:db2://localhost:50000/SURVEY",
                    "db2inst1","surveypw");
            
            Statement s = conn.createStatement();
            
            s.executeUpdate("CREATE TABLE survey_response (" +
                    "responseid int GENERATED ALWAYS AS IDENTITY
                    PRIMARY KEY" +
                    ")");
            
            s.executeUpdate("CREATE TABLE survey_response_detail (" +
                    "responseid int, " +
                    "question int, " +
                    "subquestion int, " +
                    "responsenumeric int," +
                    "responsestring varchar(40)" +
                    ")");
            
            s.close();
            
        } catch (Exception ex) {
            System.out.println("SQLException: " + ex.getMessage());
        }
    }
}

Теперь рассмотрим, как организована и хранится информация в базе данных и как можно обновить информацию, когда ответ на анкету получен.

Добавление ответов на анкету в базу данных

Для добавления результатов анкетирования в базу данных необходимо получить уникальный идентификатор анкеты, которая была заполнена, для этого в таблице survey_results придется использовать автоматическое приращение на единицу. Информация добавляется в таблицу при помощи оператора INSERT.

Необходимо выполнить следующие три шага в Web-приложении:

  1. Открыть соединение к базе данных в методе init() сервлета.
  2. Получить уникальный номер ответа путем вставки пустой строки в таблицу survey_response и получения автоматически сгенерированного значения.
  3. Для каждого вопроса в анкете вставить запись в базу данных.

Первый шаг является простым: надо добавить параметр соединения в созданный класс сервлета, а затем для открытия соединения использовать соответствующий класс, приведенный выше, как показано в листинге 7.

Листинг 7. Обновление метода init()
public void init(javax.servlet.ServletConfig config) {
    this.survey.add(new SurveyQuestionText("Name",
            "Enter your full name"));
    this.survey.add(new SurveyQuestionRadio("Favourite colour",
            "Enter your favourite colour",
            new String[] {"Red", "Blue", "Green"}));
    
    try {
        Class.forName("com.ibm.db2.jcc.DB2Driver");
        conn =
                DriverManager.getConnection("jdbc:db2://localhost:50000/SURVEY",
                "db2inst","surveypw");
    } catch (Exception ex) {
        System.out.println("SQLException: " + ex.getMessage());
    }
}

Чтобы получить уникальный идентификатор ответа, необходимо вставить строку в таблицу, что приведет к созданию нового идентификатора, который можно впоследствии использовать. Идентификатор создается автоматически ядром базы данных; приращение идентификатора также происходит автоматически, что гарантирует уникальность идентификатора. При выполнении инструкции INSERT необходимо добавить опцию RETURN_GENERATED_KEYS, которая вернет автоматически сгенерированное значение.

Для получения автоматически сгенерированного идентификатора можно использовать метод getGeneratedKeys(). Этот метод возвращает объект resultset, и для получения нового уникального идентификатора необходимо первое значение, возвращаемое этим объектом. В листинге 8 приведен код этой операции.

Листинг 8. Получение уникального идентификатора для отдельной анкеты
try {
    s = conn.createStatement();
    s.executeUpdate(
            "INSERT INTO survey_response (responseid) "
            + "values (0)",
            Statement.RETURN_GENERATED_KEYS);
    
    rs = s.getGeneratedKeys();
    
    if (rs.next()) {
        responseid = rs.getInt(1);
    } else {
        System.out.println("Can't get auto incremement data");
        out.println("Sorry, we couldn't write your responses into the DB");
    }
    
    rs.close();
    s.close();
} catch (Exception ex) {
    System.out.println("SQLException (getting responseid): " +
            ex.getMessage());
}

Наконец, надо сформировать подходящую инструкцию INSERT и записать данные в базу данных. Данные шаги должны быть сделаны для каждого вопроса в анкете, поэтому сделать их можно при помощи того же цикла в сервлете, который использовался ранее для вывода результатов анкетирования (см. листинг 9).

Листинг 9. Вставка данных из анкеты
for(Iterator<SurveyQuestion> i = this.survey.iterator(); i.hasNext(); ) {
    SurveyQuestion question = (SurveyQuestion) i.next();
    question.showquestion(out,false);
    out.println("<p>" + request.getParameter("field" + fieldid));
    
    try {
        ps = conn.prepareStatement(
                "INSERT INTO survey_response_detail " +
                "(responseid, question, responsestring) VALUES(?,?,?)");
        ps.setString(1,responseid.toString());
        ps.setString(2,fieldid.toString());
        ps.setString(3,request.getParameter("field" + fieldid));
        int count = ps.executeUpdate();
        ps.close();
    } catch (Exception ex) {
        System.out.println("SQLException (adding question result): " +
                ex.getMessage());
    }
    fieldid++;
}

Выше использовалось заранее откомпилированное выражение SQL для упрощения процесса ввода данных. Можно постоянно использовать одно и то же откомпилированное выражение и каждый раз лишь менять данные в нем, но в данной ситуации для цельности приложения принято решение заново создавать на каждой итерации цикла это выражение.

Создание отчетов со статистическими данными на основе содержимого базы данных

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

Написав подходящий SQL-запрос, который извлекает информацию, можно использовать базу данных для получения статистических данных о полученных ответах. Например, используя запрос, показанный в листинге 10, из базы данных можно получить количество респондентов, которые выбрали своим любимым цветом (вопрос 2) красный.

Листинг 10. Запрос количества респондентов, чей любимый цвет - красный
SELECT count(responsestring) FROM survey_response_detail
WHERE question = 2 AND
responsestring = 'red'

Этот запрос предоставляет один результат - количество случаев выбора ответа "красный" на второй вопрос среди всех респондентов.

Или можно, используя оператор GROUP BY, получить количество вхождений в базу данных других цветов. Этот оператор сортирует результаты по уникальным значениям заданного поля. Таким образом, можно написать запрос, который возвращает количество случаев вхождения отдельных значений, соответствующих определенному полю, сгруппированное по уникальному значению в этом поле, которое в данном случае является строкой ответа. Запрос в листинге 11 возвращает количество случаев вхождения в базу данных уникальных значений поля responsestring для вопроса 2.

Листинг 11. Возврат количеств уникальных значений поля responsestring
SELECT count(responseid),responsestring FROM survey_response_detail
WHERE question = 2
GROUP BY responsestring

Теперь мы получим многострочный результат, где каждая строка состоит из уникального значения (красный, голубой и зеленый) и соответствующего количества вхождений этих значений в таблицу.

Использование базы данных для хранения вопросов

Поскольку база данных уже используется для хранения результатов, имеет смысл хранить в ней вопросы анкеты. Хотя всю запутанность системы анкетирования трудно объяснить в такой небольшой статье, можно представить простую структуру базы данных, состоящую из таблицы для вопросов анкеты, номера вопроса, типа вопроса, и другую таблицу для возможных вариантов ответа на вопрос (при работе с кнопкой выбора и флажком). Эта стандартная структура базы данных представлена на рисунке 2.

Рисунок 2. Структура базы данных для вопросов анкеты
Структура базы данных для вопросов анкеты

Создание вопроса анкеты внутри метода init() сервлета теперь может быть выполнено за счет выполнения запроса SELECT к базе данных и создания объектов, необходимых для выполнения остальной части приложения.

Заключение

В этой статье объясняется, как расширить функциональность приложения для анкетирования для хранения информации в базе данных. Сначала было показано, как установить базу данных DB2, потом мы уточнили, что именно необходимо хранить в базе данных и какая у нее для этого должна быть структура.

Во второй части в исходный класс сервлета WebSurvey был добавлен код, позволяющий записывать информацию в базу данных. Также был дан беглый обзор того, как можно использовать информацию, хранящуюся в базе данных, для предоставления статистических результатов, что и является конечной целью приложения.


Загрузка

ОписаниеИмяРазмер
Исходный код части 3au-surveydb.zip6KB

Ресурсы

Научиться

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

  • IBM trial software: ознакомительные версии программного обеспечения для разработчика, которые можно загрузить со страницы developerWorks.(EN)
  • Tomcat: последняя версия этого пакета.(EN)
  • Java 5 64-bit SDK: для загрузки этого пакета необходимо пройти бесплатную процедуру регистрации. (EN)
  • Mozilla: Web-браузер Mozilla для ОС AIX может быть загружен с сайта IBM.(EN)
  • A 90-day evaluation: ознакомительная версия корпоративного сервера DB2 Version 9 от IBM. (EN)
  • Quick links for AIX fixes: исправления и обновления для AIX.(EN)
  • IBM Fix Central: исправления и обновления для системного программного обеспечения, оборудования и операционной системы. (EN)
  • Eclipse Web site: интегрированная среда разработки Eclipse. (EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы в первый раз заходите в developerWorks. Выберите данные в своем профиле (имя, страна/регион, компания) которые будут общедоступными и будут отображаться, когда вы публикуете какую-либо информацию. Вы можете изменить данные вашего ИБМ аккаунта в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX, Технология Java
ArticleID=304715
ArticleTitle=Разработка программного обеспечения при помощи технологий Java и PHP в AIX 5.3 : Часть 3. Интеграция бизнес-приложения на Java с DB2 Version 9
publish-date=04282008