СТАТЬЯ
31.10.01

Краткий обзор технологий динамического формирования HTML страниц

© Цуканов В. В.
гл. специалист отдела автоматизации УПФР
г. Губкин Белгородской обл.
Опубликовано на сайте

Введение.
Несколько слов о Java.
Краткий обзор технологий динамического формирования HTML страниц.
Сервлеты и JSP.
Использование JDBC.
Практическая реализация.
Разработка структуры приложения.
Структура приложения.
Сервлет Welcome.
Класс Book.s
Класс Opinion.
JSP страницы.
Welcome.jsp.s
BookList.jsp.
Book.jsp.
AddOpinion.jsp.
Thankx.jsp
Чего не хватает в приложении?
Приложения
Таблицы базы данных.
Менеджер соединений.
Полезные ссылки.
Установка нового приложения Tomcat.

Введение.

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

Англоязычный Internet не так консервативен и пытается продвигать JSP, однако и в нем найти полезного можно не так много как хотелось бы. Даже такой гигант как IBM пытающийся (по моему мнению) стать основным поставщиком решений для Java, хоть и дает информацию (все ссылки вы найдете в конце обзора), но в очень малом количестве. Конечно, у кого имеются достаточные денежные ресурсы, могут зайти на сервер http://www.amazon.com/, набрать в строке поиска “JSP” и получить в результате поиска как минимум 40 изданий, посвященных данной теме, по цене от 40 долларов и выше.

А если вам это не по карману, то, возможно, данная публикация поможет вам ознакомиться с JSP - замечательной технологией корпорации Sun.

Несколько слов о Java.

Главный девиз Java, который вы найдете на любой web-странице фирмы Sun – “Написано однажды – работает везде”. Однако возникает вопрос – “А зачем, то что мы написали должно работать везде?”.

По статистике порядка 90% конечных пользователей работают на компьютерах с установленной 32-разрядной ОС Windows. Так что достаточно написать программу, которая будет работать под Windows и девиз фирмы Sun можно, с некоторыми оговорками применить например и для Delphi – “Написанное однажды на Delphi – работает почти везде” (шутка). Если серьезно подойти к этому вопросу, то надо себе задать вопрос: а какой ценой ваша программа, написанная на Java, работает везде. А цена этому - производительность. Я думаю ни для кого не секрет, что программы, написанные на Java, работают под управлением виртуальной машины Java. Так что возникает проблема: писать, то что работает медленнее но повсеместно, или то, что работает приемлемо, но только под Windows. Но не надо расстраиваться, не все так плохо в королевстве Java (Напротив, все очень даже хорошо! Даже под ОС Windows постоянная миграция приложений на Java видна невооруженным глазом. Это, кстати, особенно видно в Европе и Скандинавии. Прим. Ред.). Один из секторов, в котором Java более чем уместна – это приложения для Internet.

Краткий обзор технологий динамического формирования HTML страниц.

Динамическое формирование Web страниц — тема довольно старая. И она существовала задолго до появления Java. Одним из излюбленных инструментов специалистов был и остается язык Perl. И, наверное, Perl останется надолго – уж очень много на нем всего написано, затрачены колоссальные усилия, чтобы просто так все бросить и кинуться с головой в ASP, JSP, XML, сервлеты и т.п. (любителям абревиатур рекомендую посетить сервер www.computerjobs.com там вы найдете все, что сейчас в моде).

Одной из основных технологий поддержки динамических таблиц является CGI. В ней используется огромное количество языков, но основным, судя по всему, является все же Perl. Плюсы такой реализации только в том, что наработано большое количество решений, не надо ничего выдумывать, да и документации написано огромное количество. Минусы - это производительность. В CGI-модели каждый раз при поступлении запроса от пользователя инициируется новый процесс, вследствии чего характеристики сервера ухудшаются. Кроме этого CGI-программы не могут взаимодействовать с Web сервером, т.к. они выполняются в разных потоках.

