#525
Rozdział 23.
Serwery aplikacji WWW
W tym rozdziale omówione zostaną kategorie produktów wspomagających tworzenia aplikacji WWW. Niektórym produktom przeznaczonym do tego celu przyjrzymy się dokładniej.
Wcześniej przedstawione zostały pewne szczegóły dotyczące współpracy serwera WWW z programami zewnętrznymi poprzez interfejs CGI. Omawiane w tym rozdziale serwery aplikacji WWW eliminują problemy, na które trzeba było zwracać uwagę w przypadku CGI. Szczegółami tego typu zajmuje się na ogół jądro serwera aplikacji, pozwalając programistom skupić się na budowie właściwej logiki programu.
Obecnie na rynku dostępnych jest bardzo wiele różnych serwerów aplikacji WWW, a ich liczba wciąż rośnie. Niektóre z serwerów tworzone są z myślą o ścisłej integracji z istniejącymi systemami, podczas gdy inne stawiają sobie za cel udostępnienie szybkiego i łatwego w użyciu środowiska programowania aplikacji. Zanim więc przystąpimy do projektowania naszej wymarzonej witryny WWW, powinniśmy się zastanowić, który z serwerów aplikacji najlepiej spełni nasze oczekiwania.
Przegląd serwerów aplikacji WWW
Spróbujemy podzielić serwery aplikacji WWW według pewnych kategorii. Autorzy poszczególnych produktów mogliby się nie zgodzić z poniższą charakterystyką, niemniej jednak uważam, że przedstawiony podział będzie na pewno zrozumiały dla osób zajmujących się tworzeniem aplikacji.
Pierwsza i najstarsza kategoria dotyczy programów standardowych. Najczcigodniejszym przedstawicielem tej kategorii jest interfejs CGI. Można do niej zaliczyć również serwlety Javy. W kategorii tej mieszczą się wszystkie technologie stworzone przy użyciu standardowych języków programowania i generujące wyniki w postaci kodu HTML, a nie zwykłego tekstu lub grafiki. Po przedstawieniu kolejnych kategorii, różnica między pierwszą z nich, a pozostałymi stanie się o wiele wyraźniej sza.
#526
Druga kategoria, to serwery aplikacji, których kod osadzany jest wewnątrz dokumentów HTML. Przykładem może być dokument ColdFusion zawierający wyrażenia warunkowe oraz pętle połączone ze zwykłym kodem HTML. Przed wysłaniem takiego dokumentu do przeglądarki jest on przeszukiwany przez serwer aplikacji, a wszelkie znalezione wyrażenia są wykonywane i zastępowane wygenerowanymi wynikami. Inne popularne serwery aplikacji WWW należące do tej kategorii to między innymi ASP (Active Server Pages) firmy Microsoft oraz PHP.
Trzecia kategoria dotyczy kombinacji dokumentów HTML i programów. Dokumenty HTML tej kategorii zawierają specjalne znaczniki[Nie chodzi tutaj o znaczniki języka HTML (przyp. thim.).], na podstawie których serwer aplikacji WWW wywołuje określone programy zewnętrzne. Wynik działania programu zewnętrznego służy jako treść, którą zastępowany jest znacznik użyty do jego wywołania. Pozwala to programistom tworzyć kod w formie strukturalnej lub obiektowej, bez konieczności osadzania go w dokumentach HTML lub tworzenia wyrażeń generujących kod tego języka. Do produktów tej kategorii zaliczają się między innymi NetDynamics i WebObjects firmy Apple.
Czwarta kategoria składa się z programów zaprojektowanych do realizacji określonego celu, które czasem korzystają z relacyjnych baz danych do przechowywania własnych informacji. Przykładem takiego programu jest Vignette Storyserver, narzędzie nie przeznaczone do współpracy z bazami danych, ale korzystające z relacyjnej bazy do przechowywania własnych danych. Tego typu oprogramowanie nie jest zbyt popularne wśród programistów baz danych, ale na wszelki wypadek warto wiedzieć o jego istnieniu.
Ogólne uwagi na temat serwerów aplikacji
Większość serwerów aplikacji WWW działa w ramach oddzielnego procesu na tym samym komputerze, na którym uruchomiony jest serwer WWW. Programy serwerów aplikacji WWW wykonują się w sposób ciągły, nieustannie nasłuchując żądań z serwera WWW. Żądania tego typu mogą być przekazywane na kilka różnych sposobów.
Wiele serwerów aplikacji komunikuje się z serwerem WWW poprzez interfejs CGI. Kiedy użytkownik potrzebuje danych od serwera aplikacji, wywołuje skrypt CGI, który po uruchomieniu przyjmuje żądanie od serwera WWW i przekazuje je serwerowi aplikacji. Serwer aplikacji WWW wykonuje żądanie, przekazuje wyniki swojej pracy programowi CGI, a ten z kolei wysyła je do serwera WWW, skąd trafiają do przeglądarki użytkownika. Interfejs CGI stosowany jest na ogół dla zachowania kompatybilności - są w niego wyposażone niemal wszystkie dostępne na rynku serwery WWW. Niestety, CGI jest stosunkowo wolnym mechanizmem w porównaniu z innymi technologiami. Traktuje się go zatem jako najmniejszy wspólny mianownik pomiędzy serwerami aplikacji a serwerami WWW.
#527
Serwery aplikacji udostępniają na ogól jeden lub więcej interfejsów przeznaczonych do użytku ze ściśle określonymi serwerami WWW. Na przykład serwery firmy Netscape posiadają interfejs NSAPI, serwer IIS (Internet Information Server) firmy Microsoft ma własny interfejs znany jako ISAPI, natomiast Apache (jeden z dominujących serwerów na rynku) rozszerzany jest przy użyciu specjalnych modułów. Większość serwerów aplikacji, w zależności od platformy systemowej, wyposażonych jest w jeden lub nawet wszystkie powyższe interfejsy komunikacyjne. Główną zaletą tego typu interfejsów jest to, że umożliwiają one bezpośrednią komunikację z serwerem WWW, bez potrzeby uruchamiania dodatkowych narzędzi w stylu skryptów CGI.
Inną cenną cechą serwerów aplikacji jest to, że izolują one użytkownika od bazy danych. W sposób niewidoczny zajmują się one nawiązaniem i utrzymaniem połączenia z bazą danych, a programista, zwolniony od obowiązku myślenia o tych szczegółach, może skupić się na poleceniach SQL.
Programy niezależne
Pierwszym mechanizmem, jakim się zajmiemy, jest udostępnianie baz danych poprzez niezależne programy. Programy tego typu naprawdę zasługują na miano serwerów aplikacji, ponieważ samodzielnie wykonują wszystkie fazy komunikacji zarówno z bazą danych, jak i z serwerem WWW. Serwery aplikacji tego typu wykonują na ogół wszystkie zadania niskiego poziomu, pozostawiając użytkownikowi jedynie obowiązek zaimplementowania logicznych zasad działania całej aplikacji.
Oto prosty przykład, zanim program w języku Perl (wykonujący się jako skrypt CGI) prześle odpowiedź do przeglądarki, musi sam przeanalizować dane przekazane mu przez użytkownika, połączyć się z relacyjną bazą danych, zrealizować odpowiednie zapytania SQL i w końcu przeprowadzić operacje na otrzymanych wynikach. Jeżeli jednak użyjemy np. serwera typu ColdFusion, to on zajmie się komunikacją z bazą danych i serwerem WWW. Zadaniem programisty będzie jedynie przetworzenie otrzymanego żądania, które wcześniej zostało rozbite na odpowiednie zmienne dostępne poprzez skrypt, wykonać niezbędne operacje na bazie danych i wygenerować wynik w postaci kodu HTML. Wysłaniem odpowiedzi do serwera WWW zajmuje się sam serwer aplikacji. Przyjrzymy się teraz kilku technologiom tworzenia programów niezależnych.
Perl/CGI
Jedną z bardziej popularnych technik tworzenia aplikacji WWW jest kombinacja Perlą i CGI. Interfejs CGI został przedstawiony już wcześniej, nie było jeszcze natomiast mowy o samym Perlu. Perl jest językiem skryptowym (wywodzącym się z systemu UNIX), wyposażonym w całe mnóstwo różnorodnych mechanizmów przeznaczonych do manipulowania tekstem. Perl stał się najbardziej popularnym językiem do tworzenia skryptów CGI, a przez wiele osób traktowany jest jako podstawowe narzędzie tworzenia aplikacji WWW.
#528
Jedną z zalet programowania w Perlu jest dostęp do niewyobrażalnie dużej ilości darmowego kodu, który można ściągnąć z sieci i wykorzystać do własnych celów. Kod ten dostarcza gotowe rozwiązania najróżniejszych problemów, ułatwiając w ten sposób tworzenie aplikacji programistom.
Perl był opisywany w wielu publikacjach książkowych[Jedną z nich jest "Perl dla każdego" autorstwa Laury Lemay, wydana przez wydawnictwo HELIOM.], do których odsyłamy osoby zainteresowane tym językiem. Teraz ograniczymy się jedynie do podania pewnych podstawowych informacji na temat wykorzystania Perlą do tworzenia skryptów CGI oraz łączenia się z relacyjnymi bazami danych.
Perl, tak jak każdy inny przyzwoity język programowania, umożliwia tworzenie specjalnych bibliotek kodu zwanych modułami. Większość kodu tworzona z przeznaczeniem do użytku publicznego, jest rozpowszechniana właśnie poprzez moduły. Również dodatkowe biblioteki kodu źródłowego dołączane do interpretera tego języka mają postać modułów - jednym z nich jest CGI. pm, moduł wspomagający programowanie skryptów CGI.
CGI. pm jest tak rozbudowanym modułem, że pełny opis jego możliwości wymagałby napisania odrębnej książki. Jego głównym zastosowaniem jest analiza żądań CGI i ich rozkład na bardziej użyteczną formę. Przyjrzyjmy się prostemu skryptowi CGI napisanemu w Perlu z użyciem modułu CGI. pm. Zanim to jednak nastąpi zbudujemy prosty formularz, który posłuży do jego uruchomienia. Do utworzenia formularza z rysunku 23.1 posłużył dokument HTML, którego kod przedstawiony został w listingu 23.1.
-------------------------------
Rysunek 23.1. Przykładowy formularz
-------------------------------
-------------------------------
Listing 23.1. Przykładowy formularz HTML
Przykładowy formularz
-------------------------------
Po utworzeniu formularza można napisać program CGI, który będzie przetwarzał jego dane. Przykład skryptu CGI w języku Perl, który przetwarza dane z formularza i generuje na ich podstawie nową stronę HTML, przedstawia listing 23.2.
#529
-------------------------------
Listing 23.2. Skrypt w języku Perl przetwarzający dane z formularza
#!/usr/bin/perl
use CGI;
$query = new CGI;
$name - $query->param('name1);
$rank = $query->param('rank');
$serial_num = $query->param('serial_num');
print $query->header;
print "
Dane osobowe żołnierza\n";
print "\nNazwisko $name.
\n";
print "Ranga $rank, numer służbowy \n";
print " $serial_num.
\n";
-------------------------------
Przyjrzyjmy się temu programowi. Pierwszy wiersz, zwany wierszem shebang, wskazuje położenie interpretera języka Perl w systemie. (Wiersz ten nie jest wymagany, jeśli skrypt CGI uruchamiany jest w Windows NT). Zadaniem wiersza shebang jest poinformowanie systemu, jakiego programu należy użyć do zinterpretowania i uruchomienia następującego po nim kodu. Wiersz tego typu jest powszechnie stosowany w systemach UNIX, np. w skryptach powłoki:
#!/bin/sh
Drugi wiersz jest poleceniem zaimportowania biblioteki CGI. pm. W przypadku braku rozszerzenia, program domyślnie przyjmuje, iż jest nim pm. Po zaimportowaniu modułu tworzony jest obiekt CGI o nazwie $query. W Perlu zmienna rozpoczynająca się od znaku dolara ($) jest zmienną skalarną, która w tym przypadku przechowuje odwołanie do obiektu CGI.
Jeżeli utworzony został obiekt CGI, wszystkie parametry przekazane do programu przez żądanie ładowane są do tablicy rozproszonej o nazwie param. Kolejne trzy wiersze programu kopiują wartości z tablicy param (czyli dane pochodzące z formularza) do zwykłych zmiennych skalarnych:
$name = $query->param{ 'name' );
$rank = $query->param{'rank');
$serial_num = $query->param{'serial_num");
Kopiowanie parametrów do indywidualnych zmiennych nie jest obowiązkowe, tutaj ma to na celu jedynie ułatwienie interpretacji kodu. Zwróć uwagę na fakt, iż nazwy pól tablicy param odpowiadają nazwom pól formularza HTML z listingu 23. l.
Ostatnim etapem programu jest utworzenie odpowiedzi dla przeglądarki. Jak już wcześniej wyjaśniliśmy, przed przystąpieniem do generowania kodu HTML, trzeba wysłać do serwera nagłówek protokołu HTTP Content-type: . CGI.pm udostępnia metodę realizującą to zadanie w bardzo prosty sposób - wystarczy użyć następującego polecenia:
print $query->header;
Teraz można przystąpić do tworzenia właściwego kodu HTML. Dane z formularza dołączane są do kodu HTML poprzez umieszczenie nazw zmiennych wewnątrz łańcuchów. Perl automatycznie zastępuje nazwy zmiennych ich wartościami, jeżeli łańcuch, w którym się znajdują jest ograniczony podwójnymi cudzysłowami. Wynik działania skryptu przedstawia rysunek 23.2.
#530
-------------------------------
Rysunek 23.2. Strona wygenerowana przez skrypt CGI
-------------------------------
==================
Rada
CGI.pm nie jest jedynym modułem wspomagającym tworzenie skryptów CGI w Perlu (innym popularnym modułem przeznaczonym do tego celu jest cgi-bin.pl). Faktem jest jednak, iż moduł CGI.pm jest nieoficjalnym standardem programowania skryptów CGI, być może dlatego, że wchodzi w skład wersji dystrybucyjnej Perlą. Wielu programistów woli korzystać z modułu cgi-bin.pl, do którego zdążyli się już przyzwyczaić, ponieważ był on dostępny zanim jeszcze pojawił się CGI.pm. Alternatywą dla nich jest użycie modułu CGI.pm w trybie zgodności z modułem cgi-bin.pl, poprzez zaimportowanie go następującą metodą:
use CGI qw(:cgi-lib);
Pozwala ona na korzystanie z funkcji ReadParse() w taki sam sposób, jak ma to miejsce w module cgi-bin.pl. Osoby zaczynające naukę programowania skryptów CGI powinny raczej używać poleceń modułu CGI.pm.
=================
Testowanie skryptów CGI
Istnieje kilka bardzo powszechnych błędów, które dosyć często pojawiają się w skryptach CGI. Jeśli zatem w takcie testowania skryptu okaże się, że coś jest nie tak, warto sprawdzić, czy przyczyną problemu nie jest któraś z wymienionych poniżej sytuacji.
Jedną z najczęstszych przyczyn błędów jest brak prawa dostępu do pliku. Jeżeli serwer WWW pracuje w ramach systemu UNIX, musi mu zostać nadane prawo do uruchamiania programu CGI. Na ogół oznacza to, że ustawienie prawa dostępu dla programu CGI powinno wynosić 755.
Ponadto skrypt CGI trzeba umieścić w katalogu cgi-bin serwera WWW i upewnić się, czy ustawienia serwera dopuszczają wykonywanie skryptów z tego miejsca. Jeżeli program nie znajduje się w katalogu cgi-bin, trzeba nadać mu odpowiednie rozszerzenie pliku. Jeśli serwer jest tak skonfigurowany, iż uznaje za skrypty CGI tylko pliki z rozszerzeniem .cgi, program o rozszerzeniu .pl (domyślnym dla Perlą) nie zostanie potraktowany przez serwer jako faktyczny program CGI.
Kolejnym, często spotykanym błędem jest niegenerowanie przez skrypt odpowiedniego nagłówka. Jedną z metod rozwiązania tego problemu jest użycie metody he-ader z modułu CGI. pm, o czym była mowa przed chwilą.
#531
Jeżeli w dzienniku błędów serwera WWW znajdzie się wpis świadczący o tego typu problemie, jego przyczyna może leżeć gdzie indziej. Na przykład przy niepoprawnym skompilowaniu programu, do serwera zamiast nagłówka Content-type: wysłany jest komunikat błędu. Serwer interpretuje jednak ten komunikat jako nagłówek i umieszcza w dzienniku wpis informujący o nieprawidłowym zakończeniu skryptu ze względu na błędny format nagłówka.
Przed przystąpieniem do testowania skryptu poprzez sieć WWW, można sprawdzić jego działanie lokalnie, wywołując go z poziomu wiersza poleceń (umożliwia to specjalny interaktywny tryb pracy modułu CGI. pm). Uwaga ta dotyczy również skryptów CGI pisanych w innych językach programowania, bez użycia modułu CGI.pm.
Zapisywanie danych z formularza w bazie danych
Gdyby jedynym zadaniem skryptów CGI było zwracanie danych wpisanych przez użytkownika w pola formularza, ich użyteczność byłaby raczej znikoma. W rzeczywistości jest zupełnie inaczej - aplikacje tworzone w formie skryptów CGI są w stanie przetwarzać i zapisywać odebrane dane w dowolny sposób, jaką zażyczy sobie programista. Dane można zapisać w zwykłym pliku tekstowym, w pliku DBM systemu UNIX lub nawet w relacyjnej bazie danych. Ponieważ podstawowym celem tej książki jest język SQL i związane z nim zagadnienia, omówimy sposób dostępu do relacyjnych baz danych z poziomu programu CGI napisanego w Perlu.
Pierwszym krokiem w tym kierunku jest utworzenie tabeli w bazie danych, która przechowywać będzie informacje zebrane przy użyciu formularza. Skorzystamy z bazy danych MySQL, w której utworzymy tabelę przechowującą trzy wartości: nazwisko, stopień wojskowy oraz numer służbowy. Wyrażenie CREATE tworzące taką tabelę przedstawia listing 23.3.
-------------------------------
Listing 23.3. Tabela Soldier_Data
CREATE TABLE Soldier_Data
(serial_num VARCHAR(40) PRIMARY KEY,
name VARCHAR(40),
rank VARCHAR(40))
-------------------------------
Po utworzeniu tabeli trzeba dodać odpowiedni kod do skryptu CGI, który będzie odpowiadał za wstawianie danych do bazy. Zapewnienie komunikacji z bazą danych wymaga użycia dodatkowych bibliotek. Perl dysponuje standardową biblioteką używaną do komunikowania się z relacyjnymi bazami danych, o nazwie DBI (będącej skrótem od Database Interface).
Moduł DBI pozwala na komunikację z dowolną relacyjną bazą danych przy użyciu tych samych funkcji faktyczna komunikacja z bazami realizowana jest przez moduł DBD. Kombinacja tych dwóch modułów tworzy pewien abstrakcyjny interfejs pomiędzy programem a bazą.
Poniżej (listing 23.4) znajduje się zmodyfikowany skrypt CGI, który wstawia dane z formularza do tabeli Soldier_Data i dodatkowo wysyła odpowiedź do przeglądarki.
#532
-------------------------------
Listing 23.4. Skrypt sample.cgi po modyfikacji umożliwiającej mu komunikowanie się z bazą danych
#!/usr/bin/perl
use DBI;
use CGI;
$query = new CGI;
$name = $query->param('name');
$rank = $query->param('rank');
$serial_num = $query->param('serial_num');
$dbh - DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey1);
$statement = qq{
INSEKT INTO Soldier_Data
(name, rank, serial_num)
VALUES
('Sname1, 'Srank', 'Sserial_num')
}; $sth = $dbh->prepare(Sstatement);
$rc - Ssth->execute;
print $query->header;
print "Dane osobowe źołnierza\n";
print "\nNazwisko Sname.
\n";
print "Ranaga Srank, numer służbowy \n";
print " $serial_num.
\n";
-------------------------------
Dodany fragment kodu korzysta z modułu DBI do połączenia się z bazą danych MySQL i wstawienia rekordu do tabeli Soldier_Data. Moduł DBI jest importowany w taki sam sposób, jak moduł CGI, to znaczy poprzez użycie operatora use.
Do utworzenia połączenia z bazą danych służy metoda pakietu DBI o nazwie connect:
$dbh = DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey');
Połączenie z bazą danych przypisywane jest zmiennej $dbh. Argumenty metody connect definiują typ i nazwę bazy danych, z którą ma być zrealizowane połączenie oraz nazwę i hasło użytkownika tej bazy. W tym przypadku sterownikiem bazy danych jest DBI :mysql, jej nazwa to rc3 - taką samą nazwę posiada użytkownik, posługujący się hasłem donkey. Po ustaleniu połączenia z bazą danych, kolejnym krokiem jest zdefiniowanie wyrażenia SQL.
Operator qq umożliwia zastąpienie zwykłych cudzysłowów ograniczających łańcuch dowolną inną parą znaków. W powyższym przykładzie operator qq {} pozwolił umieścić wyrażenie SQL składające się z kilku wierszy jako pojedynczy łańcuch w zmiennej $statement. Zadaniem samego wyrażenia jest wstawienie danych pochodzących z formularza do tabeli Soldier_Data. Po przypisaniu wyrażenia do zmiennej jest ono przygotowywane do faktycznego wykonania przez funkcję prepare. Przygotowane wyrażenie (znajdujące się w zmiennej $sth) jest wykonywane w następnym wierszu przez metodę execute, która zwraca wynik swojego działania zmiennej $rc. Po wykonaniu wyrażenia SQL rekord zostaje wstawiony do tabeli, a my przystępujemy do wygenerowania kodu HTML dla przeglądarki.
===================
Rada
Program z listingu 23.4 nie zawiera żadnego kodu obsługującego ewentualne błędy. Dane wejściowe nie są poddawane żadnej formie weryfikacji, nie jest sprawdzany wynik próby połączenia z bazą danych oraz wynik wykonania polecenia SQL. W rzeczywistych aplikacjach wszystkie wymienione zabezpieczenia są implementowane.
#533
========================
Rada
Oprócz metody connect, moduł DBI posiada również metodę di-sconnect, służącą do zamykania połączenia z bazą danych. Metoda ta nie została jednak wywołana w powyższym listingu, ponieważ połączenie z bazą danych jest zamykane automatycznie w chwili zakończenia skryptu CGI. Skrypty CGI uruchomiane są w wyniku nadesłania żądania i zamykane po wysłaniu odpowiedzi do serwera WWW, nie ma zatem potrzeby samodzielnego zwalniania zasobów, polegającego np. na zamykaniu otwartych plików, czy połączeń z bazą danych. Wykonywanie tego typu operacji jest jednak wskazane, jeżeli skrypt CGI wykonuje się w sposób ciągły (np. poprzez FastCGI). Generalnie rzecz biorąc, samodzielne zwalnianie zasobów nie jest niczym złym, a często daje poczucie większej pewności działania programu.
=====================
Przyjrzyjmy się typowej transakcji, która korzysta z napisanej przed chwilą aplikacji. Pierwszym krokiem jest wypełnienie formularza (rysunek 23.3). Po przekazaniu formularza do serwera WWW, informacje wpisane przez użytkownika zapisywane są w tabeli Soldier_Data i wyświetlane w oknie przeglądarki (rysunek 23.4). Listing 23.5 przedstawia zawartość tabeli, w której przechowywane są dane z formularza.
------------------------
Rysunek 23.3. Wypełniony formularz aplikacji
------------------------
------------------------
Rysunek 23.4. Strona wygenerowana przez skrypt CGI
------------------------
------------------------
Listing 23.5. Zawartość tabeli Soldier_Data
SELECT *
FROM Soldier Data
+-----------+-----------+-----------+
|serial_num | name | rank |
+-----------+-----------+-----------+
|123456789 | Rafę Colburn | Generał |
|83813319 | Jan Nowak | Szeregowy|
|83819311 | Lidia Brzeg | Major |
+-----------+--------------+--------+
3 rows in set (0.00 sec)
------------------------
#534
Zapytania do bazy danych z wnętrza skryptu CGI
Większość aplikacji w trakcie swojego działania pobiera dane od użytkownika lub z innego źródła i gdzieś je zapisuje. Przykład skryptu wstawiającego dane do bazy danych został przedstawiony wcześniej, teraz postaramy się wyjaśnić, jak pobrać dane z bazy danych i wygenerować na ich podstawie stronę w kodzie HTML. Poniższy skrypt (listing 23.6) pobiera zbiór rekordów z tabeli Soldier_Data, a następnie przetwarza każdy z nich w pętli, tworząc odpowiedni łańcuch w kodzie HTML.
------------------------
Listing 23.6. Program przetwarzający zawartość tabeli na kod HTML
#!/usr/bin/perl
use CGI;
use DBI;
$query = new CGI;
$dbh = DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey');
$statement = "SELECT * FROM Soldier_Data";
$sth - $dbh->prepare($statement);
Src = $sth->execute;
print $query->header;
print "Lista żołnierzy\n";
print "Lista żołnierzy\n";
while (($serial_num, $name, $rank) = $sth->fetchrow) {
print "$name, $rank, $serial__num
\n";
}
print "\n";
------------------------
Swoją budową listing 23.6 przypomina w dużym stopniu kod zawarty w listingu 23.4. Podobnie jak poprzednio importowane są moduły CGI i DBI, tworzony jest ; obiekt CGI, po czym następuje połączenie z bazą danych. W zmiennej $state-
ment tworzone jest wyrażenie SQL, które pobiera wszystkie wiersze z tabeli Sol-dier_Data. Wyrażenie SQL jest przygotowywane do wykonania przez funkcję prepare, a następnie wykonywane.
Zastosowanie biblioteki CGI w tym programie ogranicza się jedynie do wygenerowania nagłówka HTTP (print $query->header). Równie dobrze można byłoby ; pominąć linię use CGI i stworzyć nagłówek w sposób ręczny. Lepiej jednak pozostawić moduł CGI na wypadek, gdyby w przyszłości zaszła potrzeba rozbudowania skryptu o nowe elementy zawarte w tym module.
W poprzednim programie operacje na bazie danych kończyły się z chwilą wstawienia rekordu do bazy danych. Tutaj trzeba dodatkowo przetworzyć wyniki zwrócone przez zapytanie, ale dopiero w ciele strony, dlatego wcześniej wyświetlana jest informacja nagłówkowa dokumentu HTML oraz jej tytuł (ujęty w znaczniki ). Poszczególne rekordy przetwarzane są przez następujący blok kodu:
while (($serial_num, $name, $rank) = $sth->fetchrow) {
print "$name, $rank, $serial_num
\n";
}
Po pierwsze tworzona jest pętla while, która w Perlu wykonuje się tak długo, jak długo prawdziwe jest wyrażenie użyte w jej warunku. Niektóre języki programowania pozwalają na umieszczenie w wyrażeniu pętli jedynie warunku jej działania, np. zmienna > 10. Perl zachowuje się inaczej, ponieważ umożliwia wstawianie
#535
w tym miejscu również zwykłych poleceń. W tym przypadku użyta została metoda fetch uchwytu wyrażenia SQL ($sth), która przy każdej iteracji pętli pobiera po jednym rekordzie ze zbioru wyników zapytania. Kiedy w zbiorze nie pozostanie już żaden rekord do pobrania, fetchrow zwraca wartość niezdefiniowaną, nadając warunkowi działania pętli wartość fałszywą i tym samym kończąc jej działanie. Metoda fetchrow zwraca wiersze w postaci tablic. Ponieważ tabela Soldier_Data składa się z trzech kolumn, każdy wiersz zwracany jest w trzyelementowej tablicy. Wynik pobrania można kopiować do innej tabeli, przy użyciu polecenia:
@curren_row = $sth->fetchrow;
Aby jednak uczynić program bardziej czytelnym, przypisanie wykonywane jest do trzech niezależnych zmiennych skalarnych, wyspecyfikowanych jako lista:
($serial_num, $name, $rank) = $sth->fetchrow
W ten sposób trzy pierwsze wartości zwrócone przez fetchrow przypisywane są trzem zmiennym umieszczonym w nawiasach. Gdyby zwracane były więcej niż trzy wartości, pozostałe z nich byłyby ignorowane. Ponieważ jednak mamy do czynienia z uporządkowaną strukturą danych, możemy być pewni, że tablica za każdym razem składa się dokładnie z trzech elementów.
Podsumowując, pętla while jest wykonywana raz dla każdego wiersza w zbiorze wyników zwróconych przez zapytanie i przypisuje go trzem zmiennym skalarnym. Ciało pętli składa się z pojedynczego polecenia, które drukuje zmienne $se-rial_num, $rank i $name dodając za nimi znacznik HTML powodujący przejście do nowego wiersza:
print "$name, $rank, $serial_num
\n";
Po wyjściu z pętli skrypt dodaje znaczniki kończące dokument HTML ( i ) i kończy swojąpracę. Wynik działania skryptu przedstawia rysunek 23.5.
------------------------
Rysunek 23.5. Dane pobrane z bazy danych prezentowane w formie strony HTML
Lista żołnierzy
RafÄ™ Cofcura. General 123156789
Jan Nowak. Szeregowy 83813319
Lida Brzeg. Major 83819311
------------------------
====================
Rada
W przypadku obszernych baz danych wskazane jest umożliwienie użytkownikom filtrowania otrzymywanych danych. Wymaga to wywołania skryptu z pewną formą klauzuli WHERE, która ograniczy generowany zbiór wyników zgodnie z życzeniem użytkownika. Za każdym razem, kiedy żądanie użytkownika może doprowadzić do zwrócenia bardzo dużego zbioru danych, należy dokonać jego pogrupowania, tak aby ilość informacji wyświetlana na stronie nie była zbyt duża lub udostępnić użytkownikom interfejs umożliwiający samodzielne tworzenie filtrów.
====================
#536
Programy osadzane w kodzie HTML
Serwery aplikacji WWW osadzane w kodzie HTML już teraz są powszechnie stosowane, a ich popularność wydaje się rosnąć z dnia na dzień. Dzieje się tak być może dlatego, że ich idea jest łatwa do zrozumienia, szczególnie dla osób nie będących zawodowymi programistami. Technologie tego typu opierają się na specjalnych znacznikach, które traktowane są jako instrukcje programu lub na faktycznym kodzie ograniczonym pewnymi znacznikami w dokumencie HTML.
Każdy dokument HTML przed wysłaniem do przeglądarki użytkownika poddawany jest analizie. Znaleziony w jego wnętrzu kod zostaje zinterpretowany i wykonany. Jak wcześniej wspomniano, kategoria ta ma dwie różne odmiany. Pierwsza z nich koduje pogram poprzez specjalne znaczniki - najpopularniejszym przedstawicielem tego typu jest ColdFusion firmy Allaire.
Drugi typ programów używa specjalnych ograniczników, które umożliwiają osadzanie kodu wewnątrz dokumentów HTML. Pojedynczy zestaw ograniczników pozwala na osadzenie w dokumencie całego bloku programu. Przedstawicielami tego typu serwerów aplikacji są PHP i ASP firmy Microsoft.
Główną zaletą tych technologii jest to, że wymagają one od programistów tworzenia mniejszej ilości kodu, niż w przypadku skryptów CGI. Ponieważ kod znajduje się w już samym dokumencie HTML, program realizuje o wiele mniej operacji związanych z generowaniem danych dla przeglądarki. Ponadto języki stosowane w tego typu rozwiązaniach oferują bardzo zaawansowane instrukcje, które często wykonują całe złożone zadania, ułatwiając tym samym szybką realizację aplikacji.
W dalszej części rozdziału omówione zostaną najbardziej popularne technologie należące do tej kategorii.
ColdFusion
ColdFusion firmy Allaire był jednym z pierwszych serwerów aplikacji bazującym na kodzie HTML. W chwili jego wypuszczenia na rynek, większość aplikacji WWW była realizowana w formie skryptów CGI pisanych w Perlu lub innym języku skryptowym. ColdFusion w pewien sposób zrewolucjonizował proces tworzenia aplikacji WWW, dając dostęp do tej techniki informatycznej znacznie większemu kręgowi użytkowników, niż miało to miejsce w przypadku CGI.
Sekret sukcesu ColdFusion polegał na stworzeniu języka programowania posiadającego formę znaczników. Nauczenie się takiego języka przez osoby, które tworzyły już strony w kodzie HTML i rozumiały zasady jego działania, wymagało niewielkiego wysiłku. Do pokazania prostoty tej idei posłużymy się małym przykładem. Listing 23.7 zawiera wyrażenie warunkowe, które testuje wartość zmiennej temp i na jej podstawie wyświetla odpowiedni tekst.
#537
------------------------
Listing 23.7. Przykładowy fragment kodu ColdFusion
Wartością zmiennej temp jest prawda.
Wartością, zmiennej temp nie jest prawda.
------------------------
Jak widać, składnia języka jest bardzo prosta i doskonale komponuje się z konwencjami obowiązującymi HTML. Bloki kodu definiowane w innych językach programowania nawiasami, zostały w ColdFusion ograniczone znacznikami. Warto zauważyć, że wszystkie znaczniki tego języka rozpoczynają się od liter cf, co bardzo ułatwia rozróżnienie kodu ColdFusion od standardowego kodu HTML.
Wartości argumentów w znacznikach ColdFusion są im nadawane w taki sam sposób, jak w przypadku zwykłego kodu HTML (co widać na przykładzie ). Wyświetlanie wartości przechowywanych w zmiennych lub pobranych z bazy danych umożliwia znacznik . Tekst, znajdujący się między otwierającym i zamykającym znacznikiem tego typu, jest analizowany pod względem obecności specjalnych znaczników, które powinny zostać zastąpione związanymi z nimi wartościami. Przykład demonstrujący taką sytuację znajduje się w listingu 23.8.
------------------------
Listing 23.8. Zamiana znacznika na wartość
Wartością zmienej temp jest #terap#.
Przykład wywołania funkcji: #Now()#
------------------------
Znaczniki wymagające interpretacji przez ColdFusion ograniczane są z obu stron znakami # (hash). W pierwszej parze znaczników użyte zostało odwołanie do zmiennej temp, które w efekcie zastąpione zostanie wartością prawda. W drugim przypadku wywoływana jest funkcja Nów (), która wstawia w miejsce znacznika bieżącą datę i czas.
Zapytania do bazy danych z wnętrza programu ColdFusion
Jednym z fundamentalnych celów ColdFusion było umożliwienie użytkownikom zadawania pytań do baz danych i publikowania otrzymanych w ten sposób informacji w sieci. Właśnie ta cecha sprawiła, iż ColdFusion wysunął się na czoło produktów kandydujących do zastąpienia technologii CGI. Stało się tak dzięki wizji firmy Allaire, która przewidziała, iż wkrótce jednym z głównych zadań aplikacji internetowych będzie publikowanie danych w sieci WWW.
Faktem jest, iż ColdFusion został zbudowany na bazie idei komunikacji z bazami danych oraz przetwarzania i prezentowania wyników zapytań. Jego konstrukcja pozwala również na zadawanie pytań bazie danych bez konieczności posługiwania się językiem SQL. Temat ten nie będzie jednak tutaj omawiany, ponieważ celem tej książki jest propagowanie języka SQL, a nie metod pozwalających uniknąć jego użycia.
#538
Dla osób, które zdecydujÄ… siÄ™ samodzielnie tworzyć wyrażenia SQL, ColdFusion udostÄ™pnia znacznik pozwalajÄ…cy wysyÅ‚ać zapytania do relacyjnych baz danych: . Znacznik ten przekazuje zawarty w sobie tekst serwerowi bazy danych, po czym czeka na rezultaty. posiada kilka atrybutów umożliwiajÄ…cych okreÅ›lanie parametrów zapytaÅ„. Najważniejszym z nich jest datasource, wskazujÄ…cy źródÅ‚o danych ODBC, do którego wysÅ‚ać należy zapytanie. Atrybut name identyfikuje zapytanie, umożliwiajÄ…c odwoÅ‚anie siÄ™ do zwróconych przez nie wyników z wnÄ™trza dokumentu. ColdFusion pozwala na wybór źródÅ‚a danych poprzez program administrujÄ…cy i wpisa-* t . •. nie tam danych o użytkowniku lub, jeÅ›li tego nie zrobiliÅ›my, wyspecyfikowanie nazwy użytkownika i hasÅ‚a w formie odpowiednich atrybutów. PrzykÅ‚ad zapytania wysyÅ‚anego z wnÄ™trza kodu ColdFusion przedstawia listing 23.9.
------------------------
Listing 23.9. Zapytanie bazy danych w ColdFusion
SELECT * FROM Movies
------------------------
Po otrzymaniu wyników zapytania do ich wyświetlenia w dokumencie HTML można użyć znacznika , posługując się wyjaśnionym wcześniej mechanizmem znaczników zmiennych. Znacznik posiada specjalny parametr (ąuery) umożliwiający iteracyjne przetworzenie wszystkich wierszy ze zbioru wyników zapytania. W przypadku jego użycia wyświetla całą swoją zawartość, za każdym razem podstawiając nowe wartości w miejsce znaczników ograniczonych znakami # (hash). Przykład użycia znacznika w tym kontekście znajduje się w listingu 23.10.
------------------------
Listing 23.10. Znacznik wyświetlający wyniki zapytania
#title#, #gross#, #budge#
------------------------
Powyższy fragment kodu drukuje tytuł, budżet oraz dochód brutto wszystkich filmów pobranych przez zapytanie z listingu 23.9. Po umieszczeniu atrybutu ąuery w znaczniku , automatycznie tworzona jest pętla, wykonująca się po jednym razie dla każdego wiersza pobranego przez zapytanie identyfikowane wartością atrybutu ąuery. Nazwy kolumn w wynikach zapytania są automatycznie dostępne wewnątrz znacznika jako zmienne. Listing 23.11 przedstawia pełny kod strony, która pobiera i wyświetla tytuł, budżet oraz dochód wszystkich filmów z tabeli Movies. Wygląd tej strony w oknie przeglądarki pokazuje rysunek 23.6.
------------------------
Listing 23.11. Strona tworzona przez ColdFusion na podstawie wyników zapytania
Lista filmów
Lista filmów
SELECT *
#539
FROM Movie
#movie_title#, #gross#, #budge#
------------------------
------------------------
Rysunek 23.6. Lista filmów utworzona przez ColdFusion
(okno)
Lista filmów
Vegetable Houje. 30. 20
Pnnce Kong. 3.25
The Codt Wamor. 17.8, 10.3
BillDurham. 10.1
Codependence Day. 30. 15
The LimntHes. 17.5.221
SQL Stnkes Back. 10. 5
The Programmer, 45.3, 50
HardCode, 30.77
The Rear Windows. 17 5. 50
TestMoyie, 15, 15
------------------------
Do iteracyjnego przetworzenia wyników zapytania można również użyć znacznika . Główna różnica między i polega na tym, że w bloku drugiego z nich można osadzać inne znaczniki ColdFusion. Ponieważ analizuje swoją zawartość, na używane w jego wnętrzu znaczniki nakładane są pewne ograniczenia, których nie posiada . Aby użyć znacznika do wyświetlania wyników zapytania, trzeba w jego wnętrzu skorzystać ze znacznika . Nie należy jednak umieszczać w nim atrybutu ąuery, ponieważ iterację po wierszach wykonuje już sam . Przykłady prawidłowego oraz błędnego użycia połączenia znaczników i demonstrują listingi 23.12 i 23.13.
------------------------
Listing 23.12. Wyświetlanie wyników zapytania przy użyciu znacznika
#zapytanie.movie_title
------------------------
------------------------
Listing 23.13. Błędne użycie połączenia znaczników i
#zapytanie.movle_title
Kod z listingu 23.12 wyświetla tytuły wszystkich filmów zwróconych przez zapytanie. Ponieważ tym razem w znaczniku nie można umieścić atrybutu ąuery, nazwę zapytania, z którego pochodzi kolumna movie_title trzeba umieścić w samym wyrażeniu.
ColdFusion używa kropki do łączenia kolumn z zapytaniami, zatem zapytanie Ol.movie_title wskazuje, iż chodzi o wartość tej kolumny w bieżącym wierszu zapytania zapytanieOl.
#540
------------------------
Rysunek 23.7. Wynik błędnego użycia połączenia znaczników i
Lista filmów
------------------------
ASP
Ofertą firmy Microsoft na rynku serwerów aplikacji WWW jest ASP (Active Server Pages), technologia umożliwiająca programistom osadzanie w stronach HTML kodu YBScript G?zyka skryptowego bazującego na Yisual Basicu) lub JavaScript. Podobnie jak w przypadku ColdFusion, skrypty te interpretowane są przez serwer, a wyniki ich działania trafiają do dokumentów HTML, w których są osadzone.
ASP cechuje się dużą ilością zalet, które przemawiają za użyciem tej technologii do budowy aplikacji WWW. Po pierwsze, ASP korzysta z bardzo popularnych języków programowania. Według opinii firmy Microsoft, Visual Basic jest jednym z najczęściej używanych języków programowania, a VBScript jest po prostu jego uproszczoną wersją. Również JavaScript jest niezwykle popularnym narzędziem wśród programistów sieci WWW, ponieważ rozpoznaje go większość dominujących na rynku przeglądarek. Microsoft umożliwił ponadto twórcom aplikacji rozszerzanie ASP o możliwość korzystania z innych języków programowania, do których zalicza się np. odmiana Perlą firmy ActiveState o nazwie PerlScript.
Kolejna zaleta tej technologii, to możliwość tworzenia komponentów po stronie serwera, współpracujących ze skryptami ASP. Komponenty te stanowią biblioteki rozbudowujące serwer o pewne zaawansowane funkcje, które programiście łatwiej jest tworzyć w języku nie związanym z językami skryptowymi ASP. Przykładem może być realizacja połączeń z bazą danych, nie będąca rodzimym mechanizmem ASP, lecz wykonywana przez specjalne komponenty ADO (ActiveX Database Ob-ject) dołączone razem z bibliotekami ASP.
#541
ColdFusion umieszczał każdą instrukcję programu w oddzielnym znaczniku dokumentu HTML. Kod ASP jest również osadzany w dokumentach HTML, ale do jego r, wyodrębnienia używane są specjalne znaczniki <% i %>. Dowolny tekst zawarty wewnątrz tych znaczników jest traktowany przez serwer jako kod ASP. Prosty przykład demonstrujący tę ideę znajduje się w listingu 23.14.
------------------------
Listing 23.14. Strona HTML z prostym przykładem skryptu ASP
<%@ Language=VBScript %>
Przykładowoa strona z kodem ASP
Aktualnie jest godzina <% = Time %> w dniu <% = DatÄ™ %>.
------------------------
Powyższy skrypt ASP wstawia do dokumentu HTML bieżącą datę oraz czas. Wartości te zwracane są przez funkcje Time i Datę, natomiast znak równości z wyrażeniem występującym jedynie po jego prawej stronie oznacza, że wartość zwrócona przez to wyrażenie powinna być wydrukowana. Zatem = Time oznacza "wydrukuj bieżący czas", z kolei, użycie wyrażenia = "Rafę" spowodowałoby wyświetlenie łańcucha Rafę.
ASP posiada pewną interesującą cechę: jeżeli wewnątrz dokumentu użyte zostaną znaczniki <% i %>, zostanie on w całości potraktowany jako jeden duży program, w którym wszystkie elementy występujące poza ogranicznikami skryptów ASP uważane będą za wyrażenia przeznaczone do wyświetlenia. Pozwala to np. tworzyć wyrażenia warunkowe łączące kod ASP ze zwykłymi fragmentami dokumentu HTML:
<% If 2 > 3 Then %>
2 jest większe od 3.
<% ELSE %>
2 nie jest większe od 3.
<% End If %>
Wyrażenia warunkowe w ASP (oraz w ColdFusion) mają za zadanie kontrolować kod HTML umieszczany w dokumentach. Zatem po ich napotkaniu, do końcowego dokumentu trafia tylko ten fragment kodu HTML, dla którego warunek wyrażenia jest prawdziwy.
Zapytania do bazy danych z wnętrza skryptu ASP
Oczywiście najistotniejszym aspektem ASP, z punktu widzenia języka SQL, są możliwości tej technologii w zakresie komunikacji z bazami danych. Wszystkie połączenia z bazami danych realizowane są w ASP poprzez obiekty ADO (ActiveX Database Object), wyposażone w niezbędne mechanizmy pozwalające im: komunikować się z relacyjnymi bazami danych poprzez interfejs ODBC, wysyłać zapytania i pobierać zwrócone przez nie wyniki.
Oto przykład typowego zapytania SQL wykonywanego przez poprzez ASP:
<%
Set myConnection = Server.CreateObject("ADODB.Connection")
myConnection.Open "Movies"
myConnection.Execute "DELETE FROM Movies WHERE studio_id = 1"
%>
#642
Pierwszy wiersz kodu tworzy nowy obiekt ADO, który posłuży do otwarcia połączenia z określoną bazą danych i pobrania z niej wyników zapytania. W drugim wierszu metoda Open obiektu ADO otwiera połączenie z bazą danych związaną ze sterownikiem DSN o nazwie Movies. W następnym wierszu metoda Execute wysyła zapytanie do bazy danych SQL, którego celem jest usunięcie wszystkich filmów o identyfikatorze studia równym 1.
Kolejny przykład demonstruje zapytanie pobierające dane z bazy danych i przetwarzające je na kod HTML:
<%
Set myConnection = Server .CreateObject ( "ADODB.Connection")
myConnection.Open "Movies"
Set myResults = myConnection. Execute ( "SELECT * FROM Movies")
Do While Not myResults.EOF
= myResults. Fields.Item ( "movie_title )
="
"
myResults .MoveNext
Loop
%>
Jest to jedna z metod pozwalająca pobrać dane z bazy danych przy użyciu ASP i przetworzyć je na postać dokumentu HTML. Początek niczym nie różni się od poprzedniego przykładu; tworzony jest obiekt ADO, który następnie otwiera połączenie z bazą danych Movies. Kolejny krok polega na wykonaniu wyrażenia SELECT i przypisania jego wyników zmiennej myResults. Kursor dla pobranego zbioru danych ustawiany jest na pozycji BOF (przed pierwszym rekordem), dlatego trzeba użyć metody Move-First obiektu myResults, aby przesunąć go na pierwszy wiersz zbioru.
Do wygenerowania kodu HTML użyta została pętla While, która wykonuje się do momentu aż obiekt myResults osiągnie pozycję EOF (czyli znajdzie się za ostatnim rekordem w zbiorze wyników). Wewnątrz pętli drukowana jest zawartość pola movie_title oraz znacznika nowego wiersza (
), po czym następuje przejście do kolejnego rekordu w zbiorze.
Listing 23.15 zawiera pełny kod strony HTML, która wykorzystuje wyjaśniony przed chwilą skrypt ASP.
------------------------
Listing 23.15. Strona HTML połączona z bazą danych przez skrypt ASP
Lista filmów
Lista filmów
<%
Set myConnection = Server.CreateObject("ADODB.Connection") myConnection.Open "Movies"
Set myResults - myConnection.Execute("SELECT * FROM Movies")
myResults.MoveFirst
Do While Not myResults.EOF
= myResults.Fields.Item("movie_tltle")
= "
"
myResults.MoveNext Loop
%>
------------------------
#543
Serwlety Javy
Serwlety Javy to kolejna platforma o rosnącej popularności do tworzenia aplikacji WWW. Serwlet jest aplikacją uruchamianą przez serwer WWW, która przyjmuje i odpowiada nagłówkami HTTP. Pod wieloma względami serwlety Javy przypominają skrypty CGI - są to po prostu programy z wbudowanymi mechanizmami przetwarzania nagłówków HTTP, które zwracają wyniki swojego działania serwerowi WWW.
Mimo wielu podobieństw istnieją również wyraźne różnice między skryptami CGI, a serwletami Javy. Chociaż serwlety są niezależnymi programami, mogą być uruchamiane jedynie w kontekście serwera WWW (w przeciwieństwie do skryptów CGI, które można uruchomić bez jego udziału). Aby serwlet mógł zostać wykonany, serwer WWW musi być wyposażony w wirtualną maszynę Javy. Ma to istotne znaczenie, ponieważ tylko w ten sposób serwlety mogą być wykonywane w sposób ciągły.
Większość skryptów CGI kończy swoją pracę po zrealizowaniu żądania, które spowodowało ich uruchomienie. Kolejne nadchodzące żądania wymuszają zatem ponowne ich uruchamianie, co w pewnym stopniu obniża wydajność serwera. Serwlety uruchamiane są tylko raz podczas uruchomienia zarządzającego nimi mechanizmu (ang. servlet engine) i wykonują się tak długo, jak długo aktywny jest ten mechanizm. Przez cały czas swojej pracy serwlety oczekują nadchodzących żądań, realizują je, po czym powracają do stanu oczekiwania na kolejne żądania. Rozwiązanie to ma tę przewagę nad skryptami CGI, iż nie wymaga kompilowania i uruchamiania kodu za każdym razem, kiedy otrzymane zostanie żądanie do realizacji, co znacznie poprawia wydajność pracy serwera.
Kolejną zaletą serwletów jest to, iż są one budowane przy użyciu Javy, języka o wciąż rosnącej popularności. Ponieważ Java umożliwia tworzenie aplikacji według architektury zorientowanej obiektowo oraz pozwala na budowanie oprogramowania w formie modułowej, w języku tym powstaje bardzo dużych gotowych komponentów oraz interfejsów aplikacji, które mogą zostać użyte do łączenia się z wszelkiego typu aplikacjami oraz usługami. Przykładem jest standardowy interfejs o nazwie JDBC, przeznaczony do nawiązywania połączeń z wszelkiego rodzaju relacyjnymi bazami danych. Pisząc aplikację w Javie, która komunikuje się z bazą danych nie trzeba korzystać z interfejsu oferowanego przez jej producenta, wystarczy odwołać się do funkcji JDBC.
Więcej informacji na temat serwletów Javy znaleźć można na stronie firmy Sun poświęconej tej tematyce (tam też znaleźć można narzędzia przeznaczone do tworzenia serwletów oraz listę współpracujących z nimi produktów):
http://www.javasoft.com/products/servlet
Osoby zainteresowane interfejsem JDBC powinny odwiedzić następujący adres:
http://www.javasoft.com/products/jdbc
#544
Systemy oparte na wzorcach dokumentów
Najbardziej zaawansowane serwery aplikacji WWW tworzą dynamiczne strony przy użyciu wzorców dokumentów. Zaleta tego typu systemów polega na tym, że kod programu przechowywany jest w plikach nie związanych z dokumentami służącymi do dostarczania danych użytkownikowi. Oddzielenie kodu od sposobu prezentowania wyników polepsza jego czytelność i ułatwia wielokrotne użycie.
Weźmy na przykład aplikację (zbudowaną według omawianej technologii), której zadaniem jest wyświetlanie bieżącego stanu rachunku użytkownika na każdej odwiedzanej przez niego stronie. Do realizacji takiego zadania potrzebna jest funkcja pobierająca stan rachunku z bazy danych i wyświetlająca go na stronie. Po utworzeniu odpowiedniej funkcji można korzystać z niej wszędzie tam, gdzie wymagane jest jej użycie. Korzyści płynące z takiego rozwiązania staną się oczywiste, jeżeli wzięty zostanie pod uwagę fakt, iż wiele funkcji generujących dane wyjściowe może korzystać z tego samego kodu do komunikowania się z bazą danych, formatowania danych lub wykonywania innych wewnętrznych zadań aplikacji. Wszystkie funkcje można zebrać we wspólnej bibliotece, aby jak najlepiej wykorzystać możliwości współdzielenia kodu.
Realizacja tej idei jest o wiele trudniejsza, kiedy cały używany kod jest osadzany wewnątrz stron WWW. Podobne korzyści można osiągnąć w przypadku systemów składających się z samodzielnych programów, jak ma to miejsce w przypadku aplikacji bazujących na interfejsie CGI, ale tylko pod warunkiem, że zostaną one prawidłowo zaprojektowane. Przez poprawny projekt należy w tym przypadku rozumieć umieszczenie całego kodu HTML w plikach wzorców, zamiast generowania go poleceniami print przez sam program.
Niestety, większość tego typu systemów jest zbyt skomplikowana, aby można było w miarę rzeczowo opisać ich działanie w kontekście tego rozdziału. Ograniczymy się zatem jedynie do przedstawienia kilku najpopularniejszych produktów tej kategorii. Większość rozwiązań z tej kategorii umożliwia programistom tworzenie aplikacji w językach Java lub C++, chociaż stosowane są również inne języki programowania.
Jednym z przedstawicieli tego typu produktów jest WebObjects firmy Apple. We-bObjects bazuje na modelu programowania o nazwie NextStep, będącym środowiskiem programowania obiektowego w języku Objective C, a później w Javie.
Kolejną technologią, bardzo podobną do WebObjects, jest NetDynamics, umożliwiająca programistom tworzenie aplikacji WWW w językach C++ i Java. NetDynamics został przejęty przez firmę Sun i stanowi obecnie filar strategii rozwoju aplikacji WWW tej firmy.
Kiva Application Server, obecnie noszący nazwę Netscape Application Server jest kolejnym przedstawicielem tej kategorii, oferowanym przez małą firmę, która również została przejęta. Podobnie jak w przypadku WebObjects i NetDynamics, Kiva umożliwia tworzenie aplikacji w językach C++ i Java.
#545
Zasada działania serwerów opartych na wzorcach dokumentów
Jak wcześniej wspomniano, systemy oparte na wzorcach dokumentów rozdzielają kod aplikacji od stron HTML używanych do prezentowania danych użytkownikowi. Programiści umieszczają w dokumentach HTML specjalne znaczniki, z którymi skojarzony jest odpowiedni kod. Serwer aplikacji analizuje dokumenty przez wysłaniem ich do użytkownika i w przypadku odnalezienia tych znaczników uruchamia związany z nimi kod.
Na przykład, gdyby zaszła potrzeba spersonalizowania witryny WWW, tak aby wyświetlała ona nazwę użytkownika, za każdym razem kiedy odwiedza on jej stronę domową, należałoby umieścić w niej znacznik o następującej postaci:
[SHOW username]
Podczas interpretacji strony serwer aplikacji napotkałby ten znacznik i wywołał odpowiednią procedurę, która odnalazłaby nazwę użytkownika (np. poprzez mechanizm ciasteczek - ang. cookies) i wstawiła ją do dokumentu w miejscu napotkania znacznika.
Projektanci stron muszą zapoznać się jedynie z relatywnie prostą składnią znaczników umieszczanych w stronach, natomiast ciężar ich oprogramowania spada na programistów.
W praktyce
Rozpoczynając pracę nad nową aplikacją WWW, stajemy przed problemem wyboru serwera aplikacji. Już teraz liczba możliwych opcji jest bardzo duża, a w przyszłości z pewnością będzie jeszcze większa. Wybranie w takiej sytuacji odpowiedniego serwera WWW jest zadaniem trudnym, mającym wpływ na dalszy rozwój całego projektu, dlatego warto rozważyć wszystkie możliwości, ponieważ tylko trafny wybór daje szansę sukcesu w tej branży.
Jednymi z kluczowych czynników, mających wpływ na ostateczną decyzję co do wyboru serwera aplikacji, powinny być: język programowania oraz środowisko rozwoju aplikacji, z którymi programiści pracujący nad projektem są najlepiej zaznajomieni. Liczba dostępnych serwerów gwarantuje znalezienie rozwiązania, które w najefektywniejszy sposób wykorzysta siłę twórczą programistów.
Wytrawni programiści Yisual Basica będą zapewne chcieli skorzystać z technologii ASP lub innego serwera (np. HathSite), który pozwoli im wykorzystać posiadaną wiedzę na temat tego języka. Z kolei programiści związani z systemem UNIX wybiorą rozwiązanie oparte na Perlu. Bogaty wybór będą również miały osoby znające Javę, ponieważ język ten jest preferowany przez wiele rozwiązań sieciowych.
#546
Nie wszyscy wiedzą, iż większość firm oferujących środowiska przeznaczone do tworzenia aplikacji typu klient-serwer udostępnia również dodatkowe narzędzia do tworzenia aplikacji WWW. Przykładem może być środowisko PowerBuilder firmy Sybase, które oprócz standardowych programów klient-serwer umożliwia również tworzenie aplikacji WWW. Własną gamę produktów wspomagających tworzenie aplikacji sieci WWW posiada również Oracle. ;
Po zredukowaniu listy serwerów aplikacji w oparciu o preferencje swoich pracowników, pozostaje szereg innych czynników, które mogą wpłynąć na decyzję dotyczącą wyboru jednego z nich. O dziwo, nie należy do nich współpraca serwerów z bazami danych. Pod tym względem większość serwerów cechuje szeroki zakres możliwości, wspomagany ponadto interfejsami takimi jak ODBC dla Windows, czy JDBC dla Javy. Oczywiście wybierając konkretny produkt należy sprawdzić, czy będzie on w stanie współpracować z istniejącą bazą danych, ale nie jest to na ogół żadna przeszkoda w wyborze serwera aplikacji WWW.
Tym, co może mieć wpływ na wybór serwera jest dojrzałość produktu. Niemal wszystkie produkty przeznaczone dla sieci WWW są w miarę nowe, co wynika z wieku samej sieci, której początki datuje się na rok 1993, a gwałtowny rozwój popularności na rok 1996. Niestety, oznacza to, że niektóre z produktów są jeszcze nie w pełni wykształcone - brakuje im obiecywanych cech lub działają one w sposób niestabilny. Zanim więc zdecydujemy się na wybór konkretnego oprogramowania, warto porozmawiać z innymi użytkownikami, którzy mieli okazję korzystać z niego w praktyce i są w stanie wydać jakąś obiektywną opinię na temat jego przydatności. Inną metodą poznania ograniczeń danego produktu jest wykonanie za jego pomocą małego prototypu aplikacji przed przystąpieniem do prac nad właściwym projektem.
Jeśli nadal pozostaje kilka propozycji do wyboru, należy skupić się raczej na serwerach bardziej ogólnego przeznaczenia, odrzucając te realizujące pewien ograniczony typ zadań. Większość projektów aplikacji WWW jest na tyle złożona, że próba ich realizacji przy pomocy serwerów zaprojektowanych dla specyficznych zadań spotka się z ograniczeniami, które w efekcie uniemożliwią zaimplementowanie niektórych cech systemu założonych w projekcie. Połowicznym rozwiązaniem tego problemu jest szukanie innych narzędzi, które uzupełnią braki serwera, niemniej jednak sytuacji takiej można uniknąć stosując od początku serwer ogólnego przeznaczenia.
Inną wadą, która często towarzyszy serwerom przeznaczonym do realizacji specyficznych zadań, (takich jak publikowanie informacji, telemarketing, czy tworzenie grup dyskusyjnych), jest współpraca z bazą danych o z góry założonym schemacie. Uniemożliwia to tworzenie własnych struktur danych lub korzystanie z istniejących tabel.
Z drugiej strony, jeżeli zależy nam na szybkim wdrożeniu aplikacji do pracy i jesteśmy w stanie pójść na pewne ustępstwa co do wymagań funkcjonalnych całego projektu, specjalistyczne rozwiązania są doskonałym wyjściem z sytuacji. Ponadto oferują one funkcjonalność, której często nie da się zrealizować samodzielnie. W niektórych przypadkach można połączyć oba rozwiązania zaopatrując się w narzędzie ogólnego przeznaczenia, jakim jest ASP lub Perl/CGI, a następnie zakupić specjalistyczne oprogramowanie bazujące na tej technologii. W ten sposób otrzymujemy do ręki gotową aplikację WWW realizującą nasze założenia, którą w każdej chwili możemy rozszerzyć o nowe cechy, ponieważ bazuje ona na standardowym serwerze aplikacji.
Wyszukiwarka
Podobne podstrony:
PHP i MySQL Tworzenie aplikacji WWW phmsap
APLIKACJA WWW
Sposób na Darmowe kody na płatne serwery (na www fotka pl)
Splatana siec Przewodnik po?zpieczenstwie nowoczesnych aplikacji WWW splasi
JavaServer Faces i Eclipse Galileo Tworzenie aplikacji WWW
Apache Zabezpieczenia aplikacji i serwerów www
Modyfikacje Win Xp Jak Postawić Serwer Www
04 Zadanie serwer WWW
Definiowanie katalogów wirtualnych serwera WWW
02 Linux Konfiguracja serwera WWW APACHE
Podstawy ASP NET 2 0 – tworzenie stron WWW oraz aplikacji Web
instalacja serwera www cwiczenia
05 Komunikacja aplikacji z serwerem (cw)
05 WAI serwery www 13
więcej podobnych podstron