Java Servlet

**Java Servlet** – Sun Microsystems sukurta technologija, skirta dinaminiam turiniui generuoti. *Java Servlet* programuojamas Java programavimo kalba. Pagrindinė sąvoka šioje technologijoje – servletas. Tai serveryje esantis komponentas, gaunantis iš kliento (pvz., naršyklės) užklausą (angl. request) bei generuojantis atsaką (angl. response).

Servletas gali būti generuojamas automatiškai, pasitelkiant JavaServer Pages technologiją ar kitą šablonų generavimo variklį, tokį kaip WebMacro ar Apache Velocity.

## Web talpykla (container)

### Nekomercinės Web talpyklos
* Apache Geronimo
* GlassFish
* JBoss
* Jakarta Tomcat – populiariausia Web talpykla, užsitarnavusi stabilios reputaciją
* Java System Application Server
* Jetty
* Java Mini Daemon
* Enhydra

### Komercinės Web talpyklos
* Caucho's Resin Server
* BEA WebLogic Server or Weblogic Express
* Borland Enterprise Server
* Oracle Application Server
* IBM's WebSphere
* iPlanet Sun/Netscape
* IronFlare Orion Application Server
* Macromedia JRun

### Servleto naudojimas
Servletas gali būti naudojamas keletu būdu:
* Dviejų lygių architektūra – servletas pats vienas generuoja vartotojui reikalingą puslapį. Šiuo atveju vartotojo naršyklė yra pirmas lygis, o servletas – antras. Ši architektūra pasirenkama, kuomet servleto užduotis yra loginiu požiūriu paprasta.
* Trijų lygių architektūra – servletas darbo metu susisiekia arba su atskirai parašytu ir veikiančiu sprendimus priimančiu moduliu, arba (retais atvejais) ir tiesiai su duomenų baze. Tiesioginis susisiekimas su duomenų baze, nors ir techniškai galimas, paprastai nerekomenduojamas ir atskirai nenagrinėjamas.
* Keturių lygių architektūra – servletas darbo metu susiekia su atskirai parašytu ir veikiančiu sprendimus priimančiu moduliu. Susiekiama dažniausiai per CORBA ar RMI protokolus. Šis modulis savo ruožtu susiekia su viena ar keliomis duomenų bazėmis (per JDBC).

### Servleto gyvavimo ciklas
Servletas gali būti vienoje iš šių būsenų:
* Inicializuojamas: šiuo metu arba vykdomas servleto konstruktoriaus kodas, arba init() metodas. Servletą kuria konteineris, naudodamas konstruktorių be parametrų. Sukūrus servletą, vykdomas init() metodas. Viso servleto gyvavimo metu šis init() iškviečiamas tiktai vieną kartą.
* Veikia (inicializuotas): vykdomas servleto metodas service(). Būtent šioje būsenoje servletas gali apdoroti kliento užklausas bei generuoti atsakus. Kiekvieną atsaką apdoroja atskira gija.
* Sunaikintas: šiuo metu vykdomas metodas destroy(). Jis yra iškviečiamas vieną kartą ir yra skirtas atlikti veiksmams, kurių gali prireikti prieš sunaikinant servleto objektą (pvz., uždaryti prisijungimus prie duomenų bazės).
* Neegzistuoja: servleto objektas nesukurtas arba sunaikintas.

### Servleto kūrimas

#### Paprasčiausio servleto pavyzdys
Programuotojas, kurdamas paprasčiausią servletą, gali paveldėti *javax.servlet.http. HttpServlet* klasę ir perrašyti tam tikrus jos metodus. Dažniausiai užtenka perrašyti *doGet* ir *doPost* metodus, taip pat *init* pradiniams duomenims pakrauti.

* *init* metodą iškviečia servleto talpykla iškart po servleto sukūrimo.
* *doGet(HttpServletRequest request, HttpServletResponse response)* vykdo HTTP GET užklausą (HTTP Get request)
* *doPost(HttpServletRequest request, HttpServletResponse response)* vykdo HTTP POST užklausą (HTTP Post request)
Be *doGet()* ir *doPost()* metodų, HttpServlet klasė turi atitinkamus metodus ir kitoms HTTP užklausoms (visoms, išskyrus HTTP CONNECT):
* *doTrace()* vykdo HTTP TRACE užklausą
* *doOptions()* vykdo HTTP OPTIONS užklausą
* *doHead()* vykdo HTTP HEAD užklausą
* *doPut()* vykdo HTTP PUT užklausą
* *doDelete()* vykdo HTTP DELETE užklausą

*doGet()* ir *doPost()* metodai perduoda HTML formoje vartotojo įvestus duomenis.
Skirtumas tarp HTTP GET ir POST metodų yra tas, kad pirmuoju metodu visa informacija apie norimą resursą perduodama interneto adresu.

HTML formos aprašymo pavyzdys:

 
     
     
 

Tai pavyzdys paprasčiausios formos su laukeliu įvesti tekstui ir patvirtinimo mygtuku.
Parametras *action* lemia, koks servletas konteineryje apdoros užklausą.

Servleto metodai *doGet()* ir *doPost()* perduoda du parametrus: *HttpServletRequest* ir *HttpServletResponse*. **HttpServletRequest**, be kitų duomenų, saugomos perduotų parametrų (pvz., iš html formos arba nuorodos) reikšmės.

 String klausimas = request.getParameter(„klausimas“); // request - HttpServletRequest tipo objektas

Čia jau programuotojas pats turi nuspręsti, ką daryti su gautu tekstu. Jis gali sugeneruoti naują puslapį ir nusiųsti vartotojui:

 PrintWriter out = response.getWriter();
 out.println(„Jūsų įvestas klausimas buvo: “ + klausimas);

Svarbu prisiminti, kad puslapis automatiškai baigiamas generuoti tada, kai baigiamas vykdyti *doGet()* arba *doPost()* metodas.

Realiai HTML puslapiai (kaip parodyta pavyzdyje) servleto kode negeneruojami, juose dažniausiai realizuojama verslo logika, o prezentacijai dažniausiai naudojami JSP puslapiai.

## Programavimo priemonės
Kai kurios Java programavimo aplinkų turi priemones servletų kūrimo automatizavimui:
* Borland JBuilder 

## Nuorodos
* Technologijos specifikacija
* Servletų klasių hierarchija