СТАТЬЯ |
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, который вы найдете на любой 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. Здесь мы имеем хорошие результаты в производительности, однако очень сильно привязаны к конкретному серверу. Разработка так же усложнаяется.
Java-решения для формирования динамичеких страниц. Сервлет - программа на Java которая выполняется внутри Web сервера или сервера приложений (Как правило, для таких целей у серверов приложений имеются специальные web-контейнеры. Прим. Ред.). JSP – технология, позволяющая динамически сгенерировать ответ сервера. Основное ее применение - отделить внешний дизайн и программный код в HTML-страницах.
Категория | Количество предложений от работодателей |
Общее кол-во предложений | 67332 |
ASP | 4121 |
Perl | 2709 |
JSP | 1179 |
Как говориться, статистика вещь упрямая, конечно Америка нам не указ, но все же мы можем получить общую расстановку сил
И снова статистика. Порядка 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. Там же есть небольшое описание, как пользоваться и пример использования. Кроме этого нам необходимы несколько классов, которые будут работать с книгами, присланными пожаланиями клиентов и т.д.
Основное назначение этого сервлета - инициализация пула соединений. Конечно инициализацию можно было бы провести и по другому (например, в 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")
В этом классе представлены методы для получения информации о книгах.
Установка всех этих свойств производиться в методах setBookTable и setBookItem. В JSP страницах значения свойств получаем посредством следующего вызова
<jsp:getProperty name="book" property="bookGroupTitle" />
В этом классе представлены метод readersOpinions - мнения читателей. Установка свойства производится в методе setReadersOpinions.
Cтраница, где представлены темы для выбора и новости сервера. Переход
на страницу Book.jsp осуществляется посредством передачи параметра bookGroupId.
<a href="../html/BookList.jsp?bookGroupId=2">
(в случае с Java). Новости сервера формируются динамически из файлов news/Item1,
2... и включаются в JSP следующим образом
<jsp:include page="news/Item1.html" flush="true"
/>
Страница, где формируется таблица с книгами по выбранной теме. <jsp:useBean id="book" scope="session" class="Book" /> - создаем класс Book с идентификатором book. В связи с тем, что все наши классы будут иметь максимальную область видимости "session", то нет необходимости задумываться о синхронизации потоков.
Страница, где формируется сведения о конкретной книге. Кроме этого формируется список с мнениями читателей, если они есть.
Страница, где пользователь может высказать свое мнение о книге. Для этого
мы будем использовать форму и два скрытых поля, что бы идентифицировать
запрос
<input type="hidden" name="bookId"
value="<%= bookId %>">
<input type="hidden" name="thankx" value="opinion">
После отправки формы вызывается страница 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\ во время запуска.
Все ссылки англоязычные, если кто-то добавит в этот список русскоязычные ресурсы, то буду очень рад
Должна получиться следующая структура каталогов, вы можете сохранить ее под именем например 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. Отправить E-Mail http://www.interface.ru |
|
Ваши
замечания и предложения отправляйте
автору По техническим вопросам обращайтесь к вебмастеру Документ опубликован: 31.10.01 |