Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Programarea aplicatiilor Web
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 
CGI (Common Gateway Interface) m8o16oq
PHP (PHP: Hypertext Preprocessor)
ASP (Active Server Pages)
Cookie-uri
Concluzii

--------------------------------------------------------------------------------

1. CGI (Common Gateway Interface)
Standard pentru interactiunea clientilor Web cu serverele WWW, Common Gateway Interface se afla in prezent la versiunea 1.1. Un program CGI, numit in mod uzual script, se executa pe serverul WWW, fie in mod explicit (apelat din cadrul paginii printr-o directiva speciala), fie la preluarea informatiilor aflate in cadrul cimpurilor unui formular interactiv sau coordonatelor unei zone senzitive (image map). Acest standard confera interactivitate paginilor Web, documentele HTML putind astfel sa-si modifice in mod dinamic continutul si sa permita prelucrari sofisticate de date.

1.1 Programele CGI
Programele CGI poate fi scrise in orice limbaj, fiind interpretate (cazul Perl, Tcl, scripturi shell UNIX) sau compilate (C, C++, Delphi). Regulile care trebuie respectate la conceperea unui program CGI sint:

programul scrie datele la iesirea standard (stdout)

programul genereaza antete ce permit serverului Web sa interpreteze corect iesirea scriptului (folosindu-se specificatiile protocolului HTTP)

Cele mai multe script-uri CGI sint concepute pentru a procesa datele introduse in formulare. Un formular se defineste in HTML folosindu-se tag-uri specifice pentru afisarea continutului si introducerea datelor de catre client (asa cum am vazut in unul dintre capitolele precedente), iar script-ul CGI, executat de server, va prelua continutul acelui formular si-l va prelucra, returnind, eventual, rezultatele.

Antetul trimis serverului de catre programul CGI va respecta specificatiile MIME, continind de exemplu Content-type: text/html (document HTML) sau Content-type: image/jpeg (imagine JPEG) ori Content-type: text/plain (text obisnuit).




Dupa cum vom vedea mai jos, programului CGI i se vor transmite in diverse variabile de mediu sau in linia de comanda informatii referitoare la datele de procesat sau la clientul care a initiat cererea (de exemplu, SERVER_PORT, REQUEST_METHOD, SCRIPT_NAME, QUERY_STRING, REMOTE_HOST etc.) in functie de metoda de transfer utilizata.

1.2 Variabilele de mediu accesate de un program CGI
Oricare program CGI va putea dispune de valorile urmatoarelor variabile de mediu:

Variabile independente de metoda cererii si setate pentru toate cererile HTTP:

SERVER_SOFTWARE furnizeaza numele si versiunea serverului Web ce proceseaza cererea HTTP si ruleaza scriptul CGI.

SERVER_NAME da numele de host, alias-ul DNS sau adresa IP a masinii pe care ruleaza serverul Web.

GATEWAY_INTERFACE stocheaza versiunea specificatiei CGI folosite (CGI/1.0 ori CGI/1.1 in prezent, CGI/1.2 in viitorul apropiat).

Variabile de mediu specifice cererilor ce vor fi transmise spre programul CGI:

SERVER_PROTOCOL da numele si versiunea protocolului de transmitere a datelor (e.g. HTTP/1.0).

SERVER_PORT furnizeaza portul asociat serverului care va procesa cererea (de obicei, portul 80).

REQUEST_METHOD specifica metoda prin care va fi formulata cererea: GET, POST, PUT etc.

PATH_INFO furnizeaza informatii suplimentare despre calea de directoare; scripturile CGI pot fi accesate folosind cai virtuale urmate de informatii suplimentare care se regasesc in aceasta variabila.

PATH_TRANSLATED ofera o versiune translatata a lui PATH_INFO care asociaza cailor virtuale nume de directoare reale, asa cum se gasesc pe calculatorul pe care ruleaza serverul Web.

SCRIPT_NAME desemneaza calea virtuala pina la scriptul ce va fi executat.

QUERY_STRING contine toate informatiile de dupa ? din URL-ul ce refera scriptul CGI, informatii ce vor trebui decodificate de acel script.

REMOTE_HOST indica hostul care a formulat cererea (calculatorul care a apelat scriptul CGI prin intermediul unei pagini Web).

REMOTE_ADDR furnizeaza adresa IP a clientului care a formulat cererea, asociata adresei simbolice date de REMOTE_HOST.

AUTH_TYPE da metoda de autentificare utilizata sa valideze utilizatorul, daca serverul suporta autentificarea utilizatorilor si scriptul este protejat.

REMOTE_USER indica numele utilizatorului, daca serverul suporta autentificarea utilizatorilor.

REMOTE_IDENT furnizeaza identitatea clientului ce a formulat cererea, asa cum este returnata de demonul identd, conform specificatiilor RFC 931.

CONTENT_TYPE indica tipul continutului datelor vehiculate, pentru cererile care au atasate informatii suplimentare, precum PUT sau POST.

CONTENT_LENGTH contine numarul de octeti ai datelor trimise de client.

Suplimentar, liniile antet (daca exista) receptionate de la client prin intermediul protocolului HTTP vor fi plasate in variabile de mediu avind numele prefixate de HTTP_. Serverul poate exclude liniile antet deja procesate, precum Authorization, Content-type sau Content-length.

Ca exemple de astfel de variabile, pot fi mentionate:

HTTP_ACCEPT indica tipurile MIME pe care le va accepta clientul, fiecare tip fiind despartit de virgula asa cum specifica protocolul HTTP: tip/subtip, tip/subtip.

HTTP_USER_AGENT furnizeaza numele si versiunea browserului Web ce a formulat cererea, in formatul general: software/versiune biblioteca/versiune.

Urmatorul script Perl va afisa toate variabilele de mediu la care are acces prin intermediul interfetei CGI:

#!/usr/bin/perl
# Afiseaza mediul print "Content-type: text/plain\n\n"; print "Environment:\n\n"; foreach $key (keys %ENV) A printf "%16s = %s\n", $key, $ENVA$keyS;
S

Variabila predefinita ENV este un tablou asociativ continind perechile (nume de variabila de mediu, valoarea variabilei).

Un posibil rezultat al executiei scriptului de mai sus poate fi:

HTTP_ACCEPT_LANGUAGE=en
SERVER_SIGNATURE=<ADDRESS>Apache/1.3.12 Server at endirra.infoiasi.ro Port 80</ADDRESS>
SCRIPT_FILENAME=/home/httpd/cgi-bin/env.pl.cgi
HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8
HTTP_PRAGMA=no-cache
SERVER_NAME=endirra.infoiasi.ro
HTTP_CONNECTION=Keep-Alive
REMOTE_ADDR=127.0.0.1
REQUEST_URI=/cgi-bin/env.pl.cgi
HTTP_HOST=endirra
REMOTE_PORT=1041
REQUEST_METHOD=GET
GATEWAY_INTERFACE=CGI/1.1
QUERY_STRING=
SERVER_ADDR=127.0.0.1
SERVER_SOFTWARE=Apache/1.3.12 (Unix) (Red Hat/Linux) PHP/3.0.15 mod_perl/1.21
SERVER_PROTOCOL=HTTP/1.0
SERVER_PORT=80
DOCUMENT_ROOT=/home/httpd/html
HTTP_USER_AGENT=Mozilla/4.72 aeni (X11; U; Linux 2.2.14-5.0 i686)
HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
SCRIPT_NAME=/cgi-bin/env.pl.cgi
SERVER_ADMIN=root@endirra
HTTP_ACCEPT_ENCODING=gzip

