(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

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

Введение.

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

Англоязычный 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.

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

  • bookGroupTitle - свойство для получения выбранной темы
  • bookCount - количество книг по выбранной теме
  • bookTable - таблица с выбранными книгами
  • bookItem - единичный экземпляр книги

Установка всех этих свойств производиться в методах 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 со следующим содеожанием

  • drivers=oracle.jdbc.driver.OracleDriver - используемый вами драйвер
  • logfile=D:\\Tomcat\\webapps\\bookshop\\log\\log.txt - место, где будет размещаться log файл
  • guest.url=jdbc:oracle:thin:@192.37.3.58:1521:UPFR - URL вашего JDBC соединения
  • guest.maxconn=50 - максимальное колличество соединений
  • guest.user=scott - имя пользователя
  • guest.password=tiger - пароль

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

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

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

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

  • В каталоге [TOMCAT_HOME]\ webapps\ создаем каталог bookshop
  • Создаем еще три подкаталога [TOMCAT_HOME]\ webapps\bookshop\src - для исходных тектов, [TOMCAT_HOME]\ webapps\dbcon\WEB-INF и [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)

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 31.10.2001 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
WinRAR 5.x Standard Licence - для частных лиц 1 лицензия
Oracle Database Standard Edition 2 Processor License
Stimulsoft Reports Server Team 10 users
FastCube FMX Single License
Microsoft 365 Business Basic (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
CASE-технологии
СУБД Oracle "с нуля"
Новые материалы
Программирование на Visual Basic/Visual Studio и ASP/ASP.NET
Проект mic-hard - все об XP - новости, статьи, советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100