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.   

vinvalgDu 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.

vinvalgEventuelle 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

mvcNå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:

  1. TiniHttpServerOpprettet java prosjektet TiniHttpServer i eclipse med standard instillinger
  2. Pakket ut TiniHttpServer10.zip til en midlertidig mappe og importerte (File System) alle filene til TiniHttpServer prosjektet
  3. 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'?
  4. 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...)
  5. Opprettet klassene (og pakkene) no.tip.tini.web.VinValg og no.tip.tini.model.VinEksperten. Skrev programkoden for servlet'en og modellen.
  6. 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.
  7. Gjorde følgende endringer i build.properties:
    tini.dir=C:/tini1.17
    servlet.jar=lib/servlet.jar
    tini.host=192.168.1.10
  8. 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...
     
  9. 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
  10. La til følgende i deploy.bat:
    echo put tini/docs/vintips.html /docs/vintips.html >> deploy.cmd

vintipsVi 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)

vintipsNå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.