1.3 Exemple CGI
Un program CGI scris in limbajul C standard care genereaza o pagina Web continind mesajul 'Salut!'.

/* salut-cgi.c
Genereaza o pagina Web continind mesajul 'Salut!'
*/
#include <stdio.h> void main()
A printf("Content-type: text/html\n\n"); printf("<html>"); /* inceput document HTML */ printf("<head><title>Salut!</title></head>\n");
/* antet pagina */ printf("<body>\n"); /* corp pagina */ printf("<p>Salut!</p>\n"); printf("</body></html>");
S

Un alt exemplu, de script bash (Bourne Again Shell) folosit pentru inregistrarea intr-o baza de date a participantilor la Colocviul studentesc de informatica InfoJunior, program conceput de Mirela Petrea:

#!/bin/bash

# Se trimite intii tipul MIME echo "Content-type: text/html"
# Se trimite apoi antetul documentului HTML generat de script echo echo "<HTML>" echo "<HEAD>" echo "<TITLE>Multumiri</title>" echo "</head>" echo "<BODY>" echo "<H1>Multumiri</h1>"

# Se evalueaza parametrii introdusi in formular de catre utilizator...
# ...folosindu-se programul "cgiparse" care va genera cite o variabila
# de mediu UNIX pentru fiecare valoare a cimpurilor formularului eval `/home/httpd/cgi-bin/cgiparse -form` echo "Va multumim, $FORM_name, pentru dorinta de a participa \ la colocviul INFO JUNIOR"

echo "<P>"
# Se stocheaza datele din formular in fisier "database" printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" "$FORM_name" \
"$FORM_univ" "$FORM_depart" \
"$FORM_paper1" "$FORM_words1" "$FORM_coord1" \
"$FORM_paper2" "$FORM_words2" "$FORM_coord2" \
"$FORM_paper3" "$FORM_words3" "$FORM_coord3" \
"$FORM_conadress" "$FORM_email" "$FORM_tel" "$FORM_fax" \
>> /home/httpd/infojr/database

echo '<A HREF=" https://www.infoiasi.ro/Ipetrea/infojr.html "> \
INFO JUNIOR' 97 - Invitatie la colocviu</A>'

# Se trimite sfirsitul de pagina inapoi la clientul Web echo "</BODY>" echo "</HTML>"

1.4 Apelarea programelor CGI din formularele HTML
Pentru a fi efective, programele CGI trebuiesc apelate (implicit sau explicit) din cadrul paginilor Web.

De cele mai multe ori, un script CGI va fi apelat din cadrul unui formular HTML la apasarea butonului de trimitere a datelor catre server (butonul submit).

Sa presupunem ca avem urmatorul exemplu in care un utilizator introduce prin intermediul unui formular doua numere intregi, iar programul CGI va genera o pagina Web continind maximul dintre ele.

Formularul HTML va fi:

<form action="https://www.infoiasi.ro/cgi-bin/max.cgi" method="GET">
<p>Va rugam, introduceti doua numere:
<input name="nr1" size="5">
<input name="nr2" size="5">
<p>
<input type="submit" value="Afla maximul">
</form>

De exemplu, introducind numerele 7 si 4 si actionind butonul etichetat "Afla maximul", vom primi o pagina Web care va afisa textul "Maximul dintre 7 si 4 este numarul 7" (vezi figurile de mai jos).


Introducerea datelor in formular

Obtinerea rezultatului furnizat de scriptul CGI dupa actionarea butonului de trimitere a datelor pentru prelucrare
Care este mecanismul prin care functioneaza interfata CGI?

Presupunind ca in cele doua cimpuri ale formularului (purtind numele nr1 si respectiv nr2) am introdus valorile 7 si 4 respectiv si am apasat butonul submit, navigatorul va trimite, prin intermediul protocolului HTTP, o cerere catre serverul Web aflat la adresa data de URL-ul https://www.infoiasi.ro (adresa este preluata din valoarea atributului action din <form>). Desigur, in loc de o adresa absoluta, putea fi specificata o cale relativa, insemnind ca se foloseste serverul pe care se gaseste pagina continind formularul.

Atunci cind se trimite cererea HTTP, navigatorul construieste un URL avind ca sufix informatii despre datele introduse in cimpurile formularului, in cazul nostru https://www.infoiasi.ro/cgi-bin/max.cgi?nr1=7&nr2=4 folosindu-se o codificare speciala. Pentru fiecare cimp al formularului, se va genera o pereche nume_cimp=valoare delimitata de &, iar caracterele speciale (ca de exemplu slash-ul sau apostroful) vor fi inlocuite de codul lor numeric, in hexazecimal, precedat de caracterul procent (%). Spatiile vor fi inlocuite cu semnul plus (+).

Pentru a trimite valoarea Cina de la Maxim's se va folosi codificarea Cina+de+la+Maxim%27s.

Serverul spre care cererea a fost trimisa (in cazul site-ului www.infoiasi.ro un server Apache) va procesa datele receptionate conform regulilor proprii. Tipic, configuratia serverului defineste unde sint stocate in cadrul sistemului de fisiere directoarele si fisierele CGI. De cele mai multe ori, demonul HTTP (adica serverul Web) ruleaza pe masina sub auspicii de utilizator fictiv (din ratiuni de securitate ca nobody), fisierele sale fiind stocate de obicei in directorul /home/httpd. Aici se afla si directorul cgi-bin unde ar trebui sa fie stocate toate fisierele CGI apelate din cadrul paginilor Web. Asadar https://www.infoiasi.ro/cgi-bin/max.cgi va insemna pentru serverul Web de la adresa www.infoiasi.ro urmatoarea actiune: "executa programul max.cgi aflat la /home/httpd/cgi-bin". Astfel, in loc sa trimita catre navigatorul Web ce a initiat cererea HTTP un document HTML sau un fisier de alt tip, serverul va invoca programul ori scriptul CGI specificat in cadrul URL-ului (in acest caz max.cgi) si-i va pasa datele furnizate de sufix, de dupa semnul intrebarii (adica nr1=7&nr2=4).

Actiunea de invocare va avea o semantica diferita in functie de scriptul sau programul CGI conceput. Pentru un script Perl, serverul va invoca un interpretor Perl (in cazul Apache, un modul special mod_perl; de fapt, pentru a permite executia de programe CGI, serverul Apache se va folosi de serviciile modulului mod_cgi). Pentru un program executabil (compilat de pilda intr-unul din limbajele C sau C++), serverul va lansa programul ca un proces separat.

Extensia de fisier .cgi nu are nici o relevanta in general, dar pot exista diverse reguli de numire a fisierelor CGI executabile dependente de server sau de sistemul de operare pe care ruleaza, asa cum se intimpla la serverul Internet Information Services (IIS) conceput de Microsoft.

Procesarea datelor din formularele HTML prin metoda GET
Pentru formularele care utilizeaza metoda GET (metoda implicita), specificatiile CGI indica faptul ca datele furnizate scriptului vor fi disponibile intr-o variabila de mediu denumita QUERY_STRING.

Desigur, in functie de limbajul de programare ales pentru conceperea scriptului CGI, datele vor fi accesate via QUERY_STRING si prelucrate. In limbajul C, vom putea folosi functia getenv() aflata in biblioteca standard stdlib. Tot ce mai ramine de facut este sa decodificam valorile din variabila QUERY_STRING.

Scriptul CGI in mod uzual va genera date de iesire care vor fi trimise navigatorului Web de catre server, utilizindu-se iesirea standard (stdout):

#include <stdio.h>
#include <stdlib.h>