Теперь об ASP. В свое время компания Microsoft очень стремилась завоевать рынок Web. Пакеты выпускались один за другим. И в какой-то мере задача захвата Web удалась - если опять призвать на помощь статистику, то окажется, что порядка 20% Web серверов построены на основе Internet Information Service - совсем неплохо (Но это и не такой выдающийся результат, как у Apache J Прим. Ред.). Так вот в основе технологии ASP – ключевом элементе IIS - лежит все та же знаменитая компонентная технология COM. Так что писать ASP можно с использованием тех продуктов, которые могут оперировать с COM-объектами (естественно вся линейка продуктов от Microsoft, а также Delphi и C++Builder от Borland и пр.). Минусом является только то, что вы будете ограничены только одной операционной системой Windows.

Кроме этого существуют Netscape NSAPI и Microsoft ISAPI. Это программные интерфейсы прямых вызовов сервисов конкретного сервера Web. Здесь мы имеем хорошие результаты в производительности, однако очень сильно привязаны к конкретному серверу. Разработка так же усложнаяется.

Сервлеты и JSP.

Java-решения для формирования динамичеких страниц. Сервлет - программа на Java которая выполняется внутри Web сервера или сервера приложений (Как правило, для таких целей у серверов приложений имеются специальные web-контейнеры. Прим. Ред.). JSP – технология, позволяющая динамически сгенерировать ответ сервера. Основное ее применение - отделить внешний дизайн и программный код в HTML-страницах.

На вопрос “что все таки лучше, а что хуже”, по-моему, ответа не существует. А вот вычислить, что популярнее гораздо попроще. Воспользуемся информацией сервера www.computerjobs.com и в строке поиска наберем ASP, затем Perl и затем JSP. Вот, что у Вас приблизительно получится.

Категория Количество предложений от работодателей
Общее кол-во предложений 67332
ASP 4121
Perl 2709
JSP 1179

Как говориться, статистика вещь упрямая, конечно Америка нам не указ, но все же мы можем получить общую расстановку сил

Использование JDBC.

И снова статистика. Порядка 50% всех приложений используют в той или иной мере доступ к базам данных ("Thinking in Java, 2nd Edition" Bruce Eckel стр. 920). Так что для многих разработчиков это очень интересный вопрос. В данном обзоре мы будем строить первые странички виртуального Internet-магазина. При доступе к таблицам БД мы будем использовать JDBC. Почему JDBC, а не DataExpress? Это, конечно, частное мнение, но мне кажется, что использовать JDBC намного проще (в смысле количества строк в программе), например запрос к таблице:

JDBC версия

Connection con;
ResultSet rs;
PreparedStatement pstmt;
String email = new String ("bob@mail.ru");

// соединение с сервером
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection ("jdbc:oracle:thin:@192.37.3.58:1521:BOOK", "scott", "tiger");

// выполнение запроса
pstmt = con.prepareStatement ("Select * from customer where email = ?");
pstmt.setString(1, email);
rs = pstmt.executeQuery();

// печать результатов
while (rs.next ()) System.out.println(rs.getString("Name"));

DataExpress версия

QueryDataSet queryDataSet1 = new QueryDataSet();
ParameterRow parameterRow1 = new ParameterRow();
Column column1 = new Column();

//соединение с сервером
queryDataSet1.setQuery(new com.borland.dx.sql.dataset.QueryDescriptor(database1, "SELECT * FROM CUSTOMER WHERE EMAIL = :EMAIL", parameterRow1, false, Load.ALL));
database1.setConnection(new com.borland.dx.sql.dataset.ConnectionDescriptor("jdbc:odbc:dataset book", "SYSDBA", "masterkey", false, "sun.jdbc.odbc.JdbcOdbcDriver"));

// установка свойств
column1.setColumnName("EMAIL");
column1.setDataType(com.borland.dx.dataset.Variant.STRING);
column1.setServerColumnName("NewColumn1");
column1.setSqlType(0);
parameterRow1.setColumns(new Column[] {column1});
parameterRow1.setString("EMAIL","bob@mail.ru");

//выполнение запроса
queryDataSet1.executeQuery();

// печать результатов
while (queryDataSet1.next()) System.out.println (queryDataSet1.format("Name"));

