Логин:   Пароль:




Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100

Java: СтатьиПостроение поисковой системы с использованием JAVA – сервлетов

Построение поисковой системы с использованием JAVA – сервлетов

Предлагаемая статья посвящена построению модели поисковой системы (сайта) с использованием Java–сервлетов. Была создана и обоснована модель: HTML–страничка – JAVA-сервлет – база данных в Microsoft Access - HTML–страничка. Разработанная в проекте технология может быть использована при решении широкого спектра задач объектно–ориентированного дизайна.

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

Ранее такие проекты (сайты) были созданы на базе других ВУЗов. Во многих из них количество зарегистрированных членов превышает 3000, что позволяет делать вывод о том, что такие сайты достаточно популярны. При создании сайтов национального аэрокосмического университета им. Н.Е.Жуковского (www.artcross.al.kharkov.com/people/searchpeople.php) , Санкт-Петербургского Гуманитарного Университета Профсоюзов (www.gup.ru/vipusk/poisk.html) и Московского Государственного Университета им. М.В. Ломоносова (www.guru.ru/grd/search.php) использовалась технология PHP. В статье для решения подобного рода задач применяются технологии объектно – ориентированного программирования, а именно разработана и внедрена на примере конкретной задачи модель поисковой системы: HTML–страничка – JAVA-сервлет – база данных в Microsoft Access - HTML–страничка.

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

Рассмотрим разницу между CGI и Fast CGI технологиями и работой Java based Web Server. Когда Web-сервер получает CGI (Common Gateway Interface) - запрос, ему нужно запустить постороннюю программу, дать возможность этой программе выполниться и затем завершиться, и после этого вернуть полученный в результате выполнения текст в Web-браузер. Ещё больше осложняет ситуацию то, что большинство современных Web-приложений предполагают наличие некоего подобия доступа к базам данных. Каждый раз во время выполнения CGI должно создаваться новое обращение к базе данных, которое занимает несколько секунд. Технология, использованная при решении поставленной в проекте задачи, позволяет преодолеть недостатки этих и других сайтов.


Рис. 1. Разница между CGI и Fast CGI технологиями.

Технология PHP, широко используемая разработчиками поисковых систем, являющаяся в отдельно взятых случаях средством погашения всех свободных ресурсов сервера, отличается от технологии Java тем, что не используется единый главный процесс для всех пришедших на сервер запросов. На рис.1 показана разница между технологиями CGI и Fast CGI. В предлагаемом проекте использованы JAVA–сервлеты и связанные с ними новые технологии. На рис. 2. показана работа Java Web Server. Отметим многопоточность в едином процессе. Множество сервлетов выполняются параллельно в рамках одного процесса на сервере и по своей производительности превосходят как CGI, так и Fast-CGI приложения. Сервлетам нет необходимости перезагружать процесс при каждом новом запросе, и это также повышает их быстродействие.


Рис. 2. Работа Java based Web Server.

Сервлеты устойчивы, платформенно независимы, обладают всеми необходимыми качествами, включая защиту данных, упрощённый доступ к данным и облегченный способ интеграции с Java-аплетами. Сервлеты, являющиеся частью предлагаемого проекта, имеют целый ряд преимуществ по сравнению с CGI – технологиями. Основные преимущества сервлетов таковы:

  1. Независимость от платформы. Сервлеты могут выполняться на любой платформе без необходимости рекомпилирования или модификации. Скрипты на PERL тоже могут мигрировать с платформы на платформу, однако расширения для CGI и серверов, написанные на языках высокого уровня типа С, не так подвижны.
  2. Производительность. Сервлеты загружаются только один раз, в то время как программы CGI должны загружаться в ответ на каждый новый запрос. Используемый в сервлетах метод init() позволяет программисту осуществлять ресурсопоглощающие операции (типа соединения с базой данных) в момент загрузки и многократно использовать их при повторных обращениях к сервлетам. Другими словами, вместо того чтобы входить в базу и обратно многократно, достаточно подсоединиться к ней один раз.
  3. Расширяемость. Java является устойчивым, хорошо продуманным и полностью объектно- ориентированным языком. Специализированные библиотеки Java, инструментальные средства разработки и драйверы для работы с базами данных постоянно пополняются и обновляются. Фактически, сервлеты - это ключевой элемент для Java Server API (Application Programming Interface), который должен работать везде, начиная с Web-серверов и заканчивая сетевыми компьютерами.

