Http server Brauseriga lehekülgede vaatamisel võtab brauser ühenduse soovitud serveri vastavasse väratisse ning palub seda kuulaval programmil saata omale vastav lehekülg. Lihtsamal juhul programm loeb kettal määratud nimega faili ning saadab sellest koopia mööda moodustatud ühendust brauseri poole tulema ning katkestab ühenduse. Brauser loeb saabuvat teksti ning vastavalt sellele manab kujutise ekraanile. Juhul, kui näiteks saabuvas HTML failis on kirjas, et tuleb teksti sisse pilti näidata, siis avab brauser ühenduse serveriga, kus pilt paikneb, palub sellegi omale saata ning näitab seejärel pilti omale sobivas kohas. CGI programmid Brauserisse andmete saatmiseks ei pruugi neid tingimata failist kopeerida. Saadetavad andmed võib ka serveris paiknev programm kokku panna. Sel juhul saab igale kasutajale luua temale vastava lehekülje. Nii näiteks töötab külastuskordade lugeja: igal korral saadetakse kasutajale ühe võrra suurem number. Selliseid serveris brauseri väljakutse peale tööle hakkavaid programme nimetatakse CGI (ehk Common Gateway Interface) programmideks. Juhul kui URLile vastav fail on serveri sisemiste määrangute (näiteks faililaiendi) järgi määratud CGI programmifailiks, siis käivitab http väratit kuulav ning andmeid brauserile saatev rakendus URLile vastava programmi. Kasutaja ei pruugi teadagi, kas veebilehitsejasse saabuv tekst kopeeritakse failist või loob selle programm. Sageli siiski reedab URLis sisalduv faili või kataloogi nimi, et tegemist on tõenäoliselt CGI-programmiga. Sellele viitab enamasti kataloogi nimi CGI-BIN või skriptiprogrammi tähistav faililaiend (.sh shelli programmidel, .pl Perl, .c C keelse programmifaili laiendiks), kuid CGI abil saab käivitada ka programmi, mille nimi kasutajale kuidagi teada ei anna, et tegemist programmiga oleks. CGI programmi abil on võimalik luua kasutajale leht vastavalt parasjagu kehtivatele andmetele, lugedes need siis näiteks failist või pöördudes selleks andmebaasi poole. Juhul, kui andmed muutuvad sageli ning andmepäringuid on vähe, siis on mõistlik andmete põhjal igale kasutajale uus lehekülg kokku panna. Kui aga andmeid muudetakse tulemuste küsimisest harvemini ning erinevaid päringuid on vaid paar tükki, siis tuleks andmete muutumisel luua uued infolehed, mis siis küsimisel brauseri poole teele saadetakse. CGI protokolli abil on võimalik andmeid vahetada mõlemas suunas. Nii kasutajalt serverisse kui tagasi. Tüüpiline otsingumootor saab kasutajalt märksõnad ning väljastab nende põhjal vastustelehe. Samuti saab säärase võimaluse abil lisada oma andmeid serveris asuvasse nimistusse, pidada külalisraamatut ning tellida kataloogist kaupu. CGI programmide üldkasutatavasse serverisse ülespanekuks on enamasti tarvis süsteemihalduri luba, sest vigase programmi või näiteks vörgust kopeeritud külalisraamatu ülespanek võib serverisse luua turvaaugu. Kui väljast tuleval häkkeril õnnestub leida CGI-programmist ettenägemata juurdepääsu lubav viga, siis saab selle kaudu serverile kurja teha või salajasi andmeid lugeda ja muuta. Üks oluallikas tekib näiteks, kui lubada kasutajal määrata lugemise-kirjutamise faili nime. Kui on võimalik määrata failiks ülemkataloogi fail, siis on võõral sisuliselt juurdepääs tervesse serverarvutisse. Kui kasutada kellegi teise pool varem kirjutatud ning üles riputatud programmi, siis võib juhtuda, et sinna on lisaks tarvilikule juurde lisatud masinasse sisse murdmist võimaldav koodilõik. Andmete vahetamiseks pakub CGI-le sarnaseid võimalusi veebilehel olev rakend. Ka seal saab andmeid väljadesse paigutada, töödelda, serverisse saata ning sealt lugeda. Rakenditel on võimalusi enam, kuid mitmed eelised räägivad (vähemalt esialgu) CGI-programmide kasuks. CGI puhul on arvutustöö jäetud serveri hooleks, brauseril tuleb vaid saabuvat teksti näidata ning andmed serverisse saata. Kui andmeid edastada rakendi ning serveri väratit kuulava programmi abil, siis peab lehitsejas tööle hakkama rakendikäitur, mis nõuab mõnevõrra enam ressursse. Mõnes (näiteks tekstipõhises või Windows 3.1 all töötavas) lehitsejas rakendikäiturit polegi, kuid vormide täitmise ning CGI-programmi jooksutavasse serverisse saatmisega saavad nad ilusti hakkama. Servlet Java rajajad lõid brauseri kasutajaga andmevahetuseks uue võimaluse. Kui CGI-ks kasutati java-programmi, siis tuli igal kasutamisel java-intepretaator uuesti käivitada. Lisaks sellele püüti lahendada turvaprobleeme. Servleti käivitamiseks töötab serveris pidevalt java intepretaator. Kui brauser soovib servleti hallatavat URLi lugeda, siis käivitab intepretaator vastava servleti eraldi lõimena. Kuna intepretaatorit pole vaja uuesti käivitada, siis hoitakse käivitamisel aega kokku. Servleti käivitumine võtab ligikaudu kolm korda vähem aega kui CGI programmi oma. Turvanõuete tõttu ei saa servlet otse serveri faile lugeda ega kirjutada. Vajadusel tuleb andmeid vahetada pistiku kaudu või selle juurde ehitatud andmebaasiühendust kasutades. Lühike näide Järgnev näide peaks olema võimalikult lihtne servlet. Veebiservlet luuakse HttpServleti alamklassina. Meetodid, mida soovitakse muuta, tuleb üle katta. Tähtsamad meetodid on doGet ja doPost. Sisult on nad sarnased, kuid nad käivitatakse vastavalt selle, kumma tüübi abil servlet välja kutsutakse. Kui servlet käivitatakse get abil, siis saadetakse andmed URL küljes, pärast küsimärki. Post meetodi puhul saadetakse andmed eraldi voona. Get-võimalust kasutatakse enamasti lihtsate ja lühikeste andmete saatmiseks, post-meetodi abil kantakse üle pikemaid tekste ning vähemtähtsaid salasõnu. Tähtsamad salasõnad tuleb muul moel kodeerida. Meetod doGet saab saab kaks parameetrit: esimene kannab andmeid väljakutsuja kohta. Tema kaudu saab teada, millisest masinast ning milliselt leheküljelt servlet välja kutsutakse, samuti tulevad sealt kaudu ka kasutaja poolt saadetavad andmed. HttpServletResponse abil saadetakse brauserile vastus tagasi. Vastuslehekülje loomisel tuleb määrata ta formaat (näiteks text/html või text/plain). Vastuselt saab küsida Writeri ning selle abil temasse tekst kirjutada. import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Servlet1 extends HttpServlet{ public void doGet(HttpServletRequest kysimus, HttpServletResponse vastus) throws IOException, ServletException{ vastus.setContentType("text/html"); PrintWriter valja=new PrintWriter(vastus.getWriter()); valja.println( "\n"+ "

Tervist!

\n"+ "" ); } } QueryString HttpServletRequesti meetod getQueryString annab URLi küsimärgile järgneva osa. Näiteks http://www.ee/kass.html?nurr puhul on QueryStringiks nurr. Juhul kui servletti välja kutsuval lehel on vorm ning väljad, siis laotakse väljade nimed ning nende väärtused üksteise otsa ja paigutatakse QueryStringi. Eri väljade andmed eraldatakse teineteisest & märgiga, välja nimi ning väärtus = märgiga. Alljärgneva näite puhul võib see välja näha näiteks: eesnimi=Peeter&perenimi=Tamm. Servlet saab vajaduse korral saabunud sõne jälle osadeks jaotada. import javax.servlet.*; import javax.servlet.http.*; import java.util.StringTokenizer; import java.io.*; public class ServletGet1 extends HttpServlet{ public void doGet(HttpServletRequest kysimus, HttpServletResponse vastus) throws IOException, ServletException{ vastus.setContentType("text/html"); PrintWriter valja=new PrintWriter(vastus.getWriter()); valja.println( "Edastati info: "+kysimus.getQueryString()+"
\n"+ "Ühendus tuli masinast "+kysimus.getRemoteHost()+"
\n"+ "Selle masina number on "+kysimus.getRemoteAddr()+"

\n" ); StringTokenizer stk=new StringTokenizer(kysimus.getQueryString(), "&"); while(stk.hasMoreTokens()){ valja.println(stk.nextToken()+"
\n"); } } }

Eesnimi:
Perekonnanimi:
Post Kui andmeid saadetakse post-protokolli abil, siis jõuavad nad kohale eraldi voona. HttpServletRequestilt saab küsida selle voo ning sealt andmeid lugema hakata. Samas on siia loodud ka automaatsed vahendid parameetrite väärtuste leidmiseks, et programmeerija ei peaks oma pead vaevama pika sõne osadeks jagamise, kodeeritud tähtede lahtiharutamise ning vajalike parameetrite väärtuste üles leidmisega. Kui meetodi getParameter parameetriks anda välja nimi, siis tulemusena väljastatakse selle välja väärtus. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletPost1 extends HttpServlet{ public void doPost(HttpServletRequest kysimus, HttpServletResponse vastus)throws IOException, ServletException{ String eesnimi=kysimus.getParameter("eesnimi"); String perenimi=kysimus.getParameter("perenimi"); vastus.setContentType("text/plain"); PrintWriter valja=vastus.getWriter(); valja.println(eesnimi+" "+perenimi); } }
Eesnimi:
Perekonnanimi:
Andmete loetelu Nii väljade väärtused kui väljakutsujat iseloomustavad suurused on võimalik kätte saada üheskoos. HtteServletRequesti getParameterNames() annab väljade nimed Enumerationi ehk jadana. Samuti annab getHeaderNames() väljakutsuja tunnuste loetelu. Nime järgi saab küsida tunnuse väärtuse. Kui soovida, et servlet oskaks nii get- kui post-protokollis andmeid saata, siis võib ühte servletti kirjutada mõlemad meetodid. Kui soovitakse, et nad käituksid sarnaselt, siis võib üks meetod lihtsalt teise välja kutsuda. import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.Enumeration; public class ServletPost2 extends HttpServlet{ public void doPost(HttpServletRequest kysimus, HttpServletResponse vastus)throws IOException, ServletException{ vastus.setContentType("text/plain"); PrintWriter valja=vastus.getWriter(); Enumeration parameetrid=kysimus.getParameterNames(); while(parameetrid.hasMoreElements()){ String parameetriNimi=(String)parameetrid.nextElement(); valja.println(parameetriNimi+" = "+kysimus.getParameter(parameetriNimi)+"\n"); } valja.println(); Enumeration teated=kysimus.getHeaderNames(); while(teated.hasMoreElements()){ String teateNimi=(String)teated.nextElement(); valja.println(teateNimi+" - "+kysimus.getHeader(teateNimi)+"\n"); } } public void doGet(HttpServletRequest kysimus, HttpServletResponse vastus)throws IOException, ServletException{ doPost(kysimus, vastus); } }
kasutajanimi:
parool:
Kokkuvõte Html vormingus saab tekstimärkide abil edasi anda kujundatud teksti. Teksti saab luua tabeli, loetelu, lisada pilte, rakendeid, muusikat, videosid. Plug-in'ide abil saab HTML dokumendist kasutada ka muid tüüpe faile (näiteks Maple matemaatikavalemeid). Javaskripti programme saab kirjutada HTMLi sisse. Javaskript võimaldab lugeda väljadelt andmeid ning muuta neid. Avada ja sulgeda aknaid, määrata lehekülgede ning piltide sisu. Javaskripti süntaks on püütud java keele sarnaseks teha, kuid sisuliselt on ta intepreteeritav, java kompileeritav keel. Lihtsas veebiserveris vaid kopeeritakse brauseri väljakutse peale kasutajale faile, kuid CGI programmide või servlettide abil saab luua igale kasutajale eraldi tema jaoks sobiva lehekülje.