# JavaServer Pages

JavaServer Pages (JSP) is een onderdeel van de J2EE-standaard. JSP is een manier om dynamisch HTML, XML of andere inhoud te genereren op basis van statische en dynamische elementen. Dit wordt gedaan door Java-code en bepaalde voorgedefinieerde acties op te nemen in de statische inhoud.
Bij het gebruiken van JSP worden aan de statische inhoud XML-tags toegevoegd: JSP-actions. Deze tags kunnen worden gebundeld in een JSP tag library, een verzameling van acties die gebruikt kunnen worden om een webserver van extra functionaliteit te voorzien.
Als een JSP-pagina wordt aangeroepen wordt deze door een JSP-compiler omgezet in een servlet. In feite is een JSP-pagina een spiegelbeeld van een servlet: een servlet is Java-code met eventuele statische inhoud, een JSP-pagina is statische inhoud met Java-code.

## JSP-syntaxis

Een JSP-pagina valt uiteen in de volgende samenstellende delen, waarvan de meeste optioneel zijn.
* statische inhoud, bijvoorbeeld HTML
* JSP-directieven zoals een include
* JSP-scriptelementen en variabelen
* JSP-actions
* custom tags

### Statische inhoud

Statische inhoud wordt rechtstreeks in de HTTP-response geschreven. Een geldige JSP-pagina kan uit alleen HTML bestaan. In dat geval zou de response bij elke aanroep van deze JSP-pagina precies hetzelfde zijn. JSP is echter bedoeld om dynamische elementen toe te voegen aan statische inhoud.

### JSP-directieven

JSP-directieven bepalen hoe een JSP pagina door de JSP compiler tot een servlet wordt omgezet
* include – instrueert de JSP-compiler om een volledige file in te voegen in huidige file. Deze functionaliteit is vergelijkbaar met die van de C-preprocessor.
* page - Dit directief kent een aantal opties
** import: resulteert in een Java-importstatement in het resultaat van de JSP-compiler
** contentType: geeft aan wat het MIME-type van het resultaat van de aanroep van deze pagina is.
** errorPage: geeft aan welke pagina getoond moet worden als er een fout optreedt
** isErrorPage: geeft aan of deze JSP-pagina een foutpagina is
** isThreadSafe: geeft aan dat deze JSP-pagina thread safe is
* taglib - Geeft aan dat er een JSP-taglibrary gebruikt wordt. Hierbij moet een prefix (vergelijkbaar met een XML-namespace) en een URI naar de beschrijving van de taglib worden opgegeven.

### JSP-scriptelementen en variabelen

JSP kent een aantal standaardvariabelen die altijd beschikbaar zijn:
* out: De JSPWriter die gebruikt wordt om het resultaat van de uitvoering van de JSP-pagina in weg te schrijven.
* page: De servlet zelf.
* pageContext: Een object dat data bevat die geldt voor de gehele pagina. Deze kan worden gebruikt door meerdere JSP-pagina's.
* request: Het HTTP-requestobject. Dit is een Java-object dat de inhoud van de oorspronkelijke HTTP-request bevat.
* response: Het HTTP-responseobject. Dit is een Java-object dat het antwoord van de webserver op een HTTP-request bevat.
* session: Een object dat informatie bij kan houden tussen de verschillende requests van één bepaalde client. Hiermee kan het stateless zijn van HTTP enigszins worden opgevangen.
Verder zijn er standaard scriptelementen:
* Er is een element dat een variabele in de servletclass plaatst:
* Er is een element dat in de _jspService-methode van de servlet wordt opgenomen:
* Er is een element dat ervoor zorgt dat de code in het element op die plaats wordt ingevoegd en direct wordt uitgevoerd:

### JSP-actions

Dit zijn XML-tags die standaard webserver functionaliteit aanroepen.
* jsp:include Vergelijkbaar met een subroutine: de genoemde JSP-pagina wordt aangeroepen en het resultaat van deze aanroep wordt ingevoegd in het resultaat van de huidige JSP-pagina.
* jsp:param Kan worden gebruikt binnen een jsp:include-, jsp:forward- of jsp:params-blok. Deze action zorgt voor het toevoegen van een parameter aan het HTTP-requestobject.
* jsp:forward Roept de benoemde JSP-pagina aan, zonder terug te keren naar de huidige JSP-pagina.
* jsp:plugin Oudere versies van Internet Explorer en Netscape Navigator gebruikten verschillende tags om een applet aan te geven. Deze action genereert de juiste browserspecifieke tag.
* jsp:fallback Geeft aan welke inhoud getoond moet worden als de browser geen applets ondersteunt.
* jsp:getProperty Geeft de waarde van een property van de genoemde Java-bean
* jsp:setProperty Zet de waarde van een property van de genoemde Java-bean
* jsp:useBean Maakt of hergebruikt een Java-bean voor de JSP-pagina
Voorbeelden van actions:
Dit roept de JSP-pagina gemeenschappelijk.jsp aan, met een parameter met de naam extraParameter en waarde eenWaarde. Het resultaat van de aanroep wordt ingevoegd in het resultaat van de JSP-pagina waar deze code in staat.
Geeft de request door naar subpagina.jsp, weer met een extra parameter. De verdere inhoud van de HTTP-response wordt nu door subpagina.jsp bepaald, deze.jsp wordt niet meer aangeroepen nadat subpagina.jsp uitgevoerd is.
Dit maakt met behulp van een BeanManager een instantie van com.foo.MyBean aan en maakt deze beschikbaar onder de naam myBean. Het scope attribuut geeft aan dat deze bean beschikbaar is tijdens het afhandelen van de request, dat wil zeggen dat deze bean ook kan worden gebruikt in JSP-pagina's die worden aangeroepen via een jsp:include of een jsp:forward vanuit de huidige JSP-pagina. Verder wordt een property van de bean uitgevraagd en van waarde veranderd.
Het scope-attribuut kan een aantal waarden hebben:
* request De bean is beschikbaar zolang de request wordt afgehandeld
* page De bean is alleen beschikbaar voor de huidige pagina
* session De bean is beschikbaar tijdens de levensduur van de clientsessie
* application De bean is beschikbaar tijdens de levensduur van de applicatie. Dit is te vergelijken met een globale variabele.