JSP

	Veebindus on üheksakümnendatest aastatest alates pidevalt kasvanud ning mitmed firmad on jõudumööda lahendusi pakkunud, mis peaksid nii kasutajate kui programmeerijate elu kergemaks tegema. Algsete CGI- programmide kõrvale on mõeldud hulga vahendeid. CGI-programmiks võis olla igas keeles kirjutatud programm, mis kasutaja saadetud andmed sai keskkonnamuutujast (get-meetod) või standardsisendist (post-meetod) ning väljundi saatis standardväljundisse, mis sealt omakorda kasutajale suunati. Ajapikku mõeldi välja vahendeid, kus õnnestus vähema koodikirjutamisega luua veebilehti. Et ei peaks programmi sisse pikki staatilisi tekste kirjutama või neid mujalt failidest  lugema, vaid et võiks üksikud arvutatavad kohad kergesti HTML-lehe sisse kirjutada. Nii loodi PHP, ASP ning kuna end veebispetsideks pidavad Java loojad ei tahtnud rongist maha jääda, tuli neilgi oma vahend selleks teha, mille nimeks sai Java Server Pages ehk JSP. Tutvustavates artiklites märgitakse, et kuna JSP loodi ASP-st hiljem, siis oli võimalik varem tehtud vigu arvestada ning JSP võimalikult töökindlaks ning rudimendivabaks teha. Võibolla on neil osalt õigus, aga eks igaüks pea omaloodut kiitma, oma laps ikka kõige armsam. 
	Kirjutatav tekst püütakse jätta võimalikult HTMLi sarnaseks, et algsel tutvumisel vaatepilt liialt ära ei ehmataks. Programmi käsud ning väljastatavad väärtused tuleb kuidagi muust tekstist eristada. JSP (ning ASP) juures on koodi algustunnuseks "<%" ning lõputunnuseks "%>", nii et kogu kirjutatav tekst jääb nurksulgude ning protsendimärkide vahele. Kuna protsendiga algavat elemendi nime HTML-is pole, siis õnnestubki algul veebiserveris läbi vaadata lehe kood, käivitada sisse kirjutatud käsud ning saata tulemus kasutaja seilurile. Kui tahetakse avaldise väärtus lihtsalt kasutajale saata, siis tuleb koodiosa alustada sõnega "<%=".  

<html><head><title>Tervitus</title></head>
<body>
 Parim hinne koolis on <%=3+2 %>
</body></html>

 	Kuidas kirjutatud lehekülg tööle ning teistele näitamiseks üles panna, see sõltub juba veebiserverist. Kui viimane suudab JSP lehti käivitada ning on konfigureeritud nii, et .jsp laiendiga failid loetakse JSP lehtedeks, siis piisab vaid loodud leht nähtavasse kataloogi paigutada ning töö tulemus ongi vaatamisel näha. Ehk tuntuim JSP-võimeline vabalt kasutatav veebiserver on Jakarta Tomcat, kuid selle võimalusega saavad kas otse või lisatud moodulite abil hakkama enamik tuntumatest veebiserveritest. 
	JSP koodiosas võib Java keele käsklusi kasutada nagu igas muuski programmis. Kui Javas tuleb muutujad deklareerida, siis ka siin peab tsükli algul ütlema, et muutuja i on tüübist int ehk täisarv. 

<html><head><title></title></head>
<body>
Arvude ruudud ühest kahekümneni on:
<p>
  <% for(int i=1; i<=20; i++){ %>
    <%= i*i+"<br>" %>
  <% }  %>
</body></html>

	Suur osa aktiivsete veebilehtede võludest ja võimalustest on seotud sellega, et serveris koostatakse kasutajalt saadetud andmete põhjal temale sobiv lehekülg. Tavaliseks veebilehele andmete saatmise formaadiks on lehe aadressile järgnev küsimärk, mille järgi tulevad parameetrid ning nende väärtused. Näiteks nimeleht.html?nimi=Juku&vanus=15 . Käsu getParameter abil leitakse JSP lehel parameetri nime järgi kasutaja saadetud väärtus.

<html><head><title>Nime lugemine</title></head>
<body>
  Tere, 
  <%= request.getParameter("nimi") %>
</body></html>

	Vormi elementidesse sisestatud väärtused pannakse andmete saatmisel automaatselt sellisele kujule, et serveripoolne programm parameetrite nimede järgi väärtusi küsida oskab. Kui vormil on vaid üks tekstiväli, siis saadetakse andmed teele pärast välja teksti kirjutamist ning sisestusklahvi vajutamist. Muul  juhul tuleb andmete teele saatmiseks lisada veel eraldi nupp (tüübiga submit) või anda Javaskripti abil vormile vastav käsk. 

