# Miniaplicació de servidor

Les miniaplicacions de servidor (anglès servlets) són objectes Java executats per un servidor d'aplicacions i que responen a invocacions HTTP, servint pàgines dinàmiques.
El contingut generat pot ser un fitxer de qualsevol tipus, la majoria de vegades HTML.
Un objecte Servlet és capaç de rebre una invocació i generar una resposta en funció de les dades de la invocació, de l'estat del mateix sistema i les dades a què pugui accedir. El paquet bàsic de servlet defineix objectes Java que maneguen peticions i respostes fetes per servlets, així com objectes que informen dels paràmetres de configuració del servlet i l'entorn d'execució. El paquet javax.servlet.http defineix subclasses específiques HTTP dels elements genèrics del servlet, com ara objectes de gestió de sessions que lliguen múltiples peticions del mateix client i respostes del servidor d'aplicacions. Els servlets poden estar empaquetats dintre d'un fitxer de format WAR, com a aplicació Web, dintre d'un contenidor.
L'execució d'un servlet es fa dintre d'un o més processos del servidor d'aplicacions, de manera que es genera un nou flux. No generar un nou procés (com acostumen a fer els CGIs) implica un estalvi de recursos que es tradueix en un millor rendiment del sistema.
Els servlets poden ser objectes java precompilats o JSP compilats en temps d'execució (o en un altre moment després de l'arrencada del servidor d'aplicacions).

## Història

Sun Microsystems va escriure la primera especificació dels servlets. Va finalitzar la versió 1.0 el juny de 1997. A partir de la versió 2.3, l'especificació dels servlets va ser desenvolupada subjecta al Java Community Process. JSR 53 va definir tant la Servlet 2.3 i JavaServer Page 1.2. JSR 154 especifica les especificacions Servlet 2.4 i 2.5, aquesta darrera vigent des del 10 de maig del 2005.
història de l'API de Servlet :
| versió de l'API de Servlet | Llençat | Plataforma | Canvis importants |
| Servlet 2.5 | Setembre 2005 Arxivat 2008-06-09 a Wayback Machine. | JavaEE 5, J2SE 5.0 | Requereix J2SE 5.0, suporta Anotacions |
| Servlet 2.4 | Novembre 2003 Arxivat 2008-06-09 a Wayback Machine. | J2EE 1.4, J2SE 1.3 | web.xml usa XML Schema |
| Servlet 2.3 | Agost 2001 Arxivat 2008-05-16 a Wayback Machine. | J2EE 1.3, J2SE 1.2 | Addició de Filtres |
| Servlet 2.2 | Agost 1999 Arxivat 2008-06-11 a Wayback Machine. | J2EE 1.2, J2SE 1.2 | Inclòs com a part de J2EE, introduint aplicacions web independents dintre de fitxers .war |
| Servlet 2.1 | Novembre 1998 Arxivat 2008-06-11 a Wayback Machine. | No especificada | Primera especificació oficial, afegides RequestDispatcher i ServletContext |
| Servlet 2.0 | | JDK 1.1 | Part del Java Servlet Development Kit 2.0 |
| Servlet 1.0 | Juny 1997 | | |

## Cicle de vida d'un Servlet

Consisteix en les passes següents:
* La instància de Servlet és carregada en temps d'arrencada del contenidor
* El contenidor crida el mètode init, en temps d'arrencada, o quan rep la notificació de la primera invocació. Aquí és on s'inicialitza el servlet i ha de ser executat abans que se serveixi cap petició. Aquest mètode no torna a ser executat en tota l'execució del contenidor.
* Després de la inicialització el servlet pot començar a servir invocacions de clients, cadascuna servida pel seu propi fil d'execució (Thread). Per cada invocació s'executa el mètode service
* Finalment, en temps d'aturada del contenidor, aquest invoca el mètode destroy

### ServletConfig i ServletContext

En un contenidor hi ha una sola instància de ServletContext. Aquest objecte pot ser usat per qualsevol instància de Servlet informació a nivell de l'aplicació o detalls sobre el contenidor. Cada servlet, per altra banda, obté la seva pròpia instància de ServletConfig. Aquest objecte proveeix paràmetres d'inicialització per un servlet. Un desenvolupador pot obtenir la referència a ServletContext usant qualsevol d'aquests dos objectes.

## Contenidors de Servlet

Un contenidor de Servlet és un servidor web especialitzat que suporta l'execució de classes Servlet. Combina la funcionalitat bàsica d'un servidor web amb optimitzacions i extensions específiques de Java i de Servlet, com la integració amb l'entorn d'execució Java i la capacitat de traduir específicament URLs en peticions de Servlet. Els servlets són registrats pels contenidors de servlets, que es nodreixen de la informació sobre les funcionalitats que aquests proveeixen i quin URL usaran per a identificar-se ells mateixos. A partir d'aquest moment, el contenidor és capaç d'inicialitzar el Servlet i respondre a invocacions conforme van arribant. Molts contenidors tenen la capacitat d'afegir i treure servlets de forma dinàmica, avantatge que permet que afegir, modificar o treure servlets no afecti la resta de servlets. Els contenidors de Servlet també poden ser anomenats contenidors web o motors web.
Com en altres APIs de Java, diferents companyies proveïdores posen a disposició la seva pròpia implementació de contenidor Servlet estàndard. A sota hi ha una llista de contenidors web, tant lliures com comercials. En aquests casos 'lliure' es refereix a què poden ser usats de franc fins i tot amb finalitats lucratives. Alguns de comercials, com ara Resin o Orion, poden ser usats per organitzacions sense ànim de lucre.

### Contenidors web no comercials

* Apache Tomcat (antigament Jakarta Tomcat) és un contenidor web de codi obert gratuït sota la Llicència Apache. És usat a la implementació de referència oficial i té fama de ser estable.
* Geronimo Application Server és una implementació plenament J2EE, feta per Apache.
* Jetty
* Jaminid conté una abstracció superior a la dels servlets
* Enhydra
* Winstone suporta l'especificació v2.4, està orientat a la mínima configuració i disposa de la capacitat de buidar el contenidor fins només allí on cal.
* tjws espec 2.4, de poca càrrega al sistema, disseny modular

### Contenidors web comercials

* Java System Application Server
* Java System Web Server
* Caucho's Resin Server
* BEA WebLogic Server o Weblogic Express
* Borland Enterprise Server
* Oracle Servidor d'aplicacions
* WebSphere d'IBM
* JRun de Macromedia
* IronFlare Orion Servidor d'aplicacions
* WebObjects

### Contenidors web de codi obert comercials

* JBoss
* GlassFish
* LiteWebServer

## Vegeu també

* JavaServer Pages
* Java EE

## Enllaços externs

* Descripció del producte, feta per Sun
* Tutorial de Sun sobre servlets
* JSR 154 (Servlet 2.4 i 2.5)
* JSR 53 (Servlet 2.3)
* Documentació Java de l'API Servlet 2.3