Strona główna

Wstęp

Celem pracy było stworzenie wygodnych, łatwych w użyciu aplikacji internetowych przeznaczonych dla osób przeglądających internetowe strony Wydziału. Aplikacje napisano z użyciem nowoczesnych technologii, takich jak PHP 4, DHTML, czy XML.

Zaprojektowano i wykonano następujące oprogramowanie:

Pierwsza część pracy zawiera wprowadzenie do zagadnień związanych z WWW. W rozdziale drugim przedstawiono architektury aplikacji internetowych. Rozdział trzeci zawiera opis technologii internetowych wykorzystanych w pracy. Głównym rozdziałem pracy jest rozdział czwarty, w którym można znaleźć szczegółowy opis wykonanych aplikacji. Podsumowanie całego projektu znajduje się w ostatnim, piątym rozdziale.

Działające aplikacje można również zobaczyć na stronach wydziałowego serwisu WWW, dostępnego pod adresem http://www.mimuw.edu.pl.

Opis zrealizowanych aplikacji

Plany Wydziału z systemem wyszukiwania pracowników

Funkcjonalność narzędzia

Głównym celem aplikacji jest umożliwienie osobom przeglądającym internetowe strony Wydziału zapoznanie się z topografią budynku i przeznaczeniem poszczególnych pomieszczeń na wszystkich piętrach. W jej ramach jest również dostępny wygodny system wyszukiwania pracowników. Pozwala on na sprawdzenie, czy istnieje pracownik o danych personaliach, a jeśli tak — gdzie znajduje się jego pokój.

Sposób użytkowania

Obsługa aplikacji jest bardzo prosta. Na stronie początkowej znajduje się obrazek z rysunkiem budynku Wydziału z podziałem na piętra. Po kliknięciu na fragment obrazka, który odpowiada danemu piętru, otwiera się strona z planem tego piętra podzielona na trzy ramki.

W górnej ramce po lewej stronie znajdują się dowiązania do innych pięter i numer bieżącego piętra. Kliknięcie na środkowe dowiązanie powoduje otwarcie okna systemu wyszukiwania pracowników. Zostanie on szczegółowo opisany w dalszej części rozdziału. Dowiązanie po prawej stronie prowadzi do strony początkowej. W środkowej ramce znajduje się obrazek z planem bieżącego piętra. Ramka jest automatycznie przewinięta w prawo, aby ukryć część budynku należącą do Wydziału Biologii. Na planie są naniesione numery pokojów, a w przypadku pomieszczeń, które nie mają numeru ich nazwa.

Po kliknięciu na fragment obrazka, który odpowiada danemu pomieszczeniu, zarys tego pomieszczenia zostaje otoczony czerwonymi narożnikami, a w dolnej ramce pojawia się strona z jego opisem.

Wyróżniamy następujące rodzaje pomieszczeń: Jak wcześniej wspomniano kliknięcie na dowiązanie "Szukaj pracownika" powoduje otwarcie okna systemu wyszukiwania pracowników uwidocznionego na rysunku 4.1.

Po wpisaniu w pole tekstowe wzorca wyszukiwania i kliknięciu na przycisk "Szukaj" otwiera się strona zawierająca informację o liczbie znalezionych pracowników oraz ich listę uporządkowaną alfabetycznie wg nazwisk i imion. Przykładowy rezultat wyszukiwania ze wzorcem "min" pokazano na rysunku 4.2.



rys. 4.1 Okno startowe systemu wyszukiwania pracowników



rys. 4.2 Wynik wyszukiwania

Do listy znalezionych należą pracownicy, których nazwisko lub imię zawiera wzorzec wyszukiwania. Wielkość liter nie jest uwzględniana. Polskie znaki narodowe dopasowują się do odpowiadających im znaków łacińskich. Kliknięcie na personalia pracownika powoduje wykonanie następujących akcji: Kliknięcie na numer pokoju daje ten sam wynik, z wyjątkiem tego, że w dolnej ramce otwiera się strona z opisem tego pokoju. Użytkownik może dokonać ponownego wyszukiwania. Kliknięcie na przycisk "Powrot" powoduje powrót na stronę z formularzem, a tam kliknięcie na przycisk "Wyzeruj" powoduje wyczyszczenie pola tekstowego i umożliwia ponowne wpisanie wzorca wyszukiwania. Zarówno na stronie z formularzem, jak i na stronie z wynikami wyszukiwania znajduje się przycisk "Zamknij". Kliknięcie na niego powoduje zamknięcie okna systemu wyszukiwania pracowników.

Architektura

Aplikacja ma architekturę trzywarstwową. Baza danych Oracle zarządza danymi, serwer WWW przetwarza dane a przeglądarka je wizualizuje (rys. 4.3).



rys. 4.3 Architektura aplikacji

Dane o pracownikach znajdują się w Systemie Obsługi Spraw Pracowniczych SOSP będącym modułem Uniwersyteckiego Systemu Obsługi Studiów USOS. Głównym zadaniem USOS jest przechowywanie i przetwarzanie informacji dotyczących studentów, pracowników danej uczelni oraz oferowanych przez nią studiów.

Pierwotnie dane z SOSP miały być ściągane przez aplikację bezpośrednio przez wykonywanie zapytań do bazy danych. Jednak z uwagi na to, że dane zmieniają się rzadko, zdecydowano się na inne rozwiązanie.

Aktualizacji danych potrzebnych aplikacji dokonuje uniksowy program cron. Cron jest programem-demonem, który wywołuje określone komendy, zgodnie z ustalonym harmonogramem. Na potrzeby opisywanej aplikacji cron w ustalonych odstępach czasu wywołuje skrypt napisany w języku powłoki uniksowej. Skrypt ten ściąga potrzebne aplikacji dane do plików tekstowych o określonym formacie. Pliki te znajdują się w ustalonym katalogu.

Ponieważ wydziałowy serwer WWW jest uruchamiany na komputerze, na którym nie ma zainstalowanego klienta bazy danych Oracle, skrypt musi ściągać dane ze zdalnej maszyny. Realizowane jest to za pomocą programu ssh, który umożliwia uruchomienie klienta Oracle na zdalnym komputerze. Strumień wyjściowy tego klienta jest przekierowywany do odpowiednich plików.

Dane wiążące pracownika z jego pokojem i generyczną stroną domową znajdują się w pliku pracownicy.txt. Każdy wiersz pliku dotyczy jednego pracownika i ma następujący format:
nr_piętra:nr_pokoju:nazwa_pliku_z_danymi_do_strony_generycznej:personalia
Z każdym pracownikiem jest związany plik z danymi do strony generycznej. Jest to plik w formacie HTML bez nagłówka i stopki. Nagłówek i stopka są doklejane przez odpowiedni skrypt PHP w trakcie dynamicznego tworzenia strony pracownika.

Technologia

Użytkownik klikając na plan danego piętra w różnych miejscach otrzymuje informacje o przeznaczeniu pomieszczeń na tym piętrze. Efekt ten uzyskuje się dzięki zastosowaniu mapowania obrazka w języku HTML po stronie klienta.

Ponieważ dane dotyczące pracownika uzyskuje się dynamicznie, więc większość stron aplikacji również trzeba tworzyć dynamicznie. Jako język tworzenia stron wybrano PHP.

Skrypty PHP używane przez aplikację to: Aby obsługa aplikacji była jak najwygodniejsza, użyto technologii DHTML. Po kliknięciu myszką na fragment planu dotyczący danego pokoju zarys tego pokoju otaczany jest czerwonymi narożnikami. Ten sam rezultat osiąga się wówczas, gdy użytkownik kliknie na dowiązanie będące wynikiem wyszukiwania pracownika. Efekt ten uzyskuje się przez zastosowanie dynamicznie pokazywanych i chowanych warstw. Każdy z narożników znajduje się na osobnej warstwie. Każda z tych warstw jest przesuwana, chowana i pokazywana przez odpowiednie funkcje w języku JavaScript.

Efekt dynamicznie zmieniającego się obrazka można by również zrealizować po stronie serwera używając PHP z biblioteką graficzną GD GD. Byłoby to jednak rozwiązanie gorsze, ponieważ każde kliknięcie na plan powodowałoby stworzenie na serwerze nowego obrazka. Przeglądarka musiałaby na nowo ściągnąć uaktualniony obrazek.

Języka JavaScript używa się również do:

Wirtualne Laboratorium Komputerowe

Funkcjonalność narzędzia

Aplikacja służy do wizualizacji na stronach WWW informacji uzyskiwanych przez klienta SNMP od komputerów w Laboratorium Komputerowym. Korzystając z protokołu SNMP (ang. Simple Network Management Protocol) administrator może zlokalizować problemy w sieci TCP/IP. Klient SNMP kontaktuje się z serwerem SNMP działającym na zdalnej maszynie. Serwer zarządza zbiorem zmiennych prostych i tabel. Standard MIB (Managament Information Base) definiuje zbiór zmiennych, którymi posługują się serwery SNMP, oraz ich semantykę. Zmienne proste przechowują proste statystyki, np. liczbę otrzymanych pakietów, a tablice — bardziej skomplikowane, np. pamięć ARP. Niektóre zmienne są zebrane w grupy, np. zmienne dotyczące protokołu IP. SNMP korzysta z modelu pobierz-zapisz. Klient wysyła prośby do serwera i otrzymuje od niego odpowiedzi. W opisywanej aplikacji jedynie pobiera się dane od serwera. Więcej informacji na temat SNMP można znaleźć np. w Stevens98 i ComStev97.

Sposób użytkowania

Na stronie początkowej znajduje się obrazek z planem Laboratorium Komputerowego. W Laboratorium jest rozmieszczonych kilkadziesiąt komputerów podłączonych do lokalnej sieci. Każdy komputer może zostać przestawiony w inne miejsce, jak również może zostać zmieniona jego nazwa i numer IP. W związku z tym nie zdecydowano się na wizualizację rzeczywistego położenia komputerów i naniesienie na plan ich nazw. Zamiast tego na obrazku znajdują się rysunki komputerów podłączonych do gniazd sieciowych. Każde gniazdo ma swój unikalny numer (rys. 4.4).

Nazwa komputera pojawia się dynamicznie, po przeniesieniu wskaźnika myszki na zarys tego komputera. Jeżeli nie można kliknąć na rysunek komputera przyłączonego do danego gniazda i nazwa tego komputera nie jest uwidaczniana, to oznacza, że w rzeczywistym świecie do tego gniazda nie jest podłączony żaden komputer. W przeciwnym przypadku otwiera się okno z listą zmiennych SNMP. Po kliknięciu na nazwę zmiennej otrzymujemy stronę z wartością zmiennej. Tablice są wizualizowane jako tabele HTML. Rysunek 4.5 przedstawia przykład wizualizacji zmiennej.



rys. 4.4 Fragment planu laboratorium



rys. 4.5 Przykład wizualizacji zmiennej SNMP

Architektura

Aplikacja ma architekturę trzywarstwową. Serwer SNMP zarządza danymi, serwer WWW przetwarza dane, a przeglądarka je wizualizuje.

Dane wiążące nazwę komputera z gniazdem, do którego jest podłączony, znajdują się w pliku KOMPUTERY. Każdy wiersz pliku dotyczy jednego komputera i ma następujący format:
nr_gniazda:nazwa_komputera:haslo:wspolrzedne
Pole "haslo" zawiera hasło dostępowe serwera SNMP (community), a pole "wspolrzedne" — współrzędne rysunku danego komputera na obrazku. Znając nazwę komputera można wysłać żądanie do serwera SNMP uruchomionego na tym komputerze. Żeby uzyskać wartość zmiennej prostej, aplikacja używa programu snmpget a żeby uzyskać wartość zmiennej tablicowej — programu snmpwalk. Oba programy wchodzą w skład pakietu ucd-snmp. Nazwy zmiennych przechowywuje się w pliku MIB. Nazwa każdej ze zmiennych znajduje się w osobnym wierszu. Grupy zmiennych są oddzielone od siebie pustym wierszem.

Technologia

Użytkownik klikając na komputery narysowane na planie uzyskuje informacje o wartości zmiennych SNMP dotyczących tych komputerów. Efekt ten uzyskuje się przez zastosowanie mapowania obrazka w języku HTML po stronie klienta.

Skrypty PHP używane przez aplikację to: Dzięki użyciu języka JavaScript, aplikacja jest wygodna w użyciu. Funkcje napisane w tym języku powodują otwarcie okna ze zmiennymi SNMP i zapewniają obsługę przycisków tego okna.

Edytor do tworzenia stron domowych

Funkcjonalność narzędzia

Celem aplikacji jest umożliwienie pracownikom nie znającym języka HTML ani żadnych wyrafinowanych edytorów tego języka tworzenie i redagowanie swoich prywatnych stron domowych. Użytkownik wypełnia formularz wpisując dane na swój temat. Akceptacja formularza powoduje utworzenie auktualnionej strony WWW dostępnej pod standardowym adresem pracownika http://www.mimuw.edu.pl/~username.

Sposób użytkowania



rys. 4.6 Fragment formularza

Na stronie początkowej znajduje się lista pracowników. Kliknięcie na personalia danego pracownika powoduje otworzenie strony z formularzem, którego fragment został uwidoczniony na rysunku 4.6.

Formularz składa się z: Elementy zawierające dane to:



rys. 4.7 Wklejanie adresu URL

Jeśli z danym polem jest związany przycisk wyboru, to użytkownik może wyłączyć wyświetlanie wartości tego pola na wynikowej stronie WWW. Dokonuje się tego poprzez odznaczenie przycisku wyboru. Ponowne włączenie wyświetlania następuje po zaznaczeniu przycisku wyboru.

Jeśli po uaktywnieniu pola tekstowego (kliknięciu na nie) pojawia się przycisk "Dodaj URL", użytkownik może do wpisywanego w pole tekstu wkleić dowiązanie w języku HTML. Po kliknięciu przycisku otwiera się okno z prostym formularzem do edycji dowiązania (rys. 4.7).

Do pola "Adres" wpisuje się adres strony WWW, a do pola "Nazwa" — nazwę dowiązania. Kliknięcie na przycisk "OK" powoduje sprawdzenie składniowej poprawności adresu. Jeśli adres jest niepoprawny składniowo, to użytkownik może mimo to wkleić dowiązanie albo zrezygnować z wklejenia, aby poprawić adres.

Wpisując dane do pól tekstowych, użytkownik nie może korzystać z innych elementów języka HTML niż znaczniki definiujące dowiązanie <A> i </A>. Jeżeli wpisze inne znaczniki, to nie będą one traktowane jako elementy języka HTML, tylko jako czysty tekst.

Ze względu na bezpieczeństwo wysłanie formularza wymaga autoryzacji. Użytkownik musi wpisać hasło do okna dialogowego. Jeżeli autoryzacja przebiegła pomyślnie, następuje wysłanie formularza i otwiera się uaktualniona strona domowa pracownika. Zawiera ona przycisk "Edytuj". Po kliknięciu na niego następuje powrót do formularza — można wówczas dokonać kolejnej aktualizacji.

Architektura

Aplikacja jest zaprojektowana w architekturze dwuwarstwowej klient-serwer. Przeglądarka jest cienkim klientem ponieważ odpowiada tylko za prezentację danych. Skrypty PHP działające na serwerze WWW zajmują się zarządzaniem danymi i ich przetwarzaniem (rys. 4.8).



rys. 4.8 Architektura aplikacji

Dane dotyczące pracownika, których używa aplikacja, są przechowywane w pliku w formacie XML.

Oto struktura dokumentu XML opisującego pracownika:
<?xml version="1.0" encoding="ISO-8859-2"?>

<PRACOWNIK>

<PERSONALIA>
...
</PERSONALIA>

<TELEFON WIDOK="tak">
...
</TELEFON>

<EMAIL WIDOK="tak">
...
</EMAIL>

<FOTO WIDOK="tak">
...
</FOTO>

<DODATKOWE>
...
</DODATKOWE>

<PUBLIKACJE WIDOK="tak">
<POZYCJA WIDOK="tak">
...
</POZYCJA>

<POZYCJA WIDOK="tak">
...
</POZYCJA>
.
.
.
</PUBLIKACJE>

<DYDAKTYKA WIDOK="tak">
<POZYCJA WIDOK="tak">
...
</POZYCJA>

<POZYCJA WIDOK="tak">
...
</POZYCJA>
.
.
.
</DYDAKTYKA>

<MAGISTRANCI WIDOK="tak">
<POZYCJA WIDOK="tak">
...
</POZYCJA>

<POZYCJA WIDOK="tak">
...
</POZYCJA>
.
.
.
</MAGISTRANCI>

</PRACOWNIK>
Atrybut WIDOK w danym znaczniku otwierającym określa, czy dane zawarte między tym znacznikiem a odpowiadającym mu znacznikiem zamykającym mają być widoczne na wynikowej stronie WWW. Jeżeli atrybuty wszystkich pozycji danej listy mają wartość "nie", wówczas atrybut znacznika tej listy ma również wartość "nie". Jeżeli przynajmniej jeden z atrybutów pozycji danej listy ma wartość "tak", wówczas atrybut znacznika tej listy ma również wartość "tak".

Technologia

Do definiowania sposobu wizualizacji plików w formacie XML służy język XSL. Ponieważ jednak tylko przeglądarka Internet Explorer potrafi otwierać strony w formacie XML, na potrzeby aplikacji stworzono zestaw skryptów w języku PHP do czytania i aktualizacji plików XML: Wszystkie skrypty pobierają jeden argument — identyfikator pracownika.

Stronę domową danego pracownika powinien móc aktualizować tylko ten pracownik. Ścieżka do tej strony to ~username/public_html/index.html, gdzie username to identyfikator pracownika w systemie Linux. Właścicielem zarówno katalogu, jak i pliku, jest ten pracownik. Wynika z tego, że skrypt aktualizujący stronę musi być uruchamiany na prawach użytkownika username. Realizowane to jest za pomocą programu suexec, który jest dostępny w standardowej instalacji serwera Apache. Jeżeli suexec nie jest używany, to skrypty na serwerze są uruchamiane na prawach specjalnego użytkownika nobody. Program suexec umożliwia uruchamianie na serwerze skryptów na prawach użytkownika innego niż nobody.

Rozwiązanie to ma tę wadę, że programu suexec nie można używać, gdy PHP jest zainstalowane jako moduł do serwera Apache. PHP musi być zainstalowane "jako CGI", czyli tak, żeby interpreter PHP był programem obsługującym dla plików z rozszerzeniem .php i .php3. Dla każdego żądania od przeglądarki musi zostać uruchomiony osobny proces-interpreter PHP, co zwiększa obciążenie serwera.

Na komputerze "duch" zainstalowane są również inne aplikacje napisane w PHP. Nie korzystają one z programu suexec i niektóre z nich są intensywnie wykorzystywane. Ponieważ nie można pozwolić na zbyt duże obciążanie serwera, muszą one korzystać z PHP zainstalowanego jako moduł do Apache'a. Zatem serwer jest skonfigurowany tak, że tylko skrypty znajdujące się w ustalonym katalogu są wykonywane przez PHP działające jako CGI.

Skrypt jest wykonywany na prawach użytkownika, który jest właścicielem pliku zawierającego kod tego skryptu. Zatem dla każdego pracownika musi istnieć osobny skrypt put.php3. Aby skrypt należący do danego pracownika mógł być uruchamiany wyłącznie przez tego pracownika, dostęp do skryptu musi być autoryzowany. By to osiągnąć, używa się modułu mod_auth, będącego jednym ze standardowych modułów serwera Apache. Pozwala on na ograniczenie dostępu do katalogu tylko dla upoważnionych użytkowników.

W ustalonym katalogu puts znajdują się podkatalogi, po jednym dla każdego użytkownika. Podkatalog przypisany danemu użytkownikowi ma nazwę taką jak jego identyfikator i zawiera skrypt put.php3 należący do tego użytkownika oraz plik konfiguracyjny .htaccess zawierający dyrektywy modułu mod_auth.

Moduł mod_auth oferuje dwa typy autoryzacji: Basic i Digest. W opisywanej aplikacji używana jest autoryzacja typu Digest, ze względu na jej większe bezpieczeństwo. Hasło i identyfikator są przesyłane do serwera po ich zaszyfrowaniu. Gdy używa się autoryzacji typu Basic hasło i identyfikator przesyłane są jawnym tekstem. Więcej informacji na temat metod autoryzacji można znaleźć w RFC 2617.

Próba wysłania formularza z danymi pracownika o identyfikatorze username powoduje otworzenie okna dialogowego, w które należy wpisać hasło tego pracownika. Jeżeli hasło jest prawidłowe, to jest uruchamiany skrypt put.php3 z podkatalogu username i strona pracownika zostaje uaktualniona.

Aby osiągnąć efekt pojawiających się i znikających przycisków "Dodaj URL" użyto technologii DHTML. Każdy taki przycisk znajduje się na osobnej warstwie. Jednak ponieważ warstwy w przeglądarce Netscape są całkowicie osobnymi dokumentami, formularze których elementy znajdują się na osobnych warstwach nie będą działały prawidłowo.

Poniższy przykładowy formularz będzie działał prawidłowo w przeglądarce Internet Explorer, a nie będzie działał w przeglądarce Netscape:
<FORM>
  <DIV ID="warstwa1">
  <INPUT TYPE="button" NAME="przycisk1">
  </DIV>

  <DIV ID="warstwa2">
  <INPUT TYPE="button" NAME="przycisk2">
  </DIV>
</FORM>
W związku z tym w opisywanej aplikacji każdy przycisk "Dodaj URL" znajduje się na osobnym formularzu, a ten formularz na osobnej warstwie. Poniższy fragment kodu będzie działał prawidłowo w obu przeglądarkach:
<DIV ID="warstwa1">
  <FORM NAME="form1">
  <INPUT TYPE="button" NAME="przycisk1">
  </FORM>
</DIV>

<DIV ID="warstwa2">
  <FORM NAME="form2">
  <INPUT TYPE="button" NAME="przycisk2">
  </FORM>
</DIV>
Ponieważ nie da się wysłać danych z wielu formularzy jednocześnie, stworzono osobny formularz mainForm z ukrytymi polami. Kliknięcie na przycisk "OK" powoduje wywołanie odpowiedniej funkcji JavaScript, która wypełnia te pola wartościami z pól leżących na innych formularzach. W ten sposób w formularzu mainForm są zbierane wszystkie potrzebne dane i funkcja wysyła ten formularz.

Funkcje w języku JavaScript realizują także wklejanie adresów URL do pól tekstowych. Test poprawności składniowej adresu wykonywany jest poprzez sprawdzenie, czy adres pasuje do wyrażenia regularnego napisanego na podstawie gramatyki zawartej w dokumencie RFC 1738.

Podobnie test poprawności adresu poczty elektronicznej jest wykonywany przez sprawdzenie, czy adres pasuje do wyrażenia regularnego napisanego na podstawie gramatyki zawartej w dokumencie RFC 822.

Zakończenie

Opisany zestaw aplikacji został stworzony tak, aby działał na wydziałowym serwerze WWW (http://www.mimuw.edu.pl). Edytor stron może być wykorzystywany przez każdego pracownika mającego konto na komputerze duch. Z pozostałych aplikacji może korzystać dowolna osoba przeglądająca internetowe strony Wydziału.

Wszystkie aplikacje mogą być w przyszłości zastosowane do obsługi innych wydziałów.

Zalety opisanych aplikacji to:

Przyszłość

Plany Wydziału z systemem wyszukiwania pracowników

Obecnie system wyszukiwania pracowników jest stosowany do pracowników naukowo-\break dydaktycznych, jednak może być stosowany do wszystkich pracowników Wydziału. Generalnie można go zastosować do pracowników dowolnej organizacji. Wyszukiwanie może być wzbogacone o opcje wyszukiwania względem stopni naukowych, adresów poczty elektronicznej, czy zainteresowań naukowo-badawczych.

Strona danego pokoju może zawierać informacje o sprzęcie komputerowym znajdującym się w tym pokoju (możliwe jest wykorzystanie skryptów aplikacji "Wirtualne Laboratorium Komputerowe").

Technika mapowania obrazka może być zastosowana do planów dowolnego budynku.

Wirtualne Laboratorium Komputerowe

Obecnie aplikacja pobiera dane od komputerów stojących w Laboratorium Komputerowym, jednak może być zastosowana do dowolnych komputerów Wydziału mających uruchomiony serwer SNMP. Korzystając z otrzymywanych danych można dynamicznie generować statystyki np. procentową liczbę odrzuconych datagramów IP. Informacje takie mogą być również uwidaczniane za pomocą dynamicznie generowanych wykresów. Na użytek aplikacji można napisać własnego klienta SNMP, aby nie trzeba było polegać na formacie danych dostarczanym przez ucd-snmp.

Edytor do tworzenia stron domowych

Aplikacja została stworzona na potrzeby pracowników Wydziału. Może jednak być przeniesiona na inny serwer i tam być używana przez użytkowników tego serwera.

Edytor może być wzbogacony o możliwość definiowania wyglądu wynikowej strony, a nie tylko jej struktury. Użytkownicy często chcą mieć możliwość wyboru koloru tła, koloru, kroju i wielkości czcionek, jak również kolejności ułożenia elementów na stronie.

Strona główna