#define CONTENT "Content-type: text/html\n\n" int main(void)
A char *data; long int nr1, nr2;

/* obligatoriu, trimite tipul de date (in format MIME) */ printf(CONTENT);
/* antetul HTML */ printf("<html>\n<head><title>Rezultat</title></head>\n");
/* corpul documentului */ printf("<body bgcolor=\"white\" text=\"black\">\n");
/* proceseaza datele */ data = getenv("QUERY_STRING"); if (data == NULL) printf("<p>Eroare la procesarea datelor!\n"); else if(sscanf(data, "nr1=%ld&nr2=%ld", &nr1, &nr2) != 2) printf("<p>Eroare! Datele trebuie sa fie numerice!\n"); else printf("<p>Maximul dintre %ld si %ld este numarul %ld.\n", nr1, nr2, (nr1<nr2)?nr2:nr1);
/* terminare */ printf("</body>\n</html>\n"); return 0;
S

Obligatoriu, inainte de a fi expediate alte informatii spre client, scriptul CGI va trebui sa trimita linia Content-type in care se va specifica, folosindu-se tipurile MIME, ce tip de date va primi navigatorul Web (un CGI poate trimite nu numai documente sau fragmente de documente HTML, ci orice altceva: imagini GIF sau JPEG, text obisnuit, arhive ZIP etc). Conform protocolului HTTP, intre cimpul Content-type si restul informatiilor trebuie lasata o linie vida, de aceea am introdus doua caractere "\n".

Programul, dupa compilare, va trebui plasat (in cele mai multe situatii) in directorul cgi-bin al serverului Web. Pentru a putea fi accesat, va fi necesar sa poate fi executat de proprietar (de obicei utilizatorul special nobody in UNIX), de grup si de altii (drepturile 755 in UNIX).

Dupa instalarea scriptului, orice utilizator din Internet (daca nu sint impuse restrictii de catre administratorul Web) il va putea accesa si executa prin intermediul unui formular HTML. Astfel, scriptul va trebui sa fie capabil sa proceseze orice tip de data si sa semnaleze posibilele erori. De asemeni, orice script CGI va trebui sa nu permita accesarea de date confidentiale de pe masina pe care ruleaza, administratorul Web trebuind sa ia masurile necesare de securitate.

Procesarea unui formular prin metoda POST
Sa presupunem ca avem situatia urmatoare: avem nevoie ca prin intermediul unui formular sa preluam de la utilizator o linie de text care va fi trimisa unui script CGI s-o adauge la sfirsitul unui fisier stocat pe server. Acest fisier va putea fi modificat doar de catre autorul formularului si de catre script si va putea fi citit de catre orice altcineva prin intermediul unui alt script.

Daca in exemplul anterior, realizam numai o simpla prelucrare care nu afecta in nici un fel starea serverului (nu se modifica nici un fisier de pe server) si cererea de aflare a maximului celor doua numere putea fi trimisa de oricite ori doream fara a genera probleme (exceptind poate consumul unor resurse), in acest caz prin intermediul scriptului se va schimba continutul fisierului vizat, deci si starea serverului. Pentru aceasta vom folosi metoda POST. Ca si la metoda GET, un program CGI are acces la intreg mediul sistemului de operare pe care ruleaza.

Pentru formularele utilizind metoda POST, datele pasate scriptului vor putea fi accesate de la intrarea standard (stdin), iar lungimea (in octeti) datelor trimise va fi disponibila in variabila de mediu CONTENT_LENGTH.

Desi citirea de la intrarea standard ar putea fi considerata mai simpla decit citirea dintr-o variabila de mediu, exista urmatoarele aspecte pe care trebuie sa le luam in considerare: serverul nu garanteaza ca va trimite toate datele catre scriptul CGI, deci vor trebui citite atitea caractere cite indica variabila de mediu CONTENT_LENGTH, nu mai multe.

Formularul prin care se va solicita linia ce va fi adaugata la fisier este:

<form action="https://www.infoiasi.ro/cgi-bin/addproj.cgi" methof="POST">

<p>Introduceti titlul proiectului:
<input name="data" size="50" maxlength="80">
<input type="submit" value="Trimite">
</form>

Programul C care accepta datele si le adauga la fisierul proj.txt va fi urmatorul:

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 80
#define EXTRA 5
/* 4 pentru numele cimpului "data", 1 pentru "=" */
#define MAXINPUT MAXLEN+EXTRA+2
/* 1 pentru sfirsit de linie, 1 pentru NULL */

/* numele fisierului */
#define DATAFILE "../proj/proj.txt"

/* functie de decodificare a datelor pasate programului CGI */ void unencode(char *src, char *last, char *dest)
A for(; src != last; src++, dest++) if(*src == '+') /* inlocuieste + cu spatiu */
*dest = ' '; else if(*src == '%')
A /* inlocuieste hexa cu caracterul */ int code; if(sscanf(src+1, "%2x", &code) != 1) code = '?';
*dest = code; src +=2;
S else /* copie celelalte caractere... */
*dest = *src;
*dest = '\n';
*++dest = '\0';
S

/* functia principala */ int main(void)
A char *lenstr; char inputaMAXINPUTi, dataaMAXINPUTi; long len;

/* scrie Content-type, urmat de setul de caractere (optional) */ printf("%s%c%c\n",
"Content-type:text/html;charset=iso-8859-1",13,10);
/* scrie antetul documentului HTML generat */ printf("<html>\n<head><title>Raspuns</title></head>\n");
/* ia numarul de caractere transmise */ lenstr = getenv("CONTENT_LENGTH");
/* numarul de caractere este corect? */ if(lenstr == NULL || sscanf(lenstr,"%ld",&len)!=1 || len > MAXLEN) printf("<p>Eroare - formular incorect?\n"); else
A
FILE *f;
/* citeste de la intrarea standard datele */ fgets(input, len+1, stdin);
/* decodifica linia */ unencode(input+EXTRA, input+len, data);
/* adauga in fisier */ f = fopen(DATAFILE, "a"); if(f == NULL) printf("<p>Eroare la adaugarea in fisier..."); else fputs(data, f); fclose(f); printf("<p>Multumim! Linia <b>%s</b> a fost adaugata in fisier\n", data);
S
/* scrie sfirsitul documentului */ printf("</body>\n</html>\n"); return 0;
S

Putem scrie un program CGI care sa afiseze continutul fisierului proj.txt. Acest program va fi apelat prin intermediul formularului HTML de mai jos:

<form action="https://www.infoiasi.ro/cgi-bin/viewproj.cgi" method="GET">
<input type="submit" value="Afiseaza">
</form>

Programul C este:

#include <stdio.h>
#include <stdlib.h>

/* numele fisierului */
#define DATAFILE "../proj/proj.txt"

/* functia principala */ int main(void)
A
/* Deschide fisierul */
FILE *f = fopen(DATAFILE,"r"); int ch; if(f == NULL)
A
/* trimite cod HTML in caz de eroare */ printf("%s%c%c\n",
"Content-type:text/html",13,10); printf("<html><head><title>Eroare</title></head>\n");
/* scrie corpul */ printf("<body>\n"); printf("<p><b>Fisierul nu poate fi deschis!</i>\n");
/* scrie sfirsitul documentului */ printf("</body>\n</html>\n");
S else
A
/* afiseaza fisierul ca text obisnuit */ printf("%s%c%c\n",
"Content-type:text/plain",13,10);
while((ch = getc(f)) != EOF) putchar(ch); fclose(f);
S return 0;
S