Как видите результат один и тот же, а пути его достижения – разные. Причем, на мой взгляд, второй длиннее. Однако не будем забывать, что второй был сгенерирован автоматически в среде пакета JBuilder. Так что вам решать, что предпочесть. Что касается меня, то я выбираю первый вариант. Кроме простоты реализации, мы можем использовать уже наработанный код (например пул соединений с базой данных).

Прим. В JBuilder 4, насколько мне известно, появился набор новых компонент для построения Internet-приложений InternetBeans, но я ничего не могу сказать по этому поводу, т.к. я не имел еще возможности оценить новых продукт от Borland (Комментарий).

Практическая реализация.

Для примера мы рассмотрим несколько первых страниц Internet-магазина, торгующего книгами. В качестве сервера приложений (контейнера), который будет управлять компиляцией, запускать наши JSP-страницы и сервлеты, мы будем использовать Tomcat 3.1. В принципе, те пользователи, кто работает с JBuilder Enterprise, могут воспользоваться встроенным сервером. Преимущество использования Tomcat только в том, что пользователи располагающие JBuilder Foundation (распространяется бесплатно) могут также проектировать, отлаживать и выполнять JSP страницы и сервлеты. Настройки для работы с Tomcat 3.1 вы можете найти по адресу http://community.borland.com/article/0,1410,22057,00.html.

Прим. Для пользователей JBuilder 3.0 проделать все то же самое, но установить выполняемым файлом Tomcat.java, который можно найти в [TOMCAT_HOME]\src\org\apache\tomcat\startup\Tomcat.java

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

Разработка структуры приложения.

К сожалению, если сравнить два приложения - одно для Web, другое для обычной многопользовательской среды, первое оказывается всегда сложнее. Хотя бы взять наш пример. Что такое магазин. Заходит пользователь, выбирает товары и оплачивает покупки. Вся база данных будет состоять из 6-8 таблиц максимум. Если вы решили написать обычное приложение, то, в принципе, для этого не требуется очень глубокого анализа. Максимум времени, который вы потратите на разработку подобного приложения - две недели. Однако с распределенными приложениями все намного сложней - необходимо создавать пул соединений с базой данных, необходимо продумывать вопросы безопасности, авторизации пользователей и т.д. и т.п. Так что для начала необходимо продумать структуру приложения, причем сделать это достаточно аккуратно, что бы не возвращаться к этому еще и еще.

Структура приложения.

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

Исходя из этой структуры можно предположить следующее. Нам необходимо соединение с базой данных. Для этого мы воспользуемся классом DBConnectionManager , который Вы можете найти по адресу http://webdevelopersjournal.com/columns/connection_pool.html. Там же есть небольшое описание, как пользоваться и пример использования. Кроме этого нам необходимы несколько классов, которые будут работать с книгами, присланными пожаланиями клиентов и т.д.

Сервлет Welcome.

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

Любой сервлет имеет как минимум три метода – init(), service() и destroy(). В методе init() мы проведем создание класса DBConnectionManager –

DBConnectionManager conMgr = DBConnectionManager.getInstance();

В методе destroy() мы закроем все активные соединения с базой данных
conMgr = DBConnectionManager.getInstance()
В методе service() проведем регистрацию созданного объекта под именем "conMgr" - getServletContext().setAttribute("conMgr", conMgr).

Таким образом у нас будет возможность получить ссылку на объект в любой момент пока активно наше приложение в JSP странице :
DBConnectionManager conMgr = (DBConnectionManager) application.getAttribute ("conMgr")

Класс Book.

В этом классе представлены методы для получения информации о книгах.

Установка всех этих свойств производиться в методах setBookTable и setBookItem. В JSP страницах значения свойств получаем посредством следующего вызова

<jsp:getProperty name="book" property="bookGroupTitle" />

Класс Opinion.

В этом классе представлены метод readersOpinions - мнения читателей. Установка свойства производится в методе setReadersOpinions.

JSP страницы.

Welcome.jsp.

Cтраница, где представлены темы для выбора и новости сервера. Переход на страницу Book.jsp осуществляется посредством передачи параметра bookGroupId.
<a href="../html/BookList.jsp?bookGroupId=2"> (в случае с Java). Новости сервера формируются динамически из файлов news/Item1, 2... и включаются в JSP следующим образом
<jsp:include page="news/Item1.html" flush="true" />