Сервлеты часто используются при разработке Web-приложений. Применение сервлетов позволяет значительно упростить процесс динамического формирования содержимого Web- документов. Web –приложение представляет собой совокупность следующих компонентов: Java–сервлеты, Java Server Page, библиотека пользовательских дескрипторов, библиотека классов Java, дескриптор доставки, статические компоненты (HTML-страницы, изображения и т.д.), прочие ресурсы.

Для обеспечения работы данных приложения подходит любой сервер, поддерживающий эти компоненты. Если Web–приложение содержит сервлеты, JSP или библиотеки пользовательских дескрипторов, то Web-сервер должен быть снабжён специальным контейнером, поддерживающим данные компоненты. Это может быть либо контейнер, специально ориентированный для работы с Java-сервлетами и JSP, либо полнофункциональный сервер, предназначенный для обеспечения работы J2EE-приложений, например, Borland Enterprise Application Server. Одно из преимуществ использования языка Java для создания программ состоит в том, что написанный и скомпилированный код можно переносить с одной платформы на другую. В идеальном случае Web- приложение должно представлять собой автономную структуру, содержащую все необходимые файлы и определяющие особенности доставки и выполнения программных компонентов. Таким образом, преимущества, присущие языку Java , переносятся на целую платформу, содержащую корректное представление информации на различных серверах. Содержимое Web-узла и размещённых на них Web-приложений представляет собой сочетание статической, т.е. не изменяемой с течением времени, информации и динамически формируемых данных. К Web–узлам предъявляются требования, предполагающие формирование информации с учетом интересов конкретных пользователей. Кроме того, Web-страницы часто, например, в нашем случае, приходится формировать на основании информации, содержащейся в базах данных.

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

Работа апплета происходит следующим образом:

  1. Web – страница автоматически инициирует запрос на загрузку апплета,
  2. сервер посылает байт - код апплета в браузер,
  3. происходит пересылка кода,
  4. виртуальная машина Java выполняет код на локальной машине.
Работа сервлета происходит следующим образом:
  1. Браузер инициирует запрос на функцию, реализованную с помощью сервлета,
  2. сервер получает запрос и передает его сервлету,
  3. сервлет выполняется и возвращает результат Web - серверу,
  4. происходит пересылка данных,
  5. сервер отсылает результаты браузеру,
  6. происходит пересылка данных,
  7. браузер отображает данные.

Разница между апплетом и сервлетом состоит в следующем: сервлеты являются объектами, которые образуют специфический интерфейс, с помощью которого их можно свободно встраивать в Java-ориентированные Web-серверы. В отличие от апплетов, они являются облегченными Java-объектами (без графики и GUI-компонентов), но зато, будучи кроссплатформенными и динамически загружаемыми и, используя все возможности Java, они могут использовать практически любой HTML и взаимодействовать с любым браузером. Сервлеты работают на стороне сервера, а апплеты работают на стороне клиента. С помощью сервлетов можно извлекать информацию из баз данных, а с помощью апплетов без участия сервлетов невозможно извлекать информацию из баз данных.

Необходимо поддерживать Java Servlet API для того, чтобы сервлеты могли использоваться для обработки запросов клиент - Web–сервер. Это требование выполняется либо путем установки на Web-узле сервера с встроенными средствами поддержки указанного API, либо с помощью специальных программных средств, интегрированных с Web-сервером и ориентированных на работу с Java-сервлетами. Написанное и проверенное средствами JBuilder Web-приложение, представленное в виде поддерева каталогов или в виде WAR-файла, копируется в тот каталог файловой системы, в котором сервер может обеспечить его выполнение. Когда Web-сервер получает запрос, в котором указан определенный ресурс, он анализирует тип ресурса. Если ресурс представляет собой сервлет, он запускается на выполнение и запрос перенаправляется ему. Сервлет обрабатывает запрос и формирует ответ, который передается Web-серверу. Получив ответ от сервлета, Web -сервер пересылает ответ тому клиенту, от которого был получен запрос.

