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
© Copyright 2024 Paperzz