<html><head><title>Nime sisestamine</title></head>
<body>
 Palun nimi:
 <form action=serverileht3.jsp>
   <input type="text" name="nimi">
 </form>
</body></html>

	Kui soovida mitmele lehele paigutada ühist päist, jalust  või muud teksti, siis pole otstarbekas seda kõikjale kopeerida. Mõistlikum on lisatav plokk panna eraldi faili ning käsuga include see lehe koostamisel sinna sisse lugeda. 

<html><head><title>Faili sisu kaasamine</title></head>
<body>
 Failis on teade:
<%@ include file="teade.txt" %>
</body></html>

	Nii testimise tarvis kui hilisema koodi mõistmise jaoks kasutatakse kommentaare. Pea igas enesest lugu pidavas programmeerimiskeeles on see võimalus olemas. HTMLi sisse saab JSP kaudu lisada kommentaare nagu iga staatilisegi veebilehe juurde. Alguseks <!-- ning lõpuks -->. Ka Java keele juurde kuuluvad kommentaarid kahe kaldkriisuga väljakommenteeritava rea algul võetakse vastu. Lisaks saab silma alt ära kommenteerida terve käsuploki: alguseks <%-- ning lõpuks --%>. HTMLi kommentaar jääb veebilehe koodi näha ning kasutaja võib soovi korral vaadata, mida lehe sisse lisatud on. Teised veebiserverist kaugemale ei jõua ning jäävad kasutaja eest peidetuks.

<html><head><title>Kommentaarid</title></head>
<body>
 <!-- Harilik kommentaar --> 
 
 <%-- varjatud kommentaar --%>
<%
 //kommentaar koodi sees
%>
</body></html>

	Keerulisemateks arvutusteks ning andmete pärimiseks ja säilitamiseks soovitatakse kasutada eraldi objekte. Põhimõtteliselt on võimalik suur osa käskudest pikkida veebilehte väljastava JSP lehe koodi sisse, kuid nõnda võib lehe ehitus raskelt jälgitavaks minna ning samuti pole võimalik loodud koodi edaspidi ilma kopeerimata muudes olukordades kasutada. Selliste eraldi kasutatavate komponentidega suheldakse ubade (Java Bean) tarvis loodud vahendite abil. Oad paigutatakse veebilehtedest hoopis eraldi kataloogidesse (kuhu täpselt, sõltub veebiserverist). Samu ube võivad kasutada mitmel lehel olevad programmid. Järgnevalt uba, mis on vajalik ühe nime meeles pidamiseks.

package k1;
import java.io.Serializable;
public class Uba1 implements Serializable{
  String nimi="Triin";
  public void paneNimi(String nimi1){
    nimi=nimi1;
  }
  public String annaNimi(){
    return nimi;
  }
  public String tutvusta(){
    return "Mu nimi on "+nimi;
  }
}

	Lehel saab oa kasutusele võtta avaldisega jsp:useBean, märkides, mis nime all oaga suheldakse ning millisest paketist ja millisest klassist võetud käskudega on tegemist. Kui tuleks meeles hoida korraga mitu nime, siis võiks ka samast klassist ube rohkem olla. Igaühel lihtsalt oma nimi. 

<html><head><title>Oa kasutamine</title></head>
<body>
  <jsp:useBean id="nimehoidja" class="k1.Uba1"/>
  <%=nimehoidja.tutvusta() %>
  <%nimehoidja.paneNimi("Katrin"); %>
<p>Oa sees on nüüd 
  <%=nimehoidja.annaNimi() %>
</body></html>

	Oa kirjeldamisel lisatud parameeter scope="session" tähendab, et oas paiknevad andmed ei hävine koos lehe väljastamisega, vaid kui sama kasutaja mõne aja (sessiooni kestus, vaikimisi paarkümmend minutit) pärast uuesti sama oa poole pöördub, on seal andmed, mis eelmisest külastusest jäid. Nii on võimalik iseenesest pideva ühenduseta HTTP protokolli abil luua kasutajale mulje nagu oleks tema andmed pidevalt meeles ning järgmisel korral mäletatakse, mida kasutaja viimati tegi. Kui eelmises näites teatati pidevalt, et nimeks on Triin, siis alla näitesse teisel korral sisenemisel on seal juba olemas eelmisest korrast meelde jäetud Katrin. 

<html><head><title>Oa kasutamine</title></head>
<body>
  <jsp:useBean id="nimehoidja" class="k1.Uba1" scope="session" />
  <%=nimehoidja.tutvusta() %>
  <%nimehoidja.paneNimi("Katrin"); %>
<p>Oa sees on nüüd 
  <%=nimehoidja.annaNimi() %>
</body></html>

	Suure osa loodud ubade ülesandeks on andmebaasist saabunud teabe edastamine. JSP lehel saab küsida ning sisestada andmeid soovitud kujul, oa ülesandeks jääb draiveri ja ühenduste eest hoolitsemine ning niimoodi võib veebilehe kirjutaja eest peita tehnilise keerukuse ning jätta selle kergemini kogu asutuse peale paari asjatundja hooleks. Järgnev uba loob konstruktori käivitamisel ühenduse andmebaasiga ning see jääb avatuks kogu oa eluea jooksul. Avalikult kasutatavad on kolm meetodit on tabeli loomiseks, andmete küsimiseks ning sisestamiseks. Andmetabel koostatakse ainult ühe kirje ning ühe väljaga. Selles peaks leiduma poes parasjagu müüdavate pallide arv. Andmevahetusega seotud käsud algavad get-i ja set-iga seetõttu, et hiljem võiks palliarv'u oa omadusena kasutada. Kui sama suuruse muutmiseks on siinkirjeldatud kujul meetodid, siis suudetakse nende omadustega vastavas keskkonnas automaatselt ümber käia. 

package k1;
import k1.*;
import java.sql.*;
public class Baasiuba1{
  Connection cn;
  Statement st;
  public Baasiuba1(){
   try{
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");    
    cn=DriverManager.getConnection("jdbc:odbc:baas1", "", "");
    st=cn.createStatement();
   }catch(Exception e){
     System.out.println(e);
   }
  }
  public void looBaas() throws SQLException{
    String lause="CREATE TABLE pallid (kogus int);";
    st.executeUpdate(lause);
    lause="INSERT INTO pallid (kogus) values ('0');";
    st.executeUpdate(lause);
  }
  public void setPalliarv(int arv) throws SQLException{
    String lause="UPDATE pallid SET kogus="+arv+";";
    st.executeUpdate(lause);
  }
  public int getPalliarv() throws SQLException{
    String lause="SELECT kogus FROM pallid;";
    ResultSet rs=st.executeQuery(lause);
    rs.next();
    return rs.getInt("kogus");
  }
}

	Baasiloomine tuleb käivitada tavalise käsklusega. Pallide arvu teada saamiseks piisab pallibaasi-nimelise oa omaduse palliarv küsimisest.

<jsp:useBean id="pallibaas" class="k1.Baasiuba1" />
<% pallibaas.looBaas(); %>
<html><head><title>Baas loodud</title></head>
<body><h2>Baas loodud</h2>
 Baas pallide arvu loomiseks õnnelikult loodud.
 Laos on <jsp:getProperty name="pallibaas" property="palliarv"/> palli. 
</body></html>

	Lattu pallide lisamiseks tuleb see arv kõigepealt laohoidja käest kätte saada.

<html><head><title>Pallide lisamine</title></head>
<body><h2>Pallide lisamine</h2>
 Mitu palli lisatakse lattu? <br>
 <form name="vorm1" action="lisamine.jsp">
   <input type="text" name="arv">
 </form>
</body></html>

Edasi saab jätta JSP lehe hooleks andmed oale edastada, kes siis tulemused tabelisse kannab.

<jsp:useBean id="pallibaas" class="k1.Baasiuba1" />
<html><head><title>Pallide lisamine</title></head>
<body><h2>Pallide lisamine</h2>
 <% 
  int olemas=pallibaas.getPalliarv();
  int juurde=Integer.parseInt(request.getParameter("arv"));
  int kokku=olemas+juurde;
  out.println("Laos oli palle "+olemas+" lisatakse "+juurde+".");
  pallibaas.setPalliarv(kokku);
 %>
  Laos on nüüd <jsp:getProperty name="pallibaas" property="palliarv"/> palli. 
</body></html>

Müümisel tuleb vastav jagu palle baasist eemaldada.

<jsp:useBean id="pallibaas" class="k1.Baasiuba1" />
<html><head><title>Pallide eemaldamine</title></head>
<body><h2>Pallide eemaldamine</h2>
 <% 
  int olemas=pallibaas.getPalliarv();
  int maha=Integer.parseInt(request.getParameter("arv"));
  int tulemus=olemas-maha;
  out.println("Laos oli palle "+olemas+" väljastada soovitakse "+maha);
  if(tulemus<0){
     out.println("Väljastada saab vaid "+olemas+" palli");
     tulemus=0;
  }
  pallibaas.setPalliarv(tulemus);
 %>
  Lattu jäi <jsp:getProperty name="pallibaas" property="palliarv"/> palli. 
</body></html>