Подобно другим типам Java – приложений, сервлеты можно переносить на различные платформы. Если в некоторой системе работает сервер, поддерживающий Java Servet API, то в этой среде могут успешно работать сервлеты, созданные на другой платформе. Чтобы это стало возможным, необходимо также, чтобы библиотеки классов, используемые сервлетами, были доступны на обеих платформах. Если это условие выполняется, перенос сервлетов на новую платформу не вызовет никаких трудностей.

Структура сервлета достаточна проста и допускает работу с различными коммутационными протоколами, которые используются для поддержки взаимодействия клиента и сервера. Интерфейс Server API не зависит от конкретного протокола, он лишь предполагает, что приложение, в состав которого входит сервлет, написано по принципу "клиент/сервер".

Рассмотрим задачу построения описанной выше модели подробнее. Создание современных программных продуктов подразделяется на четыре стадии разработки (software development cycle): анализ (analysis), дизайн (design), кодирование (coding),тестирование(testing). На начальных стадиях разработки анализ ((analysis), дизайн(design)) создаются диаграммы, а частности диаграммы классов. При работе над проектом, согласно теории объектно–ориентированного дизайна, на ранней стадии разработки проекта были построены UML-диаграммы. UML (Unified Modeling Language) является стандартом языком моделирования. На рис.3. показана UML-диаграмма для данного проекта.

В предлагаемом проекте происходит обращение из HTML–странички к Java-сервлету. Далее при помощи SQL–запроса данные извлекаются из созданной в ходе работы над проектом базы данных STUDENTS. Затем данные передаются на HTML–страничку.

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

1. Создание и инициализация экземпляра сервлета. Когда контейнер получает запрос, адресованный сервлету, который не был инициализирован, создаётся экземпляр этого сервлета. Этот метод даёт сервлету возможность подготовиться к последующему выполнению действий по обработке запросов. Метод init вызывается лишь один раз. Если по каким - либо причинам выполнение метода окончилась неудачей, сервлет генерирует исключение Servlet Unavailable. В результате контейнер получает информацию о том, что данный сервлет не должен использоваться для обработки запросов.

2. Обработка клиентских запросов. После того как сервлет был создан и успешно инициализирован, он может принимать и обрабатывать запросы. При получении очередного запроса контейнер вызывает метод service сервлета, которому был адресован запрос. При нарушении нормального хода выполнения метод service генерируется исключение ServletException.


Рис.3. UML – диаграмма проекта.

При возникновении ошибки ввода или вывода возникает исключение java.io.IOException. Данные исключения обрабатываются контейнером сервлетов.

3.Удаление сервлета. Если контейнер принимает решение удалить сервлет, он вызывает метод destroy, объявленный в интерфейсе Servlet. В результате сервлет получает возможность освободить используемые ресурсы. Метод destroy вызывается лишь один раз непосредственно перед удалением сервлета. Помимо событий, определяющих жизненный цикл сервлета, контейнер оповещает зарегистрированные обработчики о наступлении перечисленных ниже событий. Классы, реализующие соответствующие интерфейсы прослушивания, должны зарегистрированы в дескрипторе доставки Web-приложения (файл web. xml). Объекты, реализующие интерфейс прослушивания и связанные с НТТР-сеансом,получают от контейнера следующие оповещения:

  1. Связывание объекта с HTTP - сеансом или разрыв связи (HttpSessionBindingListener),
  2. Деактивизация HTTP - сеанса (HttpSessionActivationListener),
  3. Активизация HTTP - сеанса (HttpSessionActivationListener).

