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

Введення.


Написати цю статтю мене спонукала та обставина, що, на жаль, на даний час україномовна аудиторія чомусь абсолютно ігнорує дану тему. Звичайно технологія досить нова, може бути трохи складніше, ніж хотілося б, проте дуже цікава і, на мій погляд, має великі перспективи.

Англомовний 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.

.

Динамічне формування 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] srcorgapache omcatstartupTomcat.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.


Сторінка, де представлені теми для вибору і новини сервера. Перехід на сторінку 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 ookshopWEB-INFclassesdb.properties з наступним содеожаніем


Надалі ви будете використовувати ім'я guest для з'єднань з базою даних. Взагалі цей файл може перебувати де завгодно аби цей шлях був доступний через змінну CLASSPATH. У нашому випадку TomCat додає шлях [TOMCAT_HOME] webapps ookshopWEB-INFclasses під час запуску.


Корисні посилання.


Всі посилання англомовні, якщо хтось додасть до цього списку російськомовні ресурси, то буду дуже радий

Установка нової програми Tomcat.


Повинна вийти наступна структура каталогів, ви можете зберегти її під ім'ям наприклад template і потім використовувати при створенні нових додатків для Tomcat.

Крім цього в каталозі [TOMCAT_HOME] webapps ookshopWEB-INF може пристосовувати файл web.xml-це ваш локальний файл, який перекриває установки в глобальному web.xml [TOMCAT_HOME] confweb.xml.І останній штрих в файл [TOMCAT_HOME] confserver.xml необхідно додати рядок.


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


Цією рядком ви створюєте додаток bookshop.


Прим. Ще трохи про структуру каталогів і додатки. Файл виконується за умовчанням при завантаженні програми (тобто http://localhost:8080/bookshop) – index.html.
Ваші класи повинні перебувати або в CLASSPATH або в каталозі [TOMCAT_HOME] webapps ookshopWEB-INFclasses (цей шлях автоматично потрапляє в CLASSPATH при завантаженні Tomcat)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*