1.5 Server Side Includes (SSI)
Server Side Includes ofera posibilitatea executiei de programe CGI si de efectuare a altor actiuni din cadrul paginilor Web prin intermediul unor comenzi incluse direct in codul HTML, fara a necesita prezenta unui formular pentru activarea scriptului dorit.

Fiecare comanda SSI va putea fi introdusa in paginile Web printr-un comentariu special <--#command -->, unde command este o comanda suportata de specificatia SSI. Din moment ce este inclusa ca si comentariu, navigatorul Web o va ignora, dar va fi procesata pe partea server si comentariul va fi inlocuit cu iesirea acelei comenzi. Fisierele HTML utilizind comenzi SSI vor avea extensia .shtml in loc de .html, dar aceasta conventie nu este obligatorie.

Pentru ca in documentele HTML sa se poate executa comenzi SSI, chiar daca ele nu au extensia .shtml, in fisierul de configurare a serverului Web (httpd.conf pentru Apache) sau in cadrul fisierului .htaccess (care va fi plasat in directorul unde sint stocate paginile Web) va fi inserata linia:

AddType text/x-server-parsed-html .html .htm

In fisierul de configurare httpd.conf administratorul Web va trebui sa includa o linie Allow Includes pentru a permite interpretarea comenzilor SSI. Daca din motive de securitate nu se doreste executia comenzii SSI exec (vezi mai jos), atunci se va include linia Allow IncludesNoExec. Desigur, serverul se poate configura astfel incit doar anumitor documente sa li se permita apelarea de scripturi CGI ori de comenzi SSI.

Comenzile SSI uzuale sint urmatoarele:

echo

Cu ajutorul lui echo pot fi afisate diverse informatii preluate din variabilele de mediu, precum data si timpul curent, adresa IP a clientului care vizualizeaza pagina, tipul de navigator folosit etc. Iata citeva exemple:

<p>Data si timpul sint
<!--#echo var="DATE_LOCAL" -->
<p>Legatura prin care s-a ajuns aici este
<!--#echo var="HTTP_REFERER" -->
<p>Adresa IP de la care se acceseaza pagina este
<!--#echo var="REMOTE_ADDR" -->
<p>Numele acestui document este
<!--#echo var="DOCUMENT_NAME" -->
<p>Browserul si sistemul pe care ruleaza sint:
<!--#echo var="HTTP_USER_AGENT" -->

Un posibil rezultat al comenzilor echo de mai sus este ilustrat de urmatoarea figura:


Rezultate ale comenzii echo
Folosind aceasta facilitate, putem crea pentru fiecare pagina dorita un buton Inapoi (Back) care sa trimita utilizatorul la adresa din care s-a accesat acea pagina:

<a href="<!--#echo var="HTTP_REFERER" -->">Inapoi</a>

fsize

Va furniza lungimea unui fisier existent pe server.

Lungimea acestei pagini Web este: <!--#fsize file="web6.html" -->

flastmod

Va returna data si timpul celei mai recente modificari a unui fisier specificat.

Ultima actualizare a avut loc <!--#flastmod file="web6.html" -->

config

Este utilizata la diverse configurari SSI. De exemplu, pentru a configura afisarea datei, vom folosi o constructie de genul:

<!--#config timefmt="%a %d %b %y" -->
<!--#echo var="DATE_LOCAL" -->

unde %a indica numele abreviat al zilei saptaminii, %d specifica ziua, %b indica numele abreviat al numelui lunii, %y furnizeaza numarul anului (ultimele doua cifre). Pentru timp, putem folosi %H ora curenta (de la 0 la 23), %M minutele, %S secundele sau %T timpul curent ca %I:%M:%S:%p, in care %I indica ora (de la 1 la 12), iar %p va fi a.m. ori p.m..

exec

Probabil cea mai folosita comanda SSI, va rula un program CGI pe server, iar rezultatul va fi plasat in locul invocarii lui exec. Programul CGI va trebui sa aiba setate permisiunile de executie.

Un exemplu
In cadrul unei pagini Web dorim ca la fiecare incarcare sa apara un citat celebru la inceputul ei, citatele fiind stocate pe server intr-un fisier quotes.txt.

Scriptul CGI care afiseaza citatul este conceput in Perl si va fi numit quotes.pl, fiind executat printr-o comanda SSI din pagina Web:

<html>
<head><title>Pagina lui Georgica</title></head>
<body>
<h5 align="right">
<!--#exec cgi="quotes.pl" -->
</h5>
<hr>
<h2>Bine ati venit!</h2>
...
</body>
</html>

Dam in continuare sursa Perl a scriptului CGI (denumit quotes.pl):

#!/usr/bin/perl
# Scriptul selecteaza o linie aleatoare din fisierul quotes.txt...
# si o afiseaza la intrarea standard print "Content-type: text/html\n\n";

# variabile globale
$QUOTES_FILE="quotes.txt";
# seteaza generatorul de numere aleatoare srand($$|time);
# deschide fisierul open(FIL,"<$QUOTES_FILE") || die "Eroare, nu pot deschide $QUOTES_FILE\n";
# initializam un contor de linii, initial 0
$count=0;
# citim din fisier cite o linie
while(<FIL>) A
# din fiecare linie se va elimina caracterul new line chop;
# stocam linia citita intr-un vector denumit lines
$linesa$counti=$_;
# incrementam contorul
$count++;
S
# decrementam pentru a ajusta la numarul de linii efectiv citite
$count--;
# inchidem fisierul close(FIL);
# luam un numar aleatoriu intre 1 si $count
$random=int(rand($count)+1);
# afisam linia (citatul) folosind tag-uri HTML print <<QUOTE;
<i>
<font color="green">$linesa$randomi</font>
</i>
QUOTE
# Sfirsitul scriptului

include

Aceasta comanda permite includerea unui fisier (de orice tip, in mod uzual text) in cadrul unei pagini Web, fiind utila pentru generarea de antete si note de subsol fara a folosi scripturi CGI ori putind fi folosita ca alternativa la exec, in cazul in care exec nu este permisa din ratiuni de securitate.

<blockquote>Asa cum se afirma in cuvintul de deschidere:
<!--#include file="cuvintare.txt" -->
</blockquote>

2. PHP (PHP: Hypertext Preprocessor)
PHP (PHP: Hypertext Preprocessor), cunoscut in versiunile mai vechi si sub numele PHP/FI (Personal HomePage/Form Interpreter), initial a fost gindit a fi o simpla aplicatie CGI pentru interpretarea formularelor definite prin HTML si procesate de un program scris intr-un limbaj (C, Perl, script shell), executat pe server. In cazul interfetei CGI aveam nevoie de permisiunea de a rula programe pe server, ceea ce ducea la lacune in securitate si in plus la disocierea de documentul HTML a programului care procesa datele.

PFP (in versiunea curenta PHP 4.0) este un pachet puternic care ofera un limbaj de programare accesibil din cadrul fisierelor HTML, limbaj asemanator cu Perl sau C, plus suport pentru manipularea bazelor de date intr-un dialect SQL (dBASE, Informix, MySQL, mSQL, Oracle, PostgreSQL, Solid, Sybase etc.). De asemeni, PHP suporta incarcarea fisierelor de pe calculatorul client: upload (standard propus de E.Nebel si L.Masinter de la Xerox, descris in RFC 1867) si ofera suport pentru cookies (mecanism de stocare a datelor in navigatorul client pentru identificarea utilizatorilor, propus de Netscape).

Aceasta aplicatie este disponibila gratuit pe Internet, pentru medii Unix si mai nou pentru medii Windows (inclusiv sursele), integrindu-se in popularul server Apache.