BookList.jsp.

Страница, где формируется таблица с книгами по выбранной теме. <jsp:useBean id="book" scope="session" class="Book" /> - создаем класс Book с идентификатором book. В связи с тем, что все наши классы будут иметь максимальную область видимости "session", то нет необходимости задумываться о синхронизации потоков.

Book.jsp.

Страница, где формируется сведения о конкретной книге. Кроме этого формируется список с мнениями читателей, если они есть.

AddOpinion.jsp.

Страница, где пользователь может высказать свое мнение о книге. Для этого мы будем использовать форму и два скрытых поля, что бы идентифицировать запрос
<input type="hidden" name="bookId" value="<%= bookId %>">
<input type="hidden" name="thankx" value="opinion">

Thankx.jsp

После отправки формы вызывается страница Thankx.jsp, которая будет использоваться для различных "спасибо" и ее содержание будет изменяться в зависимости от значения параметра Thankx. В нашем случае мы используем метод addOpinion класса Opinion.

Одно замечание по поводу перекодировки. Т.к. мы заставили пользователя использовать кодировку Cp1251, в каждой JSP странице есть строка
<%@ page contentType="text/html; charset=windows-1251" %>
то следующий процесс перекодировки верен и мы можем спокойно пользоваться этим обстоятельством в Opinion.java String opinion = new String(req.getParameter("opiniontext").getBytes("ISO-8859-1"),"Cp1251")

Чего не хватает в приложении?

Надеюсь, что в продолжении статьи мы рассмотрим все эти вопросы и наше приложение будет полностью отвечать всем требованиям виртуального магазина.

Приложения

Таблицы базы данных.

Данное приложение было построено с использованием сервера Oracle, поэтому файл crttbl.sql использует диалект этого сервера. Я думаю, что не составит сложностей перевести его на другой сервер.

Менеджер соединений.

Его тоже необходимо настроить. Для этого существует файл
[TOMCAT_HOME]\ webapps\bookshop\WEB-INF\classes\db.properties со следующим содеожанием

В дальнейшем вы будете использовать имя guest для соединений с базой данных. Вообще данный файл может находиться где угодно лишь бы этот путь был доступен через переменную CLASSPATH. В нашем случае TomCat добавляет путь [TOMCAT_HOME]\ webapps\bookshop\WEB-INF\classes\ во время запуска.

Полезные ссылки.

Все ссылки англоязычные, если кто-то добавит в этот список русскоязычные ресурсы, то буду очень рад

Установка нового приложения Tomcat.

Должна получиться следующая структура каталогов, вы можете сохранить ее под именем например template и затем использовать при создании новых приложений для Tomcat.

Кроме этого в каталоге [TOMCAT_HOME]\ webapps\bookshop\WEB-INF может присутсвовать файл web.xml- это ваш локальный файл, который перекрывает установки в глобальном web.xml [TOMCAT_HOME]\conf\web.xml.И последний штрих в файл [TOMCAT_HOME]\conf\server.xml необходимо добавить строку.

<Context path="/bookshop" docBase="webapps/bookshop" debug="0" reloadable="true" ></Context>

Этой строкой вы создаете приложение bookshop.

Прим. Еще немного о структуре каталогов и приложения. Файл выполняемый по умолчанию при загрузке приложения (т.е. http://localhost:8080/bookshop) - index.html.
Ваши классы должны находиться либо в CLASSPATH либо в каталоге [TOMCAT_HOME]\ webapps\bookshop\WEB-INF\classes (этот путь автоматически попадает в CLASSPATH при загрузке Tomcat)

Дополнительную информацию Вы можете получить в компании Interface Ltd.

Обсудить на форуме Borland
Отправить ссылку на страницу по e-mail


Interface Ltd.
Тel/Fax: +7(095) 105-0049 (многоканальный)
Отправить E-Mail
http://www.interface.ru
Ваши замечания и предложения отправляйте автору
По техническим вопросам обращайтесь к вебмастеру
Документ опубликован: 31.10.01