JavaServer Pages

**JavaServer Pages** – technologija, leidžianti dinamiškai generuoti HTML, XML, ar kito tipo puslapius. Ši technologija suteikia galimybę į statinį puslapį įterpti Java kodą ir kitą dinaminį turinį.

JSP puslapyje kaitaliojasi įprastine HTML kalba parašyti fragmentai bei java kalba parašytos sekcijos. J2EE serveris vykdo puslapyje esantį java kodą kuris iš anksto specialia JSP direktyva deklaruotiems kintamiesiems priskiria reikiamas reikšmes. Kita JSP direktyva šias reikšmes galima reikiamoje vietoje įterpti į dokumentą.

Gerai parašytoje sistemoje JSP puslapio kodas atsakingas tik už paties dokumento generavimą. Sąveika su duomenų bazėmis, sudėtingesni skaičiavimo algoritmai, sprendimų priėmimas bei kiti panašūs algoritmai turi būti koduojami aukštesniame, EJB lygyje (JSP puslapis turi kviesti EJB modulius).

## Paprastas pavyzdys

```
&lt;html&gt;
  &lt;body&gt;
&lt;%!String intarpas; %&gt;
    &lt;p&gt;Cia paprastas HTML tekstas&lt;/p&gt;
&lt;%
  // O čia java kodas:
  int s = 0;
  for (int i = 1; i &lt; 10; i++)
    s += i;
  intarpas = "Skaiciu nuo vieno iki devyniu suma: "+s;
%&gt; 
&lt;/pre&gt;
&lt;p&gt;Java kodo rezultatas:&lt;/p&gt;
&lt;b&gt;&lt;i&gt;&lt;u&gt; &lt;%= intarpas %&gt;&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;
  &lt;/body&gt;
&lt;/html&gt;
```


Puslapis naršykėje atrodys taip (tikrinta su JOnAS):

Čia paprastas HTML tekstas

Java kodo rezultatas:
***<u> Skaičių nuo vieno iki devynių suma: 45</u>***

## Pavyzdys su ciklu
JSP nesunku generuoti ir iš anksto nežinomo ilgio sąrašą, lentelę ar kitą panašų dokumento elementą. Šiuo atveju programuojamas java ciklas su jame esančia HTML sekcija, kuri į generuojamą dokumentą keliskart įterpiama pakartotinai:


```
&lt;ul&gt;
&lt;%
 for (int i = 0; i &lt;3; i++)
   {
     %>
     &lt;li&gt; &lt;%=i %> </li&gt;
     &lt;%
   }
%&gt;
&lt;/ul%&gt;
```


Ši seka generuos trijų eilučių sąrašą:

1
2
3


## Parametrai
JSP java kodas gali pasiekti keletą iš anksto apibrėžtų kintamųjų, iš kurių svarbiausias yra **request** (angl užklausa). Iš request objekto galima sužinoti, kokie buvo puslapio kvietimo parametrai (jei puslapis generuojamas kaip vartotojo atsakas į užpildyta HTML formą) bei kokie yra anksčiau toje naršyklėje pasidėti slapukai. Slapukams padėti naudojamas kitas iš anksto apibrėžtas kintamasis, **response**. Slapukai dažniausiai reikalingi įsiregistravimui į slaptažodžiu apsaugotą sistemą.

## JSP puslapio dalys

JSP puslapis paprastai turi tokias dalis:
* statiniai duomenys, pavyzdžiui, HTML
* JSP direktyvos (directives), pavyzdžiui, „include“ direktyva
* JSP skripto elementai ir kintamieji
* JSP veiksmai
* papildomi (*custom*) tag'ai

### Statiniai duomenys

Statiniai duomenys yra tiesiogiai perrašomi į HTTP atsakymą. Taigi paprastas HTML failas yra suprantamas kaip korektiškas JavaServer puslapis be jokių specifinių JSP elementų. Tokiu atveju į HTTP atsakymą visą laiką būtų siučiama ta pati informacija. Bet JSP tikslas yra papildyti puslapį dinaminiu turiniu, todėl vien tik paprasto HTML pateikimas JSP kompiliatoriui retai kada yra prasmingas.

### JSP direktyvos

JSP direktyvos kontroliuoja kaip JSP kompiliatorius generuoja servletą. Žemiau pateiktas galimų direktyvų sąrašas:

* include – Include direktyva informuoja JSP kompiliatorių įterpti () pilną failą į redaguojamą. Įterpimą galima įsivaizduoti kaip veiksmą „įterpti“ toje vietoje kur įrašyta direktyva. Include direktyva funkcionuoja panašiai kaip include C preprocesoriuje.
 &nbsp;&nbsp;&nbsp;&nbsp;
* page – Yra keletas page direktyvos variantų:




Pavyzdžiai:

```
&lt;%@ page import="java.util.*" %&gt;
   &lt;%@ page contentType="text/html" %&gt;
   &lt;%@ page isErrorPage=false %&gt;
   &lt;%@ page isThreadSafe=true %&gt;
```


Tik *import* direktyva gali būti naudojama daugiau nei vieną kartą tame pačiame JSP puslapyje.

* taglib – Taglib direktyva nurodo kad bus naudojama JSP žymių () biblioteka. Direktyva reikalauja kad būtų nurodytas prefiksas (prefix) ir tag'o biblioteką aprašantis URI.
 &nbsp;&nbsp;&nbsp;&nbsp;

### JSP skripto elementai ir kintamieji

#### Standartiniai skripto kintamieji
Visąlaik prieinami skripte yra šie kintamieji:
* out – JSPWriter, naudojamas perduoti duomenis į HTTP atsakymo srautą (stream).
* page – Pats servletas.
* pageContext – PageContext objekto instanc'as (?lt) laikantis su visu puslapiu susijusią informaciją. Tokiu būdu keliems JSP gali būti perduodamas tas pats HTML puslapis.
* request – HTTP request objektas.
* response – HTTP response objektas.
* session – HTTP session objektas kuris gali būti naudojamas sekti vartotojo sesijai tarp atskirų puslapių.