Основную работу сервлет выполняет тогда, когда контейнер принимает запрос клиента и направляет его сервлету, вызывая метод service. Если сервлет создан на базе класса HttpServlet, вызов метода service преобразуется в вызов одного из методов, специально ориентированных на обработку конкретных HTTP-команд.

В классе HttpServletRequest определены методы, позволяющие выполнять разбор клиентского запроса. Класс HttpServletResponse содержит методы, которые позволяют формировать ответ, предназначенный для передачи клиенту:


import javax.servlet.*;
import javax.servlet.http.*;
       ...
public class DBServlet extends HttpServlet {
       ...
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
  {   
       ...
  }

Проект создан в JBuilder6. Запрос из сервлета поступает в созданную автором в Microsoft Access базу данных STUDENTS . Базы данных обеспечивают хранение и эффективный поиск информации; для извлечения данных из базы используется язык структурированных запросов SQL (Structured Query Language). Поддержка соединения с базой данных и передача SQL - запросов осуществляются средствами JDBC API, где JDBC - Java DataBase Connectivity, API -Application Programming Interface - прикладной программный интерфейс для взаимодействия с базами данных средствами Java). SQL поддерживается большинством реляционных баз данных, однако конкретная реализация этого языка зависит от свойств самой базы. Средства SQL делятся на категории: язык определения базы данных (DDL — database definition language язык обработки данных (DML — data manipulation language).

Благодаря SQL разработчик может изучить один язык и использовать его при решении различных задач, связанных с обработкой объектов баз данных и информации из базы. Так, в предлагаемом проекте в Java-сервлете обращение к базе данных Students при помощи SQL-запроса


"SELECT * FROM STUDENTS WHERE Имя LIKE '%"+ jdbTextField1.getText()+"%'"+"
 AND Фамилия LIKE '%"+ jdbTextField2.getText()+"%'"+"AND Отчество LIKE '%"+ 
 jdbTextField3.getText()+"%'" , null, true, Load.ALL));
извлекает данные из таблицы STUDENTS созданной в проекте базы данных STUDENTS.

SQL не определяет способ, посредством которого осуществляется соединение базы данных с клиентом. Поэтому особенности коммуникационного уровня определяются конкретной базой данных. Для установления связи с базой данных была установлена связь между JDBC и ODBC (JDBC – ODBC connection). Этот коммуникационный интерфейс получил название ODBC (Open Database Connectivity). Основой для создания ODBC послужил стандарт SQL X/Open Call Level Interface. ODBC API позволяет разработчикам создавать приложения, работающие с базами данных разных производителей. Java представляет собой реальный кроссплатформенный язык программирования. JDBC предоставляет средства соединения с базами данных, не зависящие от операционной системы.

JDBC API — это набор интерфейсов, которые производитель реализует для своего сервера баз данных. Интерфейсы определяют действия по установлению соединений, созданию выражений и обработке наборов результатов. Перечисленные вия представляют собой наиболее сложную часть работы с драйверами JDBC, поэтому соответствующие методы должны быть реализованы поставщиками баз данных. Драйвер, разработанный в соответствии со спецификацией JDBC, должен быть зарегистрирован с помощью DriverManager; лишь после этого его можно использовать в работе приложения. DriverManager координирует JDBC - вызовы и обеспечивает установку соединений, выполнение выражений и получение наборов результатов. Существуют различные способы регистрации JDBC-драйвера посредством DriverManager. Чаще всего класс загружается во время выполнения программы. Дополнительную степень гибкости обеспечивает хранение имени драйвера в файле свойств. В JDBC-драйвере предусмотрен статический инициализатор, который автоматически вызывает метод DriverManager.registerDriver().


   ...
   aurl=res.encodeURL(req.getRequestURI());
   stack ="STUDENTS";
   ...

   String url = "jdbc:odbc:"+stack;
   try {
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   con = DriverManager.getConnection(url);
   ...

Загрузить JDBC-драйвер можно также с помощью стандартного Java-оператора new. Недостаток этого способа заключается в том, что имя драйвера записывается в коде приложения, поэтому если вам понадобится изменить драйвер, то придется перекомпилировать программу. Кроме того, загрузить драйвер можно, указав его имя в командной строке. Командная строка, в которой указан параметр jdbc.drivers, выглядит следующим образом:


Java  -Djdbc .drivers=DRIVER    program

В этой строке кода последовательность символов DRIVER должна быть заменена на реальное имя JDBC-драйвера, например com.borland. datastore. jdbc .DataStore Driver. Недостатком такого способа является необходимость указывать драйвер при каждом запуске приложения.

После того как JDBC-драйвер зарегистрирован с помощью DriverManager, можно приступать к работе с базой данных. Как правило, за регистрацией следует установление соединения с базой данных с помощью объекта Connection. После установления соединения выполняются выражения, для чего используется объект Statement. При выполнении выражений могут возвращаться наборы результатов, представляемые объектом ResultSet. После окончания работы с базой соединение с ней разрывается.

В предлагаемом проекте был использован Java Web Server. Сервлеты являются объектами, образующими специфический интерфейс, с помощью которого их можно свободно встраивать в Java-ориентированные Web-серверы. В отличие от апплетов, они являются Java-объектами без графики и GUI -компонентов, но зато, будучи кроссплатформенными и динамически загружаемыми и, используя все возможности Java, они могут использовать практически любой HTML и взаимодействовать с любым браузером. Сервлеты используют для доступа к базам данных, программируя все удаленные операции с базой из браузера. В настоящее время большинство Web - серверов поддерживают технологию сервлетов. Java Web-Server был использован в проекте потому, что он наиболее полно реализует эту технологию. Стандартный Servlet API реализован как в самом Java Web Server, так и в отдельном продукте JSDK, но начиная с версии 1.2, он включен в состав JDK. Характерной особенностью сервлетов является то, что они не требуют создания новых процессов при каждом новом запросе.

Несмотря на то, что сервлеты используют HTTP-протокол, им нет необходимости перезагружать процесс при каждом новом запросе и это также повышает их быстродействие. Однако при использовании сервлетов возникает проблема использования кириллических символов. Стандартный путь прохождения данных тут не действует, потому что Web-сервер при старте запускает так называемый Java-handler, которому передает на выполнение все Java-сервлеты и обменивается вводом-выводом именно с ним через специальную библиотеку классов. Для получения кириллических строк в браузере от Web-сервера, исполняющего сервлеты, необходимо использовать вместо стандартных примитивов ввода/вывода некоторые специальные методы для работы со строками, например:


// Определение необходимого кодификатора
// в зависимости от используемого типа кодировки
String dos = new String(“Cp866”);
String win = new String(“Cp1251”);
String iso = new String(“8859_5”);
String im = new String(“Кириллический текст”);
.......................................................
out.println(“”);
//out.write(im.getBytes(dos));
out.write(im1.getBytes(win));
//out.write(im2.getBytes(iso));
out.println(“
”);

Однако, эффективная функция Java - getBytes() не действует при извлечении данных при помощи сервлетов из баз данных. Необходимо применить метод, который уже был использован при работе с базами данных при помощи интерфейса JDBC. Кроме того, файл font.properties в каталоге $JDK_HOME/lib или в специальном каталоге браузера должен быть соответствущим образом настроен. Во многих пакетах Java имеются образцы файла font.properties.ru, который можно взять в качестве основы. При работе с уже русифицированным Web-сервером, например, русской версией Apache, происходит автоматическая перекодировка данных, поступающих из базы данных от сервлета. Сервлет не накладывает никаких ограничений на использование интерфейсов с базой данных. Можно использовать обыкновенный JDBC-ODBC, или специфические драйверы, ориентированные на конкретные SQL-серверы и базы данных. Кроме того, необходимо также на Панели управления в разделе Администратор внести следующие изменения в источники данных (ODBC): в разделе Пользовательский DSN необходимо Добавить MicrosoftAccessDriver, затем необходимо выбрать базу данных и добавить ее к пользовательскому DSN.

В проекте был выбран Apache HTTP-сервер. Созданные в проекте модули могут работать и на ПК и на многопроцессорных высокопроизводительных системах, причем инсталляция и компоновка рабочих программ, как правило не требуется, дело сводится к простому копированию. Можно, не выходя из офиса, перемещать рабочие программы в специальные каталоги Web-сервера, находящегося на порядочном расстоянии, и они мгновенно могут быть востребованы десятками пользователей, которым нет необходимости загружать их на свои компьютеры. Для Apache существует специальный программный компонент JServ, который также как и сам сервер в исходных кодах распространяется совершенно бесплатно. При запуске Apache автоматически стартует Java-обработчик, которому и будут передаваться на исполнение все запросы, связанные с запуском Java-программ. Наоборот, весь вывод из Java переадресуется непосредственно в Web, который аккуратным образом передает его запросившему браузеру. Apache, в отличие от браузеров, не имеет собственной виртуальной машины Java, а настраивается на ту, которая сгенерирована для данной платформы. Такой подход чрезвычайно гибок, ибо позволяет постоянно обновлять Java-среду, наращивать библиотеку классов и ничего не изменять в настройках Apache. Для того, чтобы использовать Apache во взаимодействии с Java, необходимо инсталлировать продукт Jserv, содержащий необходимые библиотеки Java-классов, затем изменить конфигурационный файл Apache Configuration, добавив в него строку:


Module jserv_module mod_jserv.o

(модуль mod_jserv.c должен находиться при этом в src/директории Apache). После этого необходимо рекомпилировать Apache с помощью программы make. Затем можно изменить основной конфигурационный файл Apache httpd.conf, добавив в него строки вида:


<IfModule; mod_jserv.c>
ServletProperties conf/servlet.properties
ServletPort 8007
ServletBinary /opt1/jdk1.1.5/bin/java
ServletClassPath /opt1/jdk1.1.5/lib/classes.zip
ServletClassPath /opt1/local/etc/httpd/jserv/lib/servclasses.zip
ServletClassPath /opt1/local/etc/httpd/jserv/classes
ServletClassPath /opt1/JSDK1.0.1/lib/classes.zip
ServletErrorLog
logs/jserv_log
ServletAlias 
/servlets /opt1/local/etc/httpd/
jserv/servlets
ServletAuthExport Off
# AddHandler 
jhtml-parser .jhtml
# Action jhtml-parser 
/servlets/
org.apache.jserv.JServSSI
</IfModule>

Разумеется, в каждом конкретном случае директории могут быть разными, однако, сразу после старта Apache HTTP-сервера по команде httpd, он автоматически запускает Java-обработчик, который и будет загружать и исполнять все запрошенные сервлеты, в том числе и те, которые будут работать с базами данных. Преимущество Apache при работе с базами данных заключается в том, что поскольку он, также как и Java, доступен в исходных кодах, можно эффективно использовать его расширяемую архитектуру и дополнять его различными промежуточными фильтрами на Java и на языке C, которые могут выполнять различные полезные функции.

В результате выполненной в проекте работы данные о выпускнике ВУЗа появляются на HTML-страничке. Технология: HTML-страничка - Java-сервлет - база данных в Microsoft Access – HTML страница может быть применена для широкого спектра задач объектно – ориентированного программирования.

Итогом работы является разработка конкурентоспособного проекта для создания поисковой системы (сайта) выпускников одного ВУЗа в соответствии с описанной выше технологией: HTML-страничка - Java-сервлет - база данных в Microsoft Access – HTML страница. Модель построена и обоснована на базе задачи построения поисковой системы (сайта) выпускников одного ВУЗа. Для решения задачи применялись JAVA-сервлеты. Статья является обобщением и теоретическим обоснованием проведенной работы. Предлагаемый подход актуален для широкого спектра задач объектно–ориентированного дизайна, например, для задач, возникающих в банковском деле, для построения объектно–ориентированных моделей для работы с базами данных различных организаций.







Дирк Льюис, Петер Мюллер
"Java 2"
Подробнее>>
Заказать>>


Питер Вейнер
"Java и JavaScript"
Подробнее>>
Заказать>>

Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!