TINI Servlets og MVC Design Pattern
Disse sidene er en del av dokumentasjonen som Ola Lie utarbeidet da han foreleste faget IP- og webteknologi ved Høgskolen i Østfold i 2005.Websidene ble revidert i 2007.
Servlets
Med Java Servlet API kan du utvikle dynamisk websider for webtjenere som bruker Java plattformen. Innholdet som genereres er vanligvis HTML, men det behøver ikke å være det. Servlets (Se Java Servlet Technology i The Java EE 5 Tutorial) er Javas motstykke til teknologier som eksempelvis CGI og ASP.NET (se DHTML - Skript på Webtjeneren).
Servlet'ene har ingen main metode, men blir kontrollert av en annen java applikasjon som heter Container. Container applikasjonen gjør det er lett for servlet'ene å snakke med webtjeneren, og du trenger ikke å tenke på ServerSocket, porter, strømmer, osv. Container'en styrer også servlet'enes livssyklus og oppretter en ny tråd for hver forespørsel som kommer til en servlet. Du slipper dermed å programmere kode for trådhåndtering, sikkerhet og datakommunikasjon, og kan fokusere på hovedfunksjonen til programmet.
Du
lager en servlet ved å definerere
javaprogrammet som en subklasse av
HttpServlet (class Vinvalg extends
HttpServlet). Deretter må du skrive metodene doPost eller
doGet avhengig av om du skal svare på HTTP POST eller
HTTP GET forespørsler.
Eventuelle
input data får du fra
HTTPServerRequest objektet og websiden skriver du til
HttpServletResponse objektet. Resten tar webtjeneren
seg av så lenge du har laget en Deployment Decriptor
(web.xml fil) som forteller webtjeneren hvilke forespørsler som skal kobles til
hvilke servlets.
Smart Software Consulting har utviklet webtjeneren TiniHttpServer, som du kan bruke til å lære deg å bruke servlets med TINI. (Du kan også prøve ut servlets på PCen ved å installere Apache Tomcat.)
MVC Design Pattern
Når
vi programmerer, bruker vi ofte standardiserte mønstre (se
Design Patterns) eller
oppskrifter. MVC (Modell
– View – Controller) er et velkjent mønster eller arkitektur som skiller modellen
(logikken) fra utsynet (det du viser på skjermen) slik at endringer i
brukergrensesnittet (utsynet) ikke påvirker datahåndteringen (modellen) og
omvendt. Modellen står på egne bein og kan gjenbrukes i andre sammenhenger.
TiniHttpServer støtter imidlertid ikke JSP (JavaServer Pages), så i VinEksperten eksempelet produserer vi HTML koden i kontrollen.
Vineksperten
I dette eksempelet bruker vi Smart Software Consulting sin gratis TiniHttpServer som vi har importert i et eclipse prosjekt hvor vi har laget vår egen servlet. Vi har pakket alt sammen i VinEksperten.zip som du kan pakke ut og importere i eclipse (etter at du har opprettet et nytt java prosjekt kalt TiniHttpServer). Du setter det hele i gang ved å høyreklikke på build.xml og velge Run As Ant Build. Etter at programmet er automatisk kompilert, konvertert og overført til Tini, kan du koble deg til Tini med Telnet, gå til mappen bin (cd bin↵) og starte webtjeneren (source TiniHttpServer↵).
Her er hva vi gjorde:
Opprettet java prosjektet TiniHttpServer i eclipse med standard instillinger
- Pakket ut TiniHttpServer10.zip til en midlertidig mappe og importerte (File System) alle filene til TiniHttpServer prosjektet
- Opprettet en ny Source Folder kalt src og svarte Yes til spørsmålet Do you want ot remove all generated resources from the old location' /TiniHttpServer'?
- Lastet ned jakarta-tomcat-3.3.2.zip fra Apache Tomcat og ekstraherte filen servlet.jar til en midlertidig mappe. Opprettet mappen lib under TiniHttpServer prosjektet og importerte servlet.jar til lib og refererte til denne i Project → Properties → Java Build Path → Libraries → Add Jars... (og til C:\tini1.17\bin\owapi_dependencies_TINI.jar med ...Add External Jars...)
- Opprettet klassene (og pakkene) no.tip.tini.web.VinValg og no.tip.tini.model.VinEksperten. Skrev programkoden for servlet'en og modellen.
- Lagret vintips.html i mappen tini\docs. vintips.html er en statisk hjemmeside som sender en HTTP POST forespørsel (med parameteren land) til webtjeneren. URL'en er /vin og denne blir koblet med servlet'en i filen tini/etc/servlets.props. Erstattet samtidig favicon.ico med vår egen favicon.ico.
- Gjorde følgende endringer i build.properties:
tini.dir=C:/tini1.17
servlet.jar=lib/servlet.jar
tini.host=192.168.1.10 - Gjorde følgende endringer i build.xml:
<available property="tiniant.ok"
classpath="C:/tiniant-1_2_0/lib/TiniAnt.jar"
classname="net.geeba.ant.Tini" />
<taskdef name="tini" classpath="C:/tiniant-1_2_0/lib/TiniAnt.jar"
classname="net.geeba.ant.Tini" />
Fjernet includes="... og la til source="1.3" i <javac...
- La til følgende i tini/etc/servlets.props (som
brukes i stedet for web.xml):
vintips.mapping=/vin
vintips.code=no.tip.tini.web.VinValg
vintips.preload=true - La til følgende i deploy.bat:
echo put tini/docs/vintips.html /docs/vintips.html >> deploy.cmd
Vi
valgte å importere den eldre og påkrevde versjonen av servlet.jar slik at
vi har
den lagret sammen med programmet. Videre har vi beholdt hjemmesiden (index.html)
og eksemplene som fulgte med TiniHttpServer og nås med url
http://192.168.1.10. Sjekk om
TIPs TiniHttpServer fremdeles er i drift. Vår egen statiske webside nås med url
http://192.168.1.10/vintips.html. Webtjeneren har en innebygget
standard servlet som tar seg av forespørsler etter filer (ikke- servlets).
Vi har også valgt å vise hvordan vi kan sende statiske websider fra en servlet i doGet metoden som nås med url http://192.168.1.10/vin. (Sjekk http://tini.dyndns.org/vin)
Når
du klikker på Send, sendes HTTP POST forespørselen også til
http://192.168.1.10/vin. Den har med seg parameteren
land=... til doPost
metoden som sender tilbake en dynamisk webside.