Serverske tehnologije - FSR web : www.fsr.ba

Programiranje za
Internet 2
Dinamičko generiranje stranica
na serveru
Ak. god. 2007/2008
CGI
CGI (Common Gateway Interface) je jedan od prvih
standarda razvijenih kao sučelje (interface) koje vanjski
“gateway” programi koriste za spajanje na HTTP ili Web
server.
Obični HTML dokument kojeg isporučuje Web server na
zahtjev klijenta je statičan, što znači da se ne mijenja.
CGI program se za razliku od statičnih HTML dokumenata
izvršava tako da može generirati dinamičke informacije
(npr. rezultat nekakvog upita na bazu podataka).
CGI omogućava da klijent dobije ne samo statičku stranicu
od Web servera nego da na tom serveru pokrene neki
program i dobije rezultate izvršavanja tog programa.
2
1
WEB SERVER
HTTP zahtjev
Common
Gateway
Interface
HTTP odgovor
Neki proces:
npr. Perl skripta,
program
(iskompajliran)
napisan u C, C++,
Javi itd.
HTTP zahtjev
HTTP odgovor
Web klijent
3
CGI
“Gateway” programi su programi koji mogu obraditi
informaciju HTTP zahtjeva koji klijent šalje Web
serveru kada dohvaća neki stranicu sa servera (npr.
GET http://laris.fesb.hr/index.html HTTP/1.1) i mogu
vratiti odgovarajući dokument (HTML stranicu) ili
dinamički generirati povratnu stranicu.
Ovi se programi mogu koristiti za različite svrhe, npr.
za obradu podataka poslanih preko forme, za
dohvat podataka iz baze podataka, ….
Common Gateway Interface je ustvari konvencija
koja kaže onima koji rade HTTP server kako u taj
server uključiti “gateway” skripte i programe.
4
2
CGI
“Gateway” programi i skripte se mogu izvoditi i sami bez Web
servera.
Ti programi se mogu pisati u različitim programskim jezicima.
Često se koriste C, C++, Perl, Python, TCL, shells, itd. Nije bitno
u kojem jeziku je program napisan sve dok ima prava izvođenja
na serveru i dok je napisan na način da generira ispravan izlaz
za web server.
Primjer
http://www.fesb.hr/kiki-cgi/proba
odnosno preko html stranice http://www.fesb.hr/~kiki/proba.htm
ili http://www.fesb.hr/~kiki/proba5.htm
5
CGI
Web server definira mapiranje između
određenog URL-a i CGI programa.
Definiranje URL-a za neki CGI programa nije
točno definirano standardom, ali tipično se
CGI programi smještaju u određeni
poddirektorij koji se zove /cgi-bin/ ili /cgi/.
6
3
CGI
Za komunikaciju između
servera i CGI programa
obično se koriste tzv.
okolinske varijable
(environment variable). One
su dio Web servera, a CGI
program ih dohvaća i radi
sa njima.
Za komunikaciju se može
koristiti i stdin (standardni
ulaz) i stdout (standardni
izlaz) CGI procesa.
7
CGI
Najčešće korištene okolinske varijable su:
QUERY_STRING – ta varijabla u sebi sadrži informacije
koje se u URL stavljaju iz znaka ?. Npr. parametri forme i
sl. (primjer: http://www.fesb.hr/~kiki/proba2.htm)
CONTENT_LENGTH – ta varijabla sadrži duljinu podataka
(u bajtovima) koji su predani CGI programu preko
standardnog ulaza, a ne preko QUERY_STRING varijable
(primjer . http://www.fesb.hr/~kiki/proba1.htm)
SERVER_NAME – ta varijabla sadrži ime ili IP adresu
servera. (http://www.fesb.hr/~kiki/proba.htm)
8
4
CGI
CGI program može generirati u izlazu HTTP statusnu liniju
odgovora, ali ukoliko to ne napravi statusnu liniju će ubaciti
web server:
printf(“HTTP/1.1 200 OK\r\n”);
CGI program može generirati u izlazu i HTTP zaglavlja:
printf(“Content-type: text/html\r\n”); printf(“\r\n”);
Jedno zaglavlje je obvezno i to upravo zaglavlje Contenttype koje označava tip podataka koje je generirao CGI
program (to je obično HTML format, ali program može
generirati i sliku ili nešto drugo).
Web server obično nadoda i dodatna zaglavlja.
9
URL kodiranje
URL standard (RFC 1738) omogućava korištenje samo dijela US-ASCII
karakter skupa (brojeve, slova i neke specijalne karaktere).
HTML standard dopušta korištenje svih karaktera ISO-8859-1 karakter
skupa dok HTML verzija 4 proširuje skup dopuštenih karaktera na
Unicode karakter skup.
Karakteri koji se koriste u definiranju URL-a u HTML kôdu (npr.
elementi <form action=“neki url”>, <a href=“neki url”>…), a koji nisu u
skupu dozvoljenih karaktera za URL trebaju se kodirati. Također se
trebaju kodirati i karakteri koji su dozvoljeni u URL, ali su to specijalni,
rezervirani karakteri. Npr. karakter “/” se smije koristiti isključivo za
definiranje puta do dokumenta (/direktorij/poddirektorij/index.html).
URL kodiranje ili kodiranje sa postotcima (percent encoding) kodira
karakter na način da ga zapiše sa njegovom ASCII vrijednošću
zapisanom sa dvije heksadecimalne znamenke ispred kojih se stavlja
karakter %.
Npr. specijalni karakter space (razmak) se kodira sa %20 (ili sa znakom
+). Primjer: http://www.fesb.hr/~kiki/proba2.htm
10
5
URL kodiranje
Kada klijenti šalju podatke web serveru u sklopu HTTP zahtjeva
(npr. podatke s forme) podatke kodiraju prema URL standardu.
Većina karaktera koji nisu ni slovo ni broj se kodiraju sa znakom
% nakon kojeg idu dvije ASCII kodirane heksadecimalne
znamenke.
= postaje %3D
& postaje %26
razmak postaje +
+ postaje %2B
Primjer:
http://www.fesb.hr/kikicgi/proba2?polje=a+b%26c%3D%25d&polje2=&polje3=
11
CGI
PODACI POSLANI GET METODOM
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *method, *query;
method = getenv("REQUEST_METHOD");
query = getenv("QUERY_STRING");
printf("Content-type: text/html\r\n\r\n");
printf("<H1>Metoda je %s</H1>\n",method);
if(query != NULL)
printf("<H1>Upit je %s</H1>\n",query);
return(0);
}
http://www.fesb.hr/kiki-cgi/osnovni_cgi?prvi=1&drugi=234&treci=456
http://www.fesb.hr/kiki-cgi/osnovni_cgi?polje=a+b%26c%3D%25d
12
6
CGI
PODACI POSLANI POST METODOM
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *method, *query;
method = getenv("REQUEST_METHOD");
query = (char *)malloc( 3000 );
if( query==NULL)
{
fprintf(stdout, "Greska u alociranju memorije!<BR>");
exit(1);
}
fgets( query, 3000-1, stdin );
printf("Content-type: text/html\r\n\r\n");
printf("<H1>Metoda je %s</H1>\n",method);
if(query != NULL)
printf("<H1>Upit je %s</H1>\n",query);
return(0);
}
http://www.fesb.hr/~kiki/pozovi s postom.html
13
Java Servleti
Servleti su Java tehnologija i na neki način su
odgovor na CGI standard.
Servleti su moduli Java kôda koji se izvode u
aplikaciji servera. Odatle i ime servleti slično
appletima na strani klijenta.
Servleti nisu vezani uz određeni klijent-server
protokol, ali se najčešće koriste s HTTP protokolom.
Slično CGI programima odgovaraju na HTTP
zahtjev korisnika.
14
7
CGI ↔ Servlet
Kod tradicionalnog CGI-a za svaki HTTP
zahtjev se pokreće novi proces.
Ako je CGI program brz najveći dio vremena
se troši na pokretanje procesa.
Kod servleta svaki HTTP zahtjev se obrađuje
kao novi thread.
Kod klasičnog CGI-a ako istovremeno postoji
N zahtjeva na isti program, program se
učitava u memoriju N puta.
15
16
8
Npr. ISAPI
17
Java Servleti
Servleti koriste klase iz Java paketa javax.servlet
(osnova servleta) i javax.servlet.http (proširenje
servleta tako da mogu odgovarati i na HTTP
zahtjeve).
Osnovne razlike između servleta i CGI-a:
Servlet se ne izvodi kao zasebni proces. To znači da se ne
treba za svaki HTTP zahtjev stvarati novi proces.
Servlet ostaje u memoriji između dva zahtjeva dok se CGI
program treba učitati nanovo za svaki HTTP zahtjev.
Postoji samo jedna instanca koja istovremeno odgovara na
sve zahtjeve.
18
9
Java Servleti
Servlet je u svom najopćenitijem obliku instanca
klase koja implementira javax.servlet.Servlet sučelje
(interface). Većina servleta ipak koristi već
standardne implementacije javax.servlet.Servlet, a
to su javax.servlet.GenericServlet i
javax.servlet.http.HttpServlet.
Da bi inicijalizirao servlet, Web server učitava klasu
koja implementira sučelje Servlet i kreira instancu
procesa pozivajući konstruktor za tu klasu.
Tada se poziva init metoda koja vrši setup i
incijalizaciju servleta.
19
Server
Servlet Startup
Process Client Requests
Server
Servlet Destroy
Servlet Cycle
20
10
Java Servleti
Kada se neki servlet pozove prvi put, učita se u
memoriju. Nakon što je HTTP zahtjev obrađen
servlet ostaje u memoriji sve dok je Web server
aktivan.
Prvi put kada se servlet učita u memoriju poziva se
njegova init() metoda. Ta metoda se poziva samo
prvi put tj. za sve naknadne zahtjeve servletu ta se
metoda više ne poziva.
Većina Web server ima mogućnost učitavanja često
korištenih servleta prilikom podizanja servera tako
da su ti servleti već učitani u memoriju prije no što
dođe prvi zahtjev za tim servletima.
21
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse
response) throws IOException, ServletException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>"); out.println("</html>");
}
}
22
11
Java Server Pages (JSP)
Java Server Pages (JSP) omogućava kombiniranje
HTML koda sa programskim kodom (slično kao i
ASP).
JSP se implementira tako da kada korisnik pozove
JSP stranicu iz JSP stranice se kreira servlet i izvrši.
JSP stranica sadrži tekst (HTML kôd), dijelove Java
koda, akcije i direktive koje server pretvara u
odgovarajući servlet.
Tekst se prebacuje u naredbu PrintWriter za ispis na
standardni izlaz servleta, a Java kôd, akcije i direktive
se prebacuju direktno u servlet.
23
Java Server Pages (JSP)
Znači datoteke sa ekstenzijom .jsp se
kompajliraju u servlet i onda izvode.
Ako je datoteka .jsp novija nego je servlet koji
se trenutno nalazi u memoriji tada se taj
servlet briše, stranica se ponovo kompajlira i
pokreće.
24
12
Java Server Pages (JSP)
Blok servlet koda se umeće između tagova <% %>
Java deklaracija se umeće između tagova <%! %>
Java izraz se umeće između tagova <%= %>, izraz
se računa i pretvara u string koji se prikazuje na
rezultirajućoj stranici
<%! declaration %>
<% scriptlet %>
<%= expression %>
<%! String[] fruits; %>
<% if (fruits != null) {
for (int i = 0; i < fruits.length; i++) {
%>
<body bgcolor=<%= cb.getColor1()%>
25
Java Server Pages (JSP)
Direktiva se odnosi na nekakve globalne
aspekte JSP stranice poput npr. uključivanja
nekog drugog resursa u stranicu.
<%@ directive ...%>
<%@ page language="java" import="cal.*" %>
Osim page direktive postoje još i
<%@ include file="foo.jsp" %>
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
26
13
Java Server Pages (JSP)
tagovi
Akcije se definiraju preko JSP tagova. JSP
tag je sličan HTML tagu.
Može imati početni i krajnji tag. Imena tagova
imaju pridružen znak :, dio prije dvotočke
opisuje tip taga.
Npr.:
<some:tag> body </some:tag>
Postoje predefinirani JSP tagovi određene
funkcionalnosti.
27
Java Server Pages (JSP)
tagovi
Npr. <jsp:getProperty tag dohvaća vrijednosti Bean
svojstva
Sintaksa
<jsp:getProperty name="beanInstanceName"
property="propertyName" />
Primjer
<jsp:useBean id="calendar" scope="page"
class="employee.Calendar" />
<h2>
Calendar of
<jsp:getProperty name="calendar"
property="username" />
</h2>
28
14
Java Beans
Java Beans su Java komponente tj. bean je
samo instanca neke Java klase.
JSP ima tri taga za rada sa Java Beansovima:
<jsp:useBean id=“bean name” class=“bean class”
scope = “page | request | session |application ”/>
<jsp:setProperty name = “id” property =
“someProperty” value = “someValue” />
<jsp:getProperty name = “id” property =
“someProperty” />
29
Java Beans
Atribut scope definira doseg bean-a.
Page scope : objekt postoji samo za vrijeme
generiranje stranice, ovo je defaultni doseg.
Request scope : objekt se kreira u sklopu
promatranog zahtjeva.
Session scope : objekt je vezan uz
promatranu sesiju.
30
15
Java Server Pages 2.x
EL (Unified Expression Language) jezik je dio JSTL
(JavaServer Pages Standard Tag Library ).
EL (Unified Expression Language) jezik je uključen u JSP 2.0
tehnologiju.
Omogućava korištenje jednostavnih izraza za pristup
vanjskim podatkovnim objektima iz stranice.
JSP omogućen server izračunava i rješava izraze kako nailazi
na njih i odmah vraća rezultat, ali su takvi izrazi read-only.
JUEL (Java Unified Expression Language) je implementacija
EL jezika koja je razvijena kao dio JSP 2.1 standarda (JSR245). Sada je (od JSP 2.1) EL API odvojen u zasebni paket
javax.el bez zavisnosti o osnovnim JSP klasama.
31
Java Server Pages 2.x
Tijekom razvoja JSP 2.0 razvijena je i tehnologija JavaServer Faces.
JavaServer Faces tehnologija uključuje proširivi model UI komponenti,
tj. klase koje definiraju UI sučelje prema korisniku, mehanizam obrade
događaja koje generiraju komponente i postupak obade podataka
komponenti.
Također uključuje skup predefiniranih tagova kojima se komponente
definiraju. Ova tehnologija je zahtijevala jezik kojim bi se mogli
generirati događaji na komponenti prema kodu aplikacije na serveru,
povezivati komponente sa objektima na serverskoj strani, …
Nedostatak ove tehnologije je što se EL izraz proračunava odmah
prilikom procesiranja stranice koja sadrži izraz.
Nakon što korisnik unese neku vrijednost u UI komponentu i pošalje
ponovo stranicu na obradu vrijednosti se prenose objektima na
serverskoj strani i obrađuju se događaji koje su generirale komponente.
Da bi se to moglo napraviti JavaServer Faces životni ciklus je podijeljen
na posebne faze za obradu pojedinih zadataka za razliku od klasične
JSP tehnologije koja sve radi odmah.
32
16
EL
EL podržava dva tipa izraza:
Vrijednosni izrazi (Value expressions) referenciraju podatke (u obliku Bean
svojstva ili druge podatkovne strukture ili literalne vrijednosti).
Metode (Method expressions) referenciraju javne metode koje se pozivaju
kada se izraz obrađuje.
Vrijednosni izrazi se dijele na rvalue i lvalue izraze. Izrazi rvalue mogu
čitati podatke, ali ih ne mogu pisati. Izraz lvalue mogu i čitati i pisati
podatke. Izrazi koji se odmah proračunavaju su rvalue izrazi.
${book.quantity}
rvalue izraz
#{book.quantity}
lvalue izraz
Prvi izraz dohvaća vrijednost svojstva quantity book objekta i šalje ga u
generiranoj stranici. Drugi radi to isto u početnom zahtjevu prema
stranici, ali drugi izraz se u sljedećem zahtjevu prema stranici može
koristiti i da postavi vrijednost svojstva quantity book objekta koji se
nalazi na serveru.
33
SSI
SSI (Server-Side Includes) omogućava uključivanje
instrukcija unutar HTML dokumenta na strani servera.
Instrukcije se uključuju pomoću dodatnih HTML tagova.
HTML dokument ima posebnu ekstenziju, .shtml, koja
serveru signalizira da unutra dokumenta postoje SSI
naredbe.
Server onda parsira dokument i izvršava SSI naredbe.
Rezultat izvršavanja SSI naredbi se onda uključuje u taj
dokument i tek onda se dokument isporučuje nazad
klijentu koji ga je zatražio.
34
17
SSI
NCSA (National Center for Supercomputing
Applications) je definirala format SSI naredbi kao
SGML (Standard Generalized Markup Language)
/HTML komentar.
(http://hoohoo.ncsa.uiuc.edu/docs/tutorials/includes.html)
Ako server ne prevede SSI naredbe u HTML kod
prije no što ih isporuči klijentu SSI naredbe se neće
vidjeti u pretraživaču. Format naredbi je:
<!--#command tag1="value1" -->
Skup standardnih SSI naredbi:
config, include, echo, fsize, flastmod, exec
http://www.fesb.hr/~kiki/proba.shtml
35
PHP, ASP
Princip rada sa ASP (Active Server Pages) i PHP
stranicama je nešto drukčiji i od servleta i od CGI.
PHP se može instalirati i da radi kao CGI, ali se
uglavnom instalira kao modul web servera (najčešće
Apache) tako da server sve stranice sa PHP
ekstenzijom prosljeđuje tom modulu koji ih obrađuje
i vraća rezultat izvršavanja.
ASP je napravljen kao dll koji je sastavni web
servera koji obrađuje stranice sa ASP ekstenzijom.
36
18