background image

18.11.2009 14:05:36

Języki Automaty Obliczenia

Programowanie sterowane zdarzeniami

1. Cel ćwiczenia

Celem ćwiczenia jest utworzenie graficznego interfejsu użytkownika (GUI) do programu, który liczy 
iloczyn kartezjański N zbiorów. Program został opracowany w trakcie poprzednich zajęć.

2. Wstęp

GUI do programu opracowane zostanie w języku HTML i będzie uruchomione na serwerze WWW. 

2.1. Formularze HTML

Należy przypomnieć sobie z lekcji w gimnazjum tworzenie formularzy w języku HTML, które 
zawierają przyciski i pola tekstowe.

2.2. Błyskawiczny kurs CGI

2.2.1.  Metody GET i POST
Kiedy przeglądarka wysyła do serwera WWW żądanie dostarczenia zasobu:

http://materialy.prz-rzeszow.pl/index.php?doc=inz_opr.pdf&user=student&passwd=haslo

serwer WWW uruchamia skrypt o nazwie 

index.php

 i przekazuje do skryptu parametry:

1.

doc = inz_opr.pdf

2.

user = student

3.

passwd = haslo

Skrypt może odczytać wartości tych parametrów i na ich podstawie podjąć pewne działania. 
Mówimy, że parametry zostały przekazane metodą GET. Inny sposób przekazywania parametrów to 
metoda POST:

<form action='index.php' method='

post

'>

<input type='text' name='doc' value='inz_opr.pdf'/>
<input type='text' name='user' value='student'/>
<input type='hidden' name='passwd' value='haslo'/>
<input type='submit' name='send' value='Wyślij'/>

</form>

Metoda POST różni się w pewien sposób od metody GET, ale z punktu widzenia skryptu jest to 
różnica mało istotna, ponieważ serwer WWW także utworzy odpowiednie parametry [1]
W formularzu powyżej, kliknięcie przycisku Wyślij spowoduje uruchomienie na serwerze WWW 
skryptu 

index.php

 i przekazanie do niego parametrów takich, jak opisano wyżej (dodatkowo 

ustawiany jest parametr 

send='Wyślij'

).

2.2.2. Przesłanie danych z formularza do serwera
Żeby przeglądarka przesłała dane z formularza po kliknięciu w przycisk, przycisk musi być 
elementem 

input

 typu 

submit

:

1

background image

<form action='index.php' method='

post

'>

<input type='text' name='doc' value='inz_opr.pdf'/>
<input type='text' name='user' value='student'/>
<input type='hidden' name='passwd' value='haslo'/>
<input type='submit' name='send' value='Wyślij'/>

</form>

Przycisk powstanie także jeżeli użyjemy typu 

button

, lecz nie będzie on wtedy automatycznie 

przesyłał danych z formularza.

2.2.3. Przesłanie pliku do serwera
Jeżeli chcemy, żeby przeglądarka przesłała do serwera plik z komputera lokalnego, formularz musi 
mieć określony sposób kodowania i posiadać pole wyboru pliku:

<form action='index.php' method='

post

' enctype="multipart/form-data">

<input type='file' name='doc' value=''/>
<input type='text' name='user' value='student'/>
<input type='hidden' name='passwd' value='haslo'/>
<input type='submit' name='send' value='Wyślij'/>

</form>

W linii 1 zaznaczono, że formularz będzie przesyłał pliki, tekst wykraczający poza kodowanie ASCII, 
dane binarne. Linia 2 utworzy pole wyboru pliku.

2.2.4. Odczyt parametrów przez skrypt PHP
Skrypt PHP uzyskuje dostęp do zmiennych z formularza za pomocą zmiennej 

_REQUEST

. W celu 

sprawdzenia, czy wciśnięto przycisk Wyślij na formularzu z punktu 2.2.3., użyjemy kodu:

if(isset($_REQUEST['send'])) { .... }

W przykładzie powyżej sprawdzamy, czy ustawiony jest element o indeksie 

send

 w tablicy 

_REQUEST

. Jeżeli jest,  i prawdziwy jest warunek

$_REQUEST['send'] == 'Wyślij'

to znaczy, że wciśnięto przycisk  Wyślij. Używamy indeksu 

'send'

 tablicy 

_REQUEST

, dlatego że 

atrybut 

name

 przycisku Wyślij w punkcie 2.2.3. ma wartość 

send

.

2.2.5. Odczyt pliku przesłanego na serwer
W przykładzie w punkcie 2.2.3. pokazano formularz, którego pole o nazwie 

doc

 służy do przesłania 

pliku na serwer. W języku PHP w celu uzyskania dostępu do tego pliku, użyjemy kodu:

$nazwaPliku = $_FILES["doc"]["tmp_name"];

Indeks 

doc

 tablicy 