Istoria PHP-ului incepe la sfirsitul anului 1994, cind Rasmus Lerdorf dezvolta prima versiune, ca proiect personal. PHP este facut public in debutul anului 1995 sub denumirea Personal Home Page Tools, fiind considerat un analizor simplist care interpreta citeva macrouri ce puteau fi incluse in cadrul documentelor HTML, permitind contorizarea accesului la paginile Web sau accesarea unei carti de oaspeti (guestbook). Analizorul a fost rescris in mijlocul aceluiasi an si denumit PHP/FI versiunea 2.0, unde FI era o alta aplicatie scrisa de Rasmus Lendorf, un interpretor de formulare HTML. A fost adaugat si suportul pentru bazele de date mSQL si astfel PHP/FI a inceput sa aiba succes, fiind disponibil gratuit pe Web. La sfirsitul lui 1996, se estima ca PHP/FI era utilizat de cel putin 15000 de site-uri Web, iar in anul 1997 numarul lor era de 50 de mii. Programatorii Zeev Suraski si Andi Gutmans rescriu analizatorul PHP si noua aplicatie formeaza nucleul versiunii PHP 3 care a inclus o parte din vechile surse PHP/FI 2.0. Relativ recent, la inceputul anului 2000, a fost facuta publica versiunea PHP 4.0, utilizind puternicul motor de scriptare Zend si oferind suport nu numai pentru serverul Apache, ci si pentru alte servere Web. Se estimeaza ca numarul de site-uri folosind PHP este de peste un milion.

2.1 Limbajul PHP
Limbajul PHP se poate introduce in cadrul documentului HTML printr-un tag special <?statement?> sau <?php statement?> unde statement este o instructiune a limbajului, cum ar fi echo, if, break, while si altele. Variabilele se declara 'din zbor', tipul lor putind fi de exemplu integer, double sau string, iar numele de variabile trebuie precedat de caracterul $. Pot fi definite si tablouri (indexate sau asociative, ca in Perl). Sint permisi operatorii obisnuiti si se pot defini si functii utilizator (prin constructia Function).

Un exemplu
Presupunem ca definim urmatorul formular:

<form action="/cgi-bin/php.cgi/Iuser/display.html" method="post">
<input type="text" name="nume">

<input type="text" name="virsta">
<input type="submit">
</form>

Se cer utilizatorului numele si virsta care vor fi procesate de programul (scriptul) PHP continut in fisierul display.html. Acesta ar putea contine:

<? if ($virsta>50); echo "<p>Salut $nume, esti virstic...</p>"; elseif ($virsta>30); echo "<p>Salut $nume, esti matur...</p>"; else; echo "<p>Salut $nume, esti tinar...</p>"; endif;
>

Dupa cum se observa, PHP ofera un limbaj script puternic si simplu, accesul la cimpurile formularului realizindu-se prin intermediul unor variabile create automat.

Scripturile PHP pot fi incluse in paginile Web in diferite moduri, asa cum arata exemplul de mai jos:

1. <? echo ("cea mai simpla cale de introducere...\n"); ?>

2. <?php echo("se utilizeaza in cazul documentelor XML.\n"); ?>

3. <script language="php"> echo ("anumite editoare nu accepta tag-uri necunoscute");
</script>

4. <% echo ("optional se pot folosi tag-uri in stilul ASP"); %>

Comentariile pot fi incluse in stilul comentariilor din limbajele C, C++ sau shell-urile UNIX.

In PHP exista de asemeni o multitudine de functii predefinite:

matematice

de conversie

de manipulare a sirurilor de caractere

de prelucrare a tablourilor

de acces la resursele sistemului de operare si de lucru cu fisiere

de manipulare a bazelor de date

privitoare la conexiunile Internet (HTTP, FTP)

pentru accesarea fisierelor avind tipuri speciale: PDF, GIF, XML etc.

generale

2.2 Exemple
Un exemplu de interogare SQL efectuata in PHP, rezultatul fiind afisat in cadrul unei pagini Web:

<?php
$name="Sabin";
$result=msql($database,
"select * from table where firstname='$name'");
$num=msql_numrows($result);
<!-- numarul de inregistrari gasite --> echo "<p>Au fost gasite $num inregistrari:<p>");
$i=0;
while ($i<$num) echo msql_result($result,$i,"fullname"); echo "<br>"; echo "<b>"; <!-- adresa se va scrie ingrosat --> echo msql_result($result,$i,"address"); echo "</b>"; echo "<p>";
$i++; endwhile;
>

Vizualizarea unei colectii de imagini. Utilizatorul are la dispozitie imaginile la rezolutie scazuta (thumbnails) si poate opta sa vizualizeze imaginea dorita la rezolutie inalta. Scriptul PHP este urmatorul:

<?
// vom avea doua directoare cu imagini
// unul cu imaginile la rezolutie scazuta (GIF-uri)
// THUMBNAIL DIRECTORY
$path = "thumbnails";
// altul cu imaginile la rezolutie inalta (JPEG-uri)
// IMAGE DIRECTORY
$path2 = "images";

// numarul de imagini pe un rind
$clm = "9";

// latimea unui thumbnail
$t_w = "48";

// inaltimea unui thumbnail
$t_h = "43";

// numarul de imagini pe o linie de tabel
$count = 1;
$break = $clm;

?>

<!-- se includ imaginile intr-un tabel -->
<table border="1" cellpadding="0" cellspacing="0">
<tr>

<?

// se cauta in directorul "path" imaginile GIF...
$d = dir("$path");
while($entry=$d->read()) A /* citeste intrarile din director */ if($entry==".")
A echo ""; /* directorul curent, nu-i imagine */
S elseif($entry=="..")
A echo ""; /* directorul parinte */
S else
A
ClearStatCache();
/* furnizeaza dimensiunile imaginii */
$size = GetImageSize("$path2/$entry");
$width = $sizea0i + 10;
$height = $sizea1i + 20;
/* furnizeaza dimensiunea fisierului */
$file_size=fileSize("$path2/$entry");
$file_size = round($file_size / 1000) . "k";
/* afiseaza o celula de tabel continind imaginea */
/* utilizeaza JavaScript pentru afisarea imaginii la rezolutie inalta */ echo "<td>
<a href=\"#\" onMouseOver=\"window.status='$entry $sizea0ix$sizea1i';return true;\" onMouseOut=\"window.status=''; return true\" onclick=\"window.open('$path2/$entry','pix$count',
'width=$width,height=$height, directories=no,location=no,menubar=no,scrollbars=no, status=yes,toolbar=no,resizable=no, top=10,left=10,screenX=10,screenY=10'); return false\">
<img src=$path/";echo $entry." border=0
width=$t_w height=$t_h>
</a>
<br>
<center><font size=2>$file_size</font></center>";
/* s-a ajuns la maximul de imagini pe o linie? */ if ($count == $break)
A echo "</td>\n</tr>\n<tr>\n";
$break = $count + $clm - 2;
S else
A echo "</td>\n"; S

S
$count++;
S
/* inchide directorul */
$d->close();
?>
<!-- inchide tag-urile tabelului -->
</tr>
</table>

Un script PHP care afiseaza in fereastra navigatorului lista fisierelor .html dintr-un director, atasind la numele acestora si ancore, in plus furnizind lungimea in octeti a fisierului, data crearii si autorul acestuia, daca fisierul respectiv contine un tag <meta name="author" content="...">.

Programul este urmatorul:

<p>La URL-ul "<tt>https://<?echo $SERVER_NAME ?>/</tt>" exista urmatoarele fisiere <tt>.html</tt>:</p>
<hr>
<ul>
<? /* se parcurge directorul (in acest caz directorul curent) */
$dir = opendir(".");
while ($file = readdir($dir)) A
/* se verifica daca este fisier ordinar si are extensia .html */ if (is_file($file) && substr($file,-1)=="l" && strstr($file,".html")) A echo "<li><a href=\"$file\">$file</a>";
/* se stocheaza intr-un tablou asociat informatiile despre fisier */
$filestat = stat($file);
/* dimensiunea */ echo " - $filestata7i bytes ";
/* data, convertita din timpul UNIX in elemente ale tabloului asociativ 'filedate' */
$filedate = getdate($filestata9i);
/* folosim functia de formatare a datei si timpului */ printf("<i>%02d-%02d-%d %02d:%02d:%02d</i>",
$filedatea"mday"i, $filedatea"mon"i, $filedatea"year"i,
$filedatea"hours"i, $filedatea"minutes"i, $filedatea"seconds"i);
/* se extrag toate <meta> din fisier */
$metatags = get_meta_tags($file);
/* se verifica daca exista <meta name="author" ...> */ if (isset($metatagsa"author"i)) A
/* afisam si autorul */ echo "<ul>Author: "; echo $metatagsa"author"i; echo "</ul>";
S
S
S
/* se inchide directorul */ closedir($dir);
?>
</ul>

O ipostaza a executiei scriptului este data mai jos:


Executia scriptului PHP si vizualizarea listei de fisiere HTML
Vom prezenta in continuare un site Web complet dezvoltat folosind tehnologia PHP si anume site-ul studentilor Facultatii de Informatica: https://students.infoiasi.ro. Conceptia, implementarea si administrarea sint realizate de studentul Radu Filip.


Site-ul students.infoiasi.ro
In creatia site-ului au fost folosite exclusiv aplicatii GNU (software free), precum editorul de text din managerul de fisiere Midnight Commander (in mod consola) si programul de procesare grafica GIMP (GNU Image Manipulation Program), sub sistemul de operare Linux.

Toate paginile din componenta site-ului sint generate dinamic prin utilizarea preprocesorului PHP versiunea 3. Unul dintre modulele implementate contine definitia unei clase (PHP permite programarea orientata pe obiecte, dar pe baza unui model mai simplificat fata de C++/Java) descriind layout-ul unui limbaj de programare oarecare (din perspectiva a ce este nevoie in meniul acestui sit). Instantieri ale acestei clase pentru diversele limbaje de programare sint memorate folosind un vector de limbaje. Separat, exista un alt vector al legaturilor si al descrierilor lor. Prin afisarea acestora cu un anume layout de limbaj ales de utilizator rezulta layout-ul final in care este afisat meniul sitului. Fiecare limbaj si fiecare legatura sint descrise exact o singura data. Adaugarea/eliminarea ulterioara de layout-uri de limbaje de programare sau de legaturi nu necesita nici un fel de modificari conexe. Caracterul complet dinamic al sitului este conferit de asamblarea acestor seturi de date.


Modificarea stilului de afisare a meniului in functie de limbajul ales
O alta facilitate cu caracter dinamic o constituie detectarea in mod automat a limbii implicite de afisare (limba romana pentru vizitatorii din Romania, respectiv limba engleza pentru vizitatorii straini). Oricum, utilizatorul poate alege oricind cealalta limba de afisare, aceasta schimbare avind caracter permanent.

Alte componente generate in mod dinamic sunt:

includerea unor stiluri CSS diferite in functie de browser

un formular de selectare a layout-ului cu buton de submit pentru Lynx (care nu implementeaza JavaScript)

note de subsol ale unor sectiuni care nu sunt vizibile utilizatorilor din afara infoiasi.ro


Infatisarea meniului dupa ce s-a ales layout-ul corespunzator limbajului C
Dimensiunea totala efectiva a sitului (codul sursa, paginile in limbile romana si engleza, imaginile), exclusiv biblioteca, counter-ul etc., este de aproximativ 327 kilobytes.

3. ASP (Active Server Pages)
3.1 Caracteristici
ASP (Active Server Pages) reprezinta o aplicatie Microsoft gratuita, utila pentru realizarea paginilor Web dinamice si interactive, care a aparut in premiera la inceputul anului 1996. In prezent este disponibila versiunea 5.0. In fapt, ASP reprezinta o interfata de programare Internet Server Application Programming Interface (ISAPI) oferita de serverul Web. Serverele ASP ofera o conectivitate strinsa cu servere de baze de date precum MS SQL Server, Oracle sau Access si permit executia de componente ActiveX.

Scripturile ASP vor rula pe serverul Web - in mod uzual un motor ASP distribuit de Microsoft pentru Windows 9x sau serverul Microsoft Internet Information Server (IIS) pentru Windows NT/2000 - stocate fiind intr-un director special, denumit \InetPub\scripts (similar directorului cgi-bin) si vor putea accesa diverse variabile de mediu transmise de catre server. Paginile Web in mod uzual pe server sint memorate in directorul \InetPub\wwwroot. Exista si diverse implementari ISP pentru diverse versiuni de UNIX (e.g. Instant ASP), Novell sau Lotus Notes/Domino.

3.2 Fisierele ASP
Un fisier ASP (avind, de obicei, extensia .asp) poate contine combinatii de date de tip text, marcatori HTML si comenzi script. In principal, serverul ASP ofera interpretoare pentru VBScript si JScript, limbajul implicit fiind VBScript. Fiecare intrepretor este un obiect COM (Component Object Model) care proceseaza scripturile, acest obiect trebuind sa fie instalat pe serverul Web. Aceste obiecte COM au, in principiu, aceeasi functie ca si modulele din Apache. Limbajul script primar poate fi modificat prin intermediul cheii HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\ASP\Properties din registry-ul masinii pe care ruleaza serverul.

ASP poate oferi medii de scriptare si pentru alte limbaje, ca REXX sau Perl.

Comenzile script si expresiile de iesire in ASP sint delimitate de <% si %> (in PHP aveam <?...?>). Scripturile pot fi incorporate in fisiere ASP sau pot fi stocate in fisiere externe care vor fi incarcate si rulate pe server:

<html>
<body>
<!-- apel VBScript al unei functii JScript -->
<% Call hello_world %>
</body>
</html>

<script runat="server" language="JScript"> function hello_world() A
Response.Write("Hello, world!\n");
S
</script>

ASP ofera suport partial pentru SSI (Server Side Includes) prin implementarea doar a directivei de preprocesare #include menita sa includa intr-un fisier .asp continutul altuia:

<!--#include virtual="nume_fisier"-->
<!--#include file="nume_fisier"-->

Este recomandabil ca fisierele incluse sa aiba extensia .inc, desi sint acceptate orice nume valide de fisiere. Cuvintul cheie virtual specifica faptul ca fisierul este stocat intr-un director virtual, iar daca se foloseste file atunci fisierul este memorat intr-un director relativ la directorul curent.

Includerea fisierelor se realizeaza inainte de executia scripturilor din fisierul ASP. Astfel, nu se pot concepe scripturi care sa genereze dinamic numele unui fisier ce va fi inclus ulterior prin #include. Comenzile script si functiile/procedurile trebuie sa fie continute complet intre <% si %> sau tag-urile <script> si </script> ori <object> si </object>. Nu se poate deschide un delimitator de script intr-un fisier ASP care include un fisier unde se inchide acel delimitator.

Urmatorul exemplu este gresit:

<% for (i = 1 ; i < 10 ; i++)
A
/* instructiuni */
<!--#include file="antet.inc" -->
S
%>

ASP poate fi utilizat pentru modificarea unui script destinat a fi rulat pe partea client de catre un script executat pe server:

<script language="JScript">
<!-- // ascundere cod de navigatoarele vechi
/* script client */
<% script server %>
/* script client */
<% script server %>
...
// -->
</script>

Desigur, aceasta abordare poate fi realizata si in CGI sau PHP.

3.2 Obiecte ASP predefinite
ASP ofera programatorului urmatoarele obiecte (componente) predefinite care nu necesita instantieri explicite:

Request preia informatii despre utilizator;

Response trimite informatii la utilizator;

Server controleaza mediul de executie ASP;

Session stocheaza informatii despre sesiunea unui utilizator;

Application partajeaza informatii intre utilizatorii unei aplicatii.

De asemeni pot fi definite si tag-uri noi care vor fi procesate de catre motorul ASP.

3.3 Obiectul Request
Acest obiect furnizeaza accesul la urmatoarele colectii de date:

QueryString (preia informatii din variabila QUERY_STRING setata de serverul Web),

Form (stocheaza valorile cimpurilor unui formular),

Cookies (contine informatii referitoare la cookie-uri),

ServerVariables (ofera informatii despre variabilele serverului; e.g. SERVER_PORT sau REMOTE_ADDR),

ClientCertificate (furnizeaza informatii despre certificatele de autentificare).

Exemple

Presupunem ca in urma completarii unui formular se trimite serverului urmatorul URI: welcome.asp?name=Sabin+Buraga&age=26. In fisierul welcome.asp ar putea exista urmatorul cod pentru afisarea datelor din formular:

<p align="center">
Welcome, <i><%= Request.QueryString("name") %></i>.
Your age is <%= Request.QueryString("age") %>.
</p>

Textul afisat de navigator va fi:

Welcome, Sabin Buraga. Your age is 26.

Urmatorul fragment de cod VBScript va oferi o pagina Web in limba dorita de utilizator, pe baza consultarii variabilei HTTP_ACCEPT_LANGUAGE furnizata de serverul Web:

<% language = Request.ServerVariable("HTTP_ACCEPT_LANGUAGE") if language = "ro" then
%>
<!--#include file="pages/ro/course.asp" -->
<% else %>
<!--#include file="pages/en/course.asp" -->
<% end if %>

3.4 Obiectul Response
Putem apela cinci metode ale acestui obiect pentru:

a trimite informatii direct browserului (Write),

a redirecta utilizatorul spre alt URI (Redirect),

a controla tipul de date trimis clientului (ContentType),

a seta valorile unui cookie (Cookies),

a utiliza buffere de date pentru stocarea locala a documentelor sau reimprospatarea continutului (Buffer).

Exemplu
Pentru a fi siguri ca utilizatorii vor vizita o anumita pagina (chiar si fara voia lor), putem sa ne slujim de urmatorul cod de redirectare:

<% if (!Session("home_page"))
Response.Redirect("homepage.asp");
%>

3.5 Obiectul Server
Acest obiect se utilizeaza atunci cind dorim sa activam diverse componente ActiveX in cadrul paginilor ASP. Sint incluse citeva componente standard, precum o componenta de acces la baze de date, o componenta de interogare a capabilitatilor navigatorului, o componenta pentru lucrul cu fisiere sau o componenta de realizare a legaturilor dintre diverse documente.

Metodele cele mai utilizate sint CreateObject care creeaza o instanta a unei componente oferind un anumit serviciu, URLEncode care codifica un URL conform regulilor prezentate in cadrul sectiunii despre CGI, MapPath asociind o cale virtuala unei cai de directoare fizice.

Exemple
Furnizarea de informatii despre caracteristicile navigatorului client:

<!-- Instantierea componentei -->
<% bc = Server.CreateObject("MSVC.BrowserType") %>
<p>Browser: <%= bc.browser %>
<p>Versiune: <%= bc.version %>
<p>Suporta frame-uri: <% Response.Write(bc.frames ? "da" : "nu") %>
<p>Suporta tabele: <% Response.Write(bc.tables ? "da" : "nu") %>
<p>Suporta ActiveX: <% Response.Write(bc.ActiveXControls ? "da" : "nu") %>

Urmatorul exemplu scris in VBScript citeste dintr-un fisier text o lista de legaturi spre anumite pagini si construieste o pagina Web cu aceste legaturi:

<% set links = Server.CreateObject("MSVC.NextLink") count = links.GetListCount("/links/list.txt")
%>
<ul>
<% for i = 1 to count %>
<li>
<a href="<%= links.GetNthUrl("/links/list.txt", i) %>">
<%= links.GetNthDescription("/links/list.txt", i) %>
</a>
</li>
<% next %>
</ul>

3.6 Obiectele Session si Application
Aceste obiecte sint utilizate pentru conceperea de aplicatii Web bazate pe ASP. Fisierele corespunzatoare aplicatiei (documente HTML si ASP, scripturi, fisiere de date si multimedia etc.) vor fi stocate intr-un director virtual pe serverul Web.

Atunci cind vorbim de aplicatii ASP ne referim si la starea acestora, starea constind din instantierea si folosirea ulterioara a doua obiecte: Application (toate informatiile despre o aplicatie sint disponibile tuturor utilizatorilor acesteia, in mod global) si Session (informatiile pot fi accesate doar de un anumit utilizator in cadrul unei sesiuni particulare).

Fiecare aplicatie ASP va avea asociat un fisier numit Global.asa (extensia provenind de la Active Server Application) care va fi localizat in directorul radacina al directorului virtual al acelei aplicatii. Acest fisier va fi prelucrat de server fie la o cerere de initializare, imediat dupa ce serverul Web a fost activat, fie cind un anumit utilizator caruia inca nu i-a fost creata o sesiune doreste sa acceseze un fisier .asp al aplicatiei respective.

Fisierul Global.asa poate include:

proceduri de tratare a evenimentelor de initializare a aplicatiei, a unei sesiuni ori a ambelor;

proceduri de tratare a evenimentelor de terminare a aplicatiei, a unei sesiuni sau a ambelor;

marcatori <object> care creeaza diferite obiecte (componente ActiveX de obicei).

Sesiuni ASP
Dupa cum am vazut, atunci cind un utilizator viziteaza o pagina Web a unei aplicatii ASP, se genereaza o asa-numita sesiune care diferentiaza acel utilizator de altii. Informatiile detinute de o sesiune pot fi accesate si manipulate de programele ASP, fiind utile in cazul aplicatiilor necesitind autentificarea sau stabilirea unor preferinte specifice utilizatorului respectiv.

De mentionat faptul ca o sesiune este terminata automat de server daca utilizatorul nu mai acceseaza o pagina a aplicatiei pentru o perioada anumita de timp (e.g. 20 de minute). Explicit, o sesiune poate fi terminata executind metoda Session.Abandon. O aplicatie se termina atunci cind serverul Web este oprit.

O sesiune poate incepe in urmatoarele trei maniere:

un utilizator nou face o cerere a unui URL corespunzator unui fisier .asp al unei aplicatii;

un utilizator stocheaza o valoare intr-un obiect Session;

un utilizator cere un fisier .asp al aplicatiei si fisierul Global.asa corespunzator va fi utilizat pentru a se instantia in cadrul unei sesiuni un obiect (definit printr-un <object>).

Informatiile vehiculate in cadrul unei sesiuni pot fi facute private, fiind accesibile teoretic numai in acea sesiune.

Fiecare sesiune poseda un identificator unic, denumit SessionID, care este trimis clientului pentru a se creea un cookie nepersistent corespunzator sesiunii in cauza. In cadrul acestui cookie vor fi memorate diverse informatii (private) despre sesiune. De fiecare data cind serverul ASP receptioneaza o cerere, se va verifica in antetul HTTP existenta cookie-ului corespunzator identificatorului SessionID. Despre cookie-uri vom discuta in detaliu in unul dintre subcapitolele urmatoare.

In cadrul unui astfel de cookie pot fi retinute anumite preferinte ale utilizatorului, valori ale cimpurilor formularelor, date despre browser etc.

Stocarea variabilelor intr-un obiect Session se realizeaza in modul urmator:

<%
Session("Initiated") = Now
Session("Color") = "Green"
Set Session("vrmlobj") = Server.CreateObject("MSVRML2C")
%>

Consultarea variabilelor se poate face in maniera de mai jos:

<% if Session("Color") = "Green" then %>
<!-- verde -->
<body bgcolor="darkgreen" text="lightgreen" link="turquoise" vlink="white">
<% else %>
<!-- clasic -->
<body bgcolor="white" text="black" link="blue" vlink="magenta">
<% end if %>
...

Urmatorul exemplu de script ASP scris in VBScript numara cite cifre "0" si cite cifre "1" au fost generate aleatoriu la fiecare accesare a paginii Web:

<%
Response.Write "Generez o cifra...<br>" randomize randomnum = int(rnd*2) + 1
IF randomnum = 1 THEN
Session("zero") = Session("zero") + 1
ELSE
Session("unu") = Session("unu") + 1
END IF
Response.Write "Nr. de 0 = " & Session("zero") & "<br>"
Response.Write "Nr. de 1 = " & Session("unu") & "<br>"
%>

Fiecare utilizator care acceseaza documentul va avea o sesiune privata, cu propriile sale variabile-contor. Datele sesiunii sint intotdeauna stocate pe server, iar fiecare sesiune are un identificator propriu, memorat intr-un cookie pe masina client. Operatorul & realizeaza concatenarea sirurilor de caractere.

Aplicatii ASP
Cu ajutorul obiectului Application putem seta proprietati care vor fi accesate de toti utilizatorii aplicatiei respective. Astfel, prin intermediul diverselor variabile stocate de obiectul Application putem afisa un text tuturor utilizatorilor aplicatiei, putem contoriza numarul de accesari, putem asigna diverse executii de scripturi la aparitia unor evenimente etc.

Intr-un obiect Application nu se pot memora insa obiectele ASP predefinite. Exemplul de mai jos va genera eroare:

<%
Set Application("sesiune") = Session
Set Application("cerere") = Request
Set Application("raspuns") = Response
%>

Pentru a asigura integritatea accesului concurent la resurse comune, Application poseda metodele Lock (previne modificarea proprietatilor obiectului de catre alti clienti) si Unlock (permite ca proprietatile sa fie modificate).

Iata un script care poate fi folosit pentru contorizarea numarului de vizite:

<%
Application.Lock
Application("Vizite") = Application("Vizite") + 1
Application.Unlock
%>
<h6 align="right">
Numarul total de accesari: <%= Application("Vizite") %>
</h6>

Componentele ActiveX prezente intr-o aplicatie pot avea urmatoarele domenii de vizibilitate:

la nivelul aplicatiei

Componenta este instantiata o singura data la momentul initializarii aplicatiei si este disponibila tuturor cererilor provenite de la orice client.

la nivelul sesiunii

Se creeaza o instanta a componentei pentru fiecare sesiune in parte si se distruge la terminarea acelei sesiuni. O sesiune activa va avea o unica instanta a unei componente particulare.

la nivelul paginii

Componenta se instantiaza pentru procesarea unei pagini de catre un anumit client.

Domeniul de vizibilitate implicit este cel situat la nivelul paginii.

Declararea unei instante de componenta ActiveX vizibila la nivelul aplicatiei sau la nivelul sesiunii se realizeaza in cadrul fisierului Global.asa prin intermediul tag-ului <object>, ca in exemplul de mai jos:

<object runat="server" scope="Application" id="MSVRML2C" classid="clsid:90A7533D-88FE-11D0-9DBE-0000C0411FC3">
</object>

Se defineste in acest mod un control ActiveX de vizualizare a lumilor VRML avind domeniul de vizibilitate situat la nivelul aplicatiei si fiind rulat pe server. Identificatorul global universal de clasa (classid) corespunde unei intrari in registry a componentei respective.

Serviciile oferite de o componenta ActiveX sint ilustrate in figura urmatoare:


Un control ActiveX
Controalele ActiveX pot fi solutia pentru includerea unui bogat continut multimedia din paginile Web. Astfel, Black Diamond Consulting ofera controale ActiveX permitind vizualizarea de imagini stereografice sau a proiectiilor de 360 de grade ale imaginilor de perspectiva (similare celor din enciclopedia Encarta). Extensiile VRML prezente in cadrul navigatoarelor actuale pot fi substituite de controale ActiveX in deplina interactiune cu utilizatorul, module denumite Active VRML. Un alt control util este vizualizatorul de prezentari PowerPoint pentru Internet Explorer.

Controalele ActiveX pot fi folosite pentru si activitati de administrare a resurselor sistemului de operare sau pentru detectia, prin Web, a virusilor. Chioscurile informationale si educationale sau jocurile in retea pot beneficia, de asemeni, de serviciile oferite de tehnologia ActiveX.

Dezavantajul consta in dependenta clara de platforma si in utilizarea de unelte de dezvoltare proprietare Microsoft.

3.7 Componente hipertext
Definirea unei componente noi se realizeaza prin intermediul constructiei urmatoare, scrisa intr-un fisier .htc (HyperText Component file) stocat pe serverul ASP:

<PUBLIC:COMPONENT NAME="componenta">
<PUBLIC:ATTACH event="eveniment" handler="functie" />
...
<PUBLIC:PROPERTY name="proprietate" />
<PUBLIC:METHOD name="metoda" />
<SCRIPT>

// codul scriptului care implementeaza metoda
// si toate functiile care trateaza evenimentele specificate

</SCRIPT>
</PUBLIC:COMPONENT>

Exemplu
Urmatorul exemplu, rulind sub Internet Explorer 5, ilustreaza adaugarea unui comportament la un tag definit de utilizator pentru realizarea efectului de clipire a elementului <blink> prezent in Netscape Communicator.

Vom defini o componenta stocata in fisierul blink.htc a carei actiune va fi realizarea efectului de clipire:

<PUBLIC:COMPONENT name="blink">
<PUBLIC:PROPERTY name="speed" />
<PUBLIC:METHOD name="doBlink" />
<PUBLIC:ATTACH event="oncontentready" handler="Init" />
<SCRIPT>
// codul JavaScript pentru clipire
// adaptat dupa InsideHTML.com
// metoda de clipire function doBlink() A this.style.visibility = this.style.visibility =="" ? "hidden" : ""
S

// functia de initializare apelata la aparitia
// evenimentului <i>oncontentready</i> function Init() A if (!speed) // daca nu-i specificata viteza de clipire... speed = 1000 // atunci va clipi din secunda in secunda setInterval(uniqueID + ".doBlink()", speed)
S
</SCRIPT>
</PUBLIC:COMPONENT>

In cadrul documentului Web, va trebui sa atasam un comportament elementului <blink> prin constructia:

<style>
<!-- ascundere de browserele mai vechi
@media screen /* clipire doar pentru ecran */
A blink A behavior:url(blink.htc); S
S
-->


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta