23 Serwery aplikacji WWW


#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</titlex/head><br><body><br><form action="/cgi-bin/sample.cgi"><br>Nazwisko: <input type="text" name="name" size="40"xbr><br>Ranga: <input type-"text" name="rank" size="40"xbr><br>Numer sÅ‚użbowy: <input type="text" name="serial_/ium" size="40"><br><br><input type="submit"><br></form><br></bodyx/html><br>-------------------------------<br><br>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.<br>#529<br>-------------------------------<br>Listing 23.2. Skrypt w jÄ™zyku Perl przetwarzajÄ…cy dane z formularza<br><br>#!/usr/bin/perl<br>use CGI;<br>$query = new CGI;<br>$name - $query->param('name1);<br>$rank = $query->param('rank');<br>$serial_num = $query->param('serial_num');<br>print $query->header;<br>print "<htmlxheadxtitle>Dane osobowe żoÅ‚nierza</titlex/head>\n";<br>print "<body>\n<p>Nazwisko $name.</p>\n";<br>print "<p>Ranga $rank, numer sÅ‚użbowy \n";<br>print " $serial_num.</p>\n";<br>-------------------------------<br><br>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:<br><br>#!/bin/sh<br><br>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.<br>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:<br><br>$name = $query->param{ 'name' );<br>$rank = $query->param{'rank');<br>$serial_num = $query->param{'serial_num");<br><br>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.<br>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:<br><br>print $query->header;<br><br>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.<br>#530<br>-------------------------------<br>Rysunek 23.2. Strona wygenerowana przez skrypt CGI<br>-------------------------------<br>==================<br>Rada<br>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Ä…:<br><br>use CGI qw(:cgi-lib);<br><br>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.<br>=================<br><br>Testowanie skryptów CGI<br><br>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.<br>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.<br>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.<br>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Ä….<br>#531<br>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.<br>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.<br><br>Zapisywanie danych z formularza w bazie danych<br><br>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.<br>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.<br>-------------------------------<br>Listing 23.3. Tabela Soldier_Data<br><br>CREATE TABLE Soldier_Data<br>(serial_num VARCHAR(40) PRIMARY KEY,<br>name VARCHAR(40),<br>rank VARCHAR(40))<br>-------------------------------<br><br>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).<br>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Ä….<br>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.<br>#532<br>-------------------------------<br>Listing 23.4. Skrypt sample.cgi po modyfikacji umożliwiajÄ…cej mu komunikowanie siÄ™ z bazÄ… danych<br><br>#!/usr/bin/perl<br>use DBI;<br>use CGI;<br>$query = new CGI;<br>$name = $query->param('name');<br>$rank = $query->param('rank');<br>$serial_num = $query->param('serial_num');<br>$dbh - DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey1);<br>$statement = qq{<br>INSEKT INTO Soldier_Data<br>(name, rank, serial_num)<br>VALUES<br>('Sname1, 'Srank', 'Sserial_num')<br>}; $sth = $dbh->prepare(Sstatement);<br>$rc - Ssth->execute;<br><br>print $query->header;<br>print "<html><headxtitle>Dane osobowe źoÅ‚nierza</titlex/head>\n";<br>print "<body>\n<p>Nazwisko Sname.</p>\n";<br>print "<p>Ranaga Srank, numer sÅ‚użbowy \n";<br>print " $serial_num.</p>\n";<br>-------------------------------<br><br>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.<br>Do utworzenia poÅ‚Ä…czenia z bazÄ… danych sÅ‚uży metoda pakietu DBI o nazwie connect:<br><br>$dbh = DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey');<br><br>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.<br>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.<br>===================<br>Rada<br>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.<br>#533<br>========================<br>Rada<br>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.<br>=====================<br><br>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.<br>------------------------<br>Rysunek 23.3. WypeÅ‚niony formularz aplikacji<br>------------------------<br>------------------------<br>Rysunek 23.4. Strona wygenerowana przez skrypt CGI<br>------------------------<br>------------------------<br>Listing 23.5. Zawartość tabeli Soldier_Data<br><br>SELECT *<br>FROM Soldier Data<br><br>+-----------+-----------+-----------+<br>|serial_num | name | rank |<br>+-----------+-----------+-----------+<br>|123456789 | RafÄ™ Colburn | GeneraÅ‚ |<br>|83813319 | Jan Nowak | Szeregowy|<br>|83819311 | Lidia Brzeg | Major |<br>+-----------+--------------+--------+<br><br>3 rows in set (0.00 sec)<br>------------------------<br>#534<br>Zapytania do bazy danych z wnÄ™trza skryptu CGI<br><br>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.<br>------------------------<br>Listing 23.6. Program przetwarzajÄ…cy zawartość tabeli na kod HTML<br><br>#!/usr/bin/perl<br>use CGI;<br>use DBI;<br>$query = new CGI;<br>$dbh = DBI->connect('DBI:mysql:rc3', 'rc3', 'donkey');<br>$statement = "SELECT * FROM Soldier_Data";<br>$sth - $dbh->prepare($statement);<br>Src = $sth->execute;<br>print $query->header;<br>print "<htmlxheadxtitle>Lista żoÅ‚nierzy</titlex/head>\n";<br>print "<bodyxhl>Lista żoÅ‚nierzy</hl>\n";<br>while (($serial_num, $name, $rank) = $sth->fetchrow) {<br>print "$name, $rank, $serial__num<br>\n";<br>}<br>print "</bodyx/html>\n";<br>------------------------<br><br>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-<br>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.<br>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.<br>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 <hl>). Poszczególne rekordy przetwarzane sÄ… przez nastÄ™pujÄ…cy blok kodu:<br><br>while (($serial_num, $name, $rank) = $sth->fetchrow) {<br>print "$name, $rank, $serial_num<br>\n";<br>}<br><br>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<br>#535<br>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:<br><br>@curren_row = $sth->fetchrow;<br><br>Aby jednak uczynić program bardziej czytelnym, przypisanie wykonywane jest do trzech niezależnych zmiennych skalarnych, wyspecyfikowanych jako lista:<br><br>($serial_num, $name, $rank) = $sth->fetchrow<br><br>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.<br>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:<br><br>print "$name, $rank, $serial_num<br>\n";<br><br>Po wyjÅ›ciu z pÄ™tli skrypt dodaje znaczniki koÅ„czÄ…ce dokument HTML (</body> i </html>) i koÅ„czy swojÄ…pracÄ™. Wynik dziaÅ‚ania skryptu przedstawia rysunek 23.5.<br>------------------------<br>Rysunek 23.5. Dane pobrane z bazy danych prezentowane w formie strony HTML<br>Lista żoÅ‚nierzy<br>RafÄ™ Cofcura. General 123156789<br>Jan Nowak. Szeregowy 83813319<br>Lida Brzeg. Major 83819311<br>------------------------<br>====================<br>Rada<br>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.<br>====================<br>#536<br>Programy osadzane w kodzie HTML<br><br>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.<br>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.<br>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.<br>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.<br>W dalszej części rozdziaÅ‚u omówione zostanÄ… najbardziej popularne technologie należące do tej kategorii.<br><br>ColdFusion<br><br>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.<br>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.<br>#537<br>------------------------<br>Listing 23.7. PrzykÅ‚adowy fragment kodu ColdFusion<br><br><cfset temp="prawda"><br><cfif temp is "prawda"><br>WartoÅ›ciÄ… zmiennej temp jest prawda.<br><cfelse><br>WartoÅ›ciÄ…, zmiennej temp nie jest prawda.<br></cfif><br>------------------------<br><br>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.<br><br>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 <cf set>). WyÅ›wietlanie wartoÅ›ci przechowywanych w zmiennych lub pobranych z bazy danych umożliwia znacznik <cf output>. 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.<br>------------------------<br>Listing 23.8. Zamiana znacznika na wartość<br><br><cfset temp="prawda"><br><cfoutput>WartoÅ›ciÄ… zmienej temp jest #terap#. </cfoutput><br><cfoutput>PrzykÅ‚ad wywoÅ‚ania funkcji: #Now()#</cfoutput><br>------------------------<br><br>Znaczniki wymagajÄ…ce interpretacji przez ColdFusion ograniczane sÄ… z obu stron znakami # (hash). W pierwszej parze znaczników <cf output> 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.<br><br>Zapytania do bazy danych z wnÄ™trza programu ColdFusion<br><br>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.<br>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.<br>#538<br>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: <cfqu-ery>. Znacznik ten przekazuje zawarty w sobie tekst serwerowi bazy danych, po czym czeka na rezultaty. <cf query> 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.<br>------------------------<br>Listing 23.9. Zapytanie bazy danych w ColdFusion<br><br><cfquery datasource="baza_danych" name="zapytanie01"><br>SELECT * FROM Movies<br></cfquery><br>------------------------<br><br>Po otrzymaniu wyników zapytania do ich wyÅ›wietlenia w dokumencie HTML można użyć znacznika <cfoutput>, posÅ‚ugujÄ…c siÄ™ wyjaÅ›nionym wczeÅ›niej mechanizmem znaczników zmiennych. Znacznik <cfoutput> posiada specjalny parametr (Ä…uery) umożliwiajÄ…cy iteracyjne przetworzenie wszystkich wierszy ze zbioru wyników zapytania. W przypadku jego użycia <cfoutput> 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 <cfoutput> w tym kontekÅ›cie znajduje siÄ™ w listingu 23.10.<br>------------------------<br>Listing 23.10. Znacznik <cfoutput> wyÅ›wietlajÄ…cy wyniki zapytania<br><br><cfoutput query="zapytanie01"><br>#title#, #gross#, #budge#<br><br></cfoutput><br>------------------------<br><br>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 <cfoutput>, 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 <cfoutput> 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.<br>------------------------<br>Listing 23.11. Strona tworzona przez ColdFusion na podstawie wyników zapytania<br><br><html><br><headxtitle>Lista filmów</titlex/head><br><body><br><h1>Lista filmów</h1><br><cfquery datasource="baza_danych" name="zapytanie01"><br>SELECT *<br>#539<br>FROM Movie<br></cfquery><br><cfoutput query="zapytanie01"><br>#movie_title#, #gross#, #budge#<br><br></cfoutput><br></bodyx/html><br>------------------------<br>------------------------<br>Rysunek 23.6. Lista filmów utworzona przez ColdFusion<br>(okno)<br>Lista filmów<br>Vegetable Houje. 30. 20<br>Pnnce Kong. 3.25<br>The Codt Wamor. 17.8, 10.3<br>BillDurham. 10.1<br>Codependence Day. 30. 15<br>The LimntHes. 17.5.221<br>SQL Stnkes Back. 10. 5<br>The Programmer, 45.3, 50<br>HardCode, 30.77<br>The Rear Windows. 17 5. 50<br>TestMoyie, 15, 15<br>------------------------<br><br>Do iteracyjnego przetworzenia wyników zapytania można również użyć znacznika <cfloop>. Główna różnica miÄ™dzy <cfoutput> i <cfloop> polega na tym, że w bloku drugiego z nich można osadzać inne znaczniki ColdFusion. Ponieważ <cfoutput> analizuje swojÄ… zawartość, na używane w jego wnÄ™trzu znaczniki nakÅ‚adane sÄ… pewne ograniczenia, których nie posiada <cfloop>. Aby użyć znacznika <cfloop> do wyÅ›wietlania wyników zapytania, trzeba w jego wnÄ™trzu skorzystać ze znacznika <cf output>. Nie należy jednak umieszczać w nim atrybutu Ä…uery, ponieważ iteracjÄ™ po wierszach wykonuje już sam <cf loop>. PrzykÅ‚ady prawidÅ‚owego oraz bÅ‚Ä™dnego użycia poÅ‚Ä…czenia znaczników <cfloop> i <cfprint> demonstrujÄ… listingi 23.12 i 23.13.<br>------------------------<br>Listing 23.12. WyÅ›wietlanie wyników zapytania przy użyciu znacznika <cfloop><br><br><cfloop query="zapytanie01"><br><cf output>#zapytanie.movie_title<brx/cf output><br></cfloop><br>------------------------<br>------------------------<br>Listing 23.13. BÅ‚Ä™dne użycie poÅ‚Ä…czenia znaczników <cfloop> i <cdoutput><br><br><cfloop query="zapytanie01"><br><cfoutput query="zapytanie01">#zapytanie.movle_title<brx/cfoutput><br></cfloop><br><br>Kod z listingu 23.12 wyÅ›wietla tytuÅ‚y wszystkich filmów zwróconych przez zapytanie. Ponieważ tym razem w znaczniku <cf output> nie można umieÅ›cić atrybutu Ä…uery, nazwÄ™ zapytania, z którego pochodzi kolumna movie_title trzeba umieÅ›cić w samym wyrażeniu.<br>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.<br>#540<br>------------------------<br>Rysunek 23.7. Wynik bÅ‚Ä™dnego użycia poÅ‚Ä…czenia znaczników <cfoutput> i <cfloop><br>Lista filmów<br>------------------------<br><br>ASP<br><br>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.<br>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.<br>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.<br>#541<br>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.<br>------------------------<br>Listing 23.14. Strona HTML z prostym przykÅ‚adem skryptu ASP<br><br><%@ Language=VBScript %><br><html><br><headxtitle>PrzykÅ‚adowoa strona z kodem ASP</titleX/head><br><body><br>Aktualnie jest godzina <% = Time %> w dniu <% = DatÄ™ %>.<br></body><br></html><br>------------------------<br><br>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Ä™.<br>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:<br><br><% If 2 > 3 Then %><br>2 jest wiÄ™ksze od 3.<br><% ELSE %><br>2 nie jest wiÄ™ksze od 3.<br><% End If %><br><br>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.<br><br>Zapytania do bazy danych z wnÄ™trza skryptu ASP<br><br>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.<br>Oto przykÅ‚ad typowego zapytania SQL wykonywanego przez poprzez ASP:<br><br><%<br>Set myConnection = Server.CreateObject("ADODB.Connection")<br>myConnection.Open "Movies"<br>myConnection.Execute "DELETE FROM Movies WHERE studio_id = 1"<br>%><br>#642<br>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.<br>Kolejny przykÅ‚ad demonstruje zapytanie pobierajÄ…ce dane z bazy danych i przetwarzajÄ…ce je na kod HTML:<br><br><%<br>Set myConnection = Server .CreateObject ( "ADODB.Connection")<br>myConnection.Open "Movies"<br>Set myResults = myConnection. Execute ( "SELECT * FROM Movies")<br>Do While Not myResults.EOF<br>= myResults. Fields.Item ( "movie_title )<br>="<BR>"<br>myResults .MoveNext<br>Loop<br>%><br><br>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.<br>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 (<BR>), po czym nastÄ™puje przejÅ›cie do kolejnego rekordu w zbiorze.<br>Listing 23.15 zawiera peÅ‚ny kod strony HTML, która wykorzystuje wyjaÅ›niony przed chwilÄ… skrypt ASP.<br>------------------------<br>Listing 23.15. Strona HTML poÅ‚Ä…czona z bazÄ… danych przez skrypt ASP<br><br><html><br><headxtitle>Lista filmów</titlex/head> <body><br><h1>Lista filmów</h1><br><%<br>Set myConnection = Server.CreateObject("ADODB.Connection") myConnection.Open "Movies"<br>Set myResults - myConnection.Execute("SELECT * FROM Movies")<br>myResults.MoveFirst<br>Do While Not myResults.EOF<br>= myResults.Fields.Item("movie_tltle")<br>= "<BR>"<br>myResults.MoveNext Loop<br>%><br></bodyx/html><br>------------------------<br>#543<br>Serwlety Javy<br><br>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.<br>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.<br>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.<br>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.<br>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):<br><br>http://www.javasoft.com/products/servlet<br><br>Osoby zainteresowane interfejsem JDBC powinny odwiedzić nastÄ™pujÄ…cy adres:<br><br>http://www.javasoft.com/products/jdbc<br>#544<br>Systemy oparte na wzorcach dokumentów<br><br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>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.<br>#545<br>Zasada dziaÅ‚ania serwerów opartych na wzorcach dokumentów<br><br>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.<br>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:<br><br>[SHOW username]<br><br>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.<br>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.<br><br>W praktyce<br><br>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.<br>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.<br>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.<br>#546<br>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. ;<br>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.<br>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.<br>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.<br>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.<br>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.<br> <br>Wyszukiwarka<br> <form method="get" action="https://zanotowane.pl/szukaj3.php"> <input value="" id="q" name="q" /> <input type="submit" value="Szukaj" /> </form> <br>Podobne podstrony:<br><a href="../../89/9154">PHP i MySQL Tworzenie aplikacji WWW phmsap</a><br><a href="../../120/4294">APLIKACJA WWW</a><br><a href="../../153/4382">Sposób na Darmowe kody na pÅ‚atne serwery (na www fotka pl)</a><br><a href="../../182/1434">Splatana siec Przewodnik po?zpieczenstwie nowoczesnych aplikacji WWW splasi</a><br><a href="../../152/2487">JavaServer Faces i Eclipse Galileo Tworzenie aplikacji WWW</a><br><a href="../../199/7313">Apache Zabezpieczenia aplikacji i serwerów www</a><br><a href="../../189/2675">Modyfikacje Win Xp Jak Postawić Serwer Www</a><br><a href="../../87/5158">04 Zadanie serwer WWW</a><br><a href="../../98/9302">Definiowanie katalogów wirtualnych serwera WWW</a><br><a href="../../135/6248">02 Linux Konfiguracja serwera WWW APACHE</a><br><a href="../../193/8072">Podstawy ASP NET 2 0 – tworzenie stron WWW oraz aplikacji Web</a><br><a href="../../184/8650">instalacja serwera www cwiczenia</a><br><a href="../../111/1978">05 Komunikacja aplikacji z serwerem (cw)</a><br><a href="../../185/5366">05 WAI serwery www 13</a><br><br><a href="https://zanotowane.pl/szukaj3.php?q=23++Serwery+aplikacji+WWW" rel="nofollow">wiÄ™cej podobnych podstron</a><br><br><form method="get" action="https://zanotowane.pl/szukaj3.php"><input value="" id="q" name="q" /><input type="submit" value="Szukaj" /></form> </div> <!-- /.container --> <footer> <div class="footer-blurb"> <div class="container"> <div class="row"> <div class="col-sm-4 footer-blurb-item"> </div> </div> <!-- /.row --> </div> </div> <div class="small-print"> <div class="container"> <p><a href="mailto:edibk@onet.pl">Kontakt</a> | <a href="../../polityka.php">Polityka prywatnoÅ›ci</a></p> </div> </div> </footer> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-L8W7STRP18"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-L8W7STRP18'); </script> </body> </html>