_FILES

 zawiera informacje o pliku przesłanym przez element 

input

 typu 

file 

o nazwie 

doc

:

<input type='file' name='doc' value=''/>

Zmienna 

$nazwaPliku

 zawiera pełną ścieżkę do pliku przesłanego na serwer i może być użyta 

bezpośrednio w funkcji 

fopen

 lub podobnej.

2.2.6. Zmienne globalne aplikacji WWW
Kiedy kończy się wykonywać skrypt określony w atrybucie action formularza, usuwane są wszystkie 
zmienne utworzone przez ten skrypt. Jeżeli chcemy, żeby aplikacja zapamiętała wartość pewnej 
zmiennej pomiędzy kolejnymi wywołaniami skryptu, należy zastosować zmienne sesyjne:

session_start();               // rozpoczęcie sesji serwera WWW     
$zbiory = $_SESSION['zbiory']; // odczyt zmiennej sesyjnej
$wynik = oblicz($zbiory);
$_SESSION['wynik'] = $wynik;   // zapisanie zmiennej sesyjnej

Pierwsza linia włącza mechanizm sesji serwera. Kolejne linie pokazują, w jaki sposób zapamiętać 
zmienną w sesji i odczytać ją. Tablica 

$_SESSION

 zawiera zmienne, których wartości przechowywane 

2

background image

są pomiędzy kolejnymi wywołaniami skryptów.

2.3. PHP – zastępowanie tekstu w pliku

W trakcie ćwiczenia wykorzystane zostaną funkcje języka PHP, przy pomocy których można 
zastępować zawartość pliku.
Załóżmy, że w pliku 

wynik.xhtml

 mamy pole tekstowe, w którym chcemy prezentować wynik 

obliczeń:

<textarea id="wynik" name="wynik" rows="20" cols="40" readonly="readonly">

       

:wynik:

</textarea>

W miejscu znacznika 

:wynik:

 ma się pojawić wynik obliczeń. W programie w języku PHP możemy 

podstawić za znacznik 

:wynik:

 wartość pewnej zmiennej:

    $wynikObliczen = print_r($wynik, TRUE);         // przygotowuję zmienną z wynikiem
    $html = file_get_contents("wynik.xhtml");       // pobieram plik z szablonem
    $search = array(":wynik:");                     // co ma być wyszukiwane w szablonie
    $replace = array($wynikObliczeń);               // czym zastąpić $search
    $html = str_replace($search, $replace, $html);  // zastępuję elementy $search
    echo $html;                                     // wyświetlam

Funkcja 

print_r

 użyta w sposób pokazany wyżej nie wysyła nic do bufora wyjściowego, tylko 

zwraca reprezentację zmiennej czytelną dla człowieka.
Jeżeli chcemy wykonać kilka zastąpień tekstu jednocześnie, to należy rozbudować tablice:

    $search = array(":wynik:", ":daneWejsciowe:", ":komunikat:");
    $replace = array($wynikObliczeń, $daneWejsciowe, $komunikat);

3

background image

3. Konfiguracja serwera Apache

3.1. Pakiet xampplite w systemie Windows

W laboratorium w sali D104 nie wykonujemy punktu 1, ponieważ uprawnienia są ustawione 
prawidłowo.

1. Sprawdź, czy użytkownik, na koncie którego pracujesz w systemie, ma uprawnienia do 

modyfikowania zawartości następujących folderów:

c:\xampplite\temp

c:\xampplite\apache\logs

c:\xampplite\htdocs

2. Uruchom konsolę i wpisz następujące polecenia:

3. W panelu sterowania 

xampp

 kliknij przycisk 

start

 przy module Apache.

4

background image

4. Jeżeli przy module Apache nie pojawiła się zielona etykieta 

Running

, sprawdź punkt 1 oraz 

komunikaty serwera:

3.2. Pakiet httpd w systemach Unix

W laboratorium w sali D10a nie trzeba nic robić, wszystko działa.

1. Sprawdź, czy użytkownik (lub grupa użytkowników) na koncie którego pracujesz w systemie, 

ma uprawnienia do modyfikowania zawartości katalogu z zasobami serwera WWW:

Na rysunku jest to katalog 

html

, grupa 

users

 ma uprawnienia do zapisu, a wszyscy do 

odczytu i przeglądania.

2. Upewnij się, że serwer WWW pracuje:

service httpd restart

3. W przypadku wystąpienia błędów, sprawdź log serwera:

cat /var/log/httpd/error_log

4. Jeżeli twój system to nie Red Hat Linux, sprawdź w dokumentacji systemu jak nazywa się 

pakiet serwera WWW, gdzie jest katalog z jego zasobami, jak zarządzać serwerem i gdzie są 
pliki jego logów.

5

background image

4. Konfiguracja projektu Netbeans

Aplikacja będzie uruchamiana przez serwer WWW, w związku z czym trzeba lekko zmodyfikować 
właściwości projektu.

4.1. Konfiguracja projektu w systemie Windows

1. Wybierz właściwości projektu, w kategorii 

Sources

 zaznacz kopiowanie plików do katalogu 

zasobów serwera WWW. Katalog zasobów to

c:\xampplite\htdocs

Po nazwie katalogu podaj nazwę folderu z aplikacją.

2. W kategorii 

Run Configuration

 wybierz 

uruchomienie

 projektu 

na lokalnym serwerze 

WWW oraz wpisz URL aplikacji. Zwróć uwagę, że 

numer portu serwera

 to 

8080

 a 

katalog 

aplikacji 

jest taki, jak w ustawiono punkcie 1.

6

background image

4.2. Konfiguracja projektu w systemie Linux

Na laboratorium w sali D104 debugger działa tylko w jednym procesie Netbeans.

1. Wybierz właściwości projektu, w kategorii 

Sources

 zaznacz kopiowanie plików do katalogu 

zasobów serwera WWW. Katalog zasobów to

/var/www/html

Po nazwie katalogu podaj nazwę konta użytkownika.

2. W kategorii 

Run Configuration

 wybierz 

uruchomienie

 projektu 

na lokalnym serwerze 

WWW oraz wpisz URL aplikacji. Zwróć uwagę, że 

katalog aplikacji 

jest taki, jak 

w ustawiono punkcie 1.

7

background image

5. Przebieg ćwiczenia

5.1. Odtworzenie projekt z poprzednich zajęć

Rozpakuj archiwum z projektem Netbeans z poprzednich zajęć i otwórz go w środowisku Netbeans.
Upewnij się, czy w środowisku Netbeans jest otwarty wyłącznie twój projekt. Jeżeli otwartych jest 
kilka projektów, zamknij wszystkie i wykonaj jeszcze raz punkt 5.1.

5.2. Dodanie okienka GUI

Do plików źródłowych projektu dodaj nowy plik 
XHTML o nazwie 

gui.xhtml

.

Jeżeli pozycji 

XHTML File

 nie ma na liście, wybierz 

Other

 i poszukaj w okienku, które się pojawi.

5.3. Kontrola poprawności ćwiczenia

Sprawdź, czy w twoim projekcie są następujące pliki:

1. index.php
2. IliczynKartezjański.php
3. OdczytDanych.php
4. dane.txt
5. ProgramJAO.php
6. gui.xhtml

Jeżeli brakuje któregokolwiek z tych plików, lub jest obecny 
logicznie, jednak jego nazwa jest inna, skoryguj projekt.

5.4. Utworzenie GUI

W pliku 

gui.xhtml

 wpisz takie znaczniki języka HTML, które 

utworzą stronę pokazaną na obrazku z prawej strony. Pamiętaj 
o następujących rzeczach:

w nagłówku musi być element 

title

 zawierający tytuł 

strony,

elementy 

input

 formularz muszą być zawarte wewnątrz 

paragrafów (element 

p

),

każdy element 

input

 musi mieć określony atrybut 

name

,

przycisk to element 

input

, którego atrybut 

type

 ma 

wartość 

submit

,

duże okienko na wynik to element 

textarea

 o kilkunastu wierszach i kolumnach.

8

background image

5.5. Wynik obliczeń

W pliku 

gui.xhtml

 do zawartości znacznika 

textarea

 wstaw tekst 

:wynik:

 (patrz 2.3.). Tekst ten 

będzie zastąpiony wynikiem obliczeń.

5.6. Kontrola poprawności ćwiczenia

W oknie projektu kliknij prawym przyciskiem myszy w plik 

gui.xhtml

 i z menu kontekstowego 

wybierz polecenie Validate XHTML.
Jeżeli walidator wyświetlił jakiekolwiek błędy lub ostrzeżenia, skoryguj plik.

5.7. Obsługa akcji użytkownika

Otwórz plik 

index.php

 i skasuj zawartość pomiędzy znacznikami 

<?php

 a 

?>

.

Pisząc kod wstawiaj komentarze informujące o krokach algorytmu, np.:

session_start(); // punkt 1

Napisz program wg algorytmu:

1. Rozpocznij sesję serwera WWW (patrz 2.2.6.).
2. Jeżeli wciśnięto przycisk Wczytaj (patrz 2.2.4.), to:

2.1. Zapisz do zmiennej 

nazwaPliku

 nazwę pliku z danymi (patrz 2.2.5.).

2.2. Utwórz nowy obiekt klasy 

OdczytDanych

.

2.3. Używając obiektu utworzonego w kroku 2.2. algorytmu, odczytaj zawartość pliku 

i zapisz ją do zmiennej sesyjnej (patrz 2.2.6.)

3. Jeżeli wciśnięto przycisk Oblicz (patrz 2.2.4.), to:

3.1. Odczytaj z sesji zmienną zapisaną w kroku 2.3. algorytmu (patrz 2.2.6.) - są to zbiory 

odczytane z pliku przesłanego z przeglądarki.

3.2. Utwórz nowy obiekt klasy 

IloczynKartezjański

.

3.3. Używając obiektu utworzonego w kroku  3.2. algorytmu, oblicz iloczyn kartezjański 

zbiorów odczytanych z sesji w kroku 3.1..

3.4. Zapisz obliczony iloczyn kartezjański do zmiennej sesyjnej (patrz 2.2.6.)

4. Jeżeli wciśnięto przycisk Wyświetl (patrz 2.2.4.), to:

4.1. Odczytaj z sesji zmienną zapisaną w kroku 3.4. algorytmu (patrz 2.2.6.) - jest to iloczyn 

kartezjański zbiorów z pliku przesłanego z przeglądarki.

4.2. Przygotuj prezentację wyniku, używając funkcji 

print_r

 (patrz 2.3.).

5. Wyświetl plik 

gui.xhtml

 zamieniając znacznik 

:wynik:

 zawartością zmiennej 

przygotowanej w kroku 4.2. algorytmu (patrz 2.3.).

5.8. Informacja o stanie aplikacji

Wykonanie tego etapu ćwiczenia jest opcjonalne.
Po prawidłowym wykonaniu punktu mamy działający program, lecz po wciśnięciu przycisku Wczytaj 
użytkownik nie jest informowany, że dane zostały wczytane. Podobnie, po wciśnięciu przycisku 
Oblicz, nie wiemy, czy obliczenia są wykonane.

9

background image

Uzupełnij plik 

gui.xhtml

 dodając znaczniki informujące o stanie aplikacji:

1. Za elementem 

input

 tworzącym przycisk Wczytaj umieść tekst 

:daneWczytane:

.

2. Za elementem 

input

 tworzącym przycisk Oblicz umieść tekst 

:obliczeniaWykonane:

.

3. Uzupełnij tablice 

search

 i 

replace

 z kroku 5. algorytmu z punktu 5.7., tak żeby teksty 

:daneWczytane:

 i 

:obliczeniaWykonane:

 były zastępowane wartościami z odpowiednich 

zmiennych, np. 

:daneWczytane: 

będzie zastępowane wartością zmiennej 

$daneWczytane

.

4. Do bloków kodu obsługujących kliknięcia w przyciski Wczytaj i Oblicz dopisz kod 

ustawiający wartości zmiennych użytych w kroku 3., np. 

$daneWczytane = "dane 

wczytane";

5. Za instrukcją rozpoczynającą sesję serwera WWW dopisz instrukcje, które  zapisują do 

zmiennych używanych w kroku 3. puste łańcuchy tekstowe.

5.9. Kontrola poprawności wykonywania ćwiczenia

Sprawdź, czy:

1. Program napisany przez ciebie wykonuje się bez błędów i realizuje cel ćwiczenia.
2. Program składa się z sześciu plików: 

dane.txt

index.php

ProgramJAO.php

IloczynKartezjański.php

 i 

OdczytDanych.php

gui.xhtml

.

3. Plik 

gui.xhtml

 jest poprawny składniowo.

4. Kod w pliku 

index.php

 jest zgodny z algorytmem z punktu 5.7.

5. Linie kodu z pliku 

index.php

 zawierają w komentarzach odnośniki do punktów algorytmu.

5.10.

Koniec ćwiczenia

1. W środowisku Netbeans ustal położenie katalogu z projektem (informacja o tym jest we 

właściwościach projektu).

2. Zamknij projekt w środowisku Netbeans.
3. Zarchiwizuj katalog z projektem i prześlij go na adres e-mail podany przez osobę prowadzącą 

zajęcia.

6. Sprawozdanie

Na stronie internetowej z materiałami dydaktycznymi znajduje się szablon sprawozdania 
z ćwiczenia 3. Należy go zastosować do wykonania sprawozdania.

7. Pytania na wejściówkę

1. Czy do wykonania tego ćwiczenia potrzebny jest projekt Netbeans z ćwiczenia 2?
2. Jaki jest obecnie obowiązujący standard dokumentów HTML?
3. Jaki znacznik HTML tworzy formularz?
4. Jaki znacznik HTML tworzy przycisk służący do wysyłania danych formularza?
5. Jak utworzyć pole formularza HTML służące do wysyłania plików?
6. Jak w kodzie PHP sprawdzić, czy wciśnięto przycisk na formularzu HTML?

10

background image

7. W jaki sposób w języku PHP wyświetlić zawartość pliku przesłanego przez przeglądarkę? 

8. Literatura

1. Rafe Colburn „CGI”. Helion 1998.

11


Document Outline