světNotes.cz

Programujeme servlety 1
Novinky
25.11.2003 - Štefan Vidiš

Poznámka redakce: Právě čtete první ze série článků na vysoce aktuální téma programování servletů. Jeho autor, Štefan Vidiš, si před sebe postavil podle mého názoru ten nejtěžší úkol - napsat ucelenou sérii článků. Držíme mu palce.

O čom bude tento článok:


S príchodom verzie R5 nás Lotus prekvapil doplnením servlet technológie v rámci domino servera. Mnohí z nás si povedia, nuž a čo má byť? Myslím, že je hneď niekoľko dobrých dôvodov, prečo práve nastal čas na bližšie zoznámenie sa s technológiou servletov. Skúsme si teda vymenovať niektoré z nich:

Špecifikácie

Poďme sa ale bližšie pozrieť na špecifikácie, ktoré je potrebné mať na zreteli (v zátvorke pre porovnanie uvádzam aktuálne verzie jednotlivých špecifikácii). Celý tento článok bude popisovať to, čo je možné vo verzii R 5.xx, ak nebude uvedené inak.

IBM JDK 1.18 (JDK 1.41) Java Development Kit - vývojové prostredie javy
JSDK 2.0 (2.3) Java Servlet Development Kit - vývojové prostredie servletov a api servlet managera, nadstavba JDK

Toto platí pre nastavenie servlet managera, ktorý je k dispozícii po nainštalovaní servra. Dôležité je iba si uvedomiť, že dané technológie sú už zastaralé a rešpektovať príslušné api a dokumentáciu. Je možne pravdaže využiť aj iný servlet manager. O tom si ale povieme niekedy inokedy. V tomto prípade nám postačí “Domino Servlet Manager”. Domino server podporuje rôzne nastavenia pre podporu servlet managera. A ešte niektoré dôležité skratky, ktoré budú použité v texte:

LN_PATH_DATA – cesta k lotus domino dátovému adresáru na serveri. (Napr. C:\lotus\DominoData\)
LN_PATH_SERVER - cesta k programovým súborom na serveri (C:\Lotus\Domino\)


IDE nástroje

Ale poďme si najskôr niečo povedať o možných IDE nástrojoch, ktoré nám môžu v začiatkoch ušetriť mnoho času. Určite každý z nás už okúsil slasti programovania v IDE Lotus Designera. Je síce možné ho použiť k práci so servletmi (IDE vývoja Java Agentov), ale toto by som doporučoval iba programátorom masochistom.:-) Vrelo odporúčam použiť niektorý z free alebo platených IDE nástrojov (Borland JBuilder, SUN NetBeens, Eclipse). V našom prípade predpokladajme, že máme na pracovnej stanici nainštalovaný IDE JBuilder.


Prvý servlet

Skúsme ale prejsť o krok ďalej. Vytvoreniu nášho prvého servletu už nič nebráni. V čom je vlastne podstata servlet technológii v porovnaní s domino technológiami?. Pre lotus programátora sa ako najlepšia paralela k servlet manageru môže javiť agent manager. Servlet manager je prostredie, kde servety žijú v určitom životnom cykle. Podobne ako agenti v agent managery. Jednotlivé servlety potom vlastne môžeme prirovnať k agentom. Kde v jednotlivých servletoch je potrebné implementovať metódy, podobne ako sme v agentoch písali kód pre “Sub Initialize“ a iné subrutiny. Pre odporcov OOP programovania mám dobrú správu. Je možné vytvoriť peknú funkcionalitu aj bez hlbšej znalosti dedičnosti, predkov, potomkov a podobných OOP hrôz. Alebo aspoň na začiatku sa bez týchto vedomosti určite zaobídeme.

Takže pozrime sa bližšie na základnú kostru servletu. Toto nám napríklad ponúkne každý slušný wizard IDE nástroju. (alebo si môžeme znázornený servlet uložiť ako šablónu)

public class S1 extends HttpServlet {
 
  public void init(ServletConfig config) throws ServletException {
  }
 
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 
  }
 
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
  }
 
  public void destroy() {
  }
}

Pozrime sa podrobnejšie na jednotlivé metódy, ktoré budeme neskôr implementovať.

init() - táto metóda sa vykoná pri štarte servletu a to iba jediný raz. Treba si uvedomiť, že na rozdiel od agentov, servlet ostáva v pamäti servlet manageru, buď počas celej doby behu HTTP úlohy alebo po dobu, ktorú si určuje servlet manager. Nemáme veľa možností toto správanie ovplyvniť. Čiže tu je dobrým pravidlom písať kód, ktorý spotrebováva mnoho času alebo prostriedkov. Vytvorenie Corba spojenia na domino server, Connection na sql serveri, načítanie rôznych nastavení a pod. Nezabudnite doplniť "ServletConfig config" ako parameter init(), pretože napr. Jbuilder tento parameter nevygeneruje automaticky a potom sa stane, že v "Domino Servlet Manager-y" sa metóda init nezavolá.

destroy() - slúži ako náprotivok k init metóde. To znamená, že servlet manager ju vyvolá práve a iba pri uvoľňovaní servletu z pamäti. Je dobrým zvykom v tejto metóde uvoľňovať všetky zdroje a prostriedky, ako aj uzatvárať spojenia, ktoré sme otvárali v init().

doGet, doPost - metódy, ktoré sa vyvolajú pri url dotaze. Niečo podobné, ako keď zavoláme z web prehliadača agenta (http://Host/Database/AgentName?OpenAgent). A práve tieto metódy budú aspoň spočiatku pre nás kľúčové.

doGet - sa vyvolá pri GET metóde HTTP volania
doPost - sa vyvolá pri POST metóde HTTP volania

Je dobrým pravidlom zabezpečiť, aby sa pri jednoduchých servletoch v oboch prípadoch zavolala tá istá metóda.


public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 doService (request,  response);
  }
 
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doService (request,  response);
  }

public void doService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //náš super kód -))
  }


a ešte niekoľko slov k vstupným rozhraniam, niečo podobné, na čo sme boli zvyknutí v UI udalostiach (napr. Sub Postopen(Source As Notesuidocument)).

HttpServletRequest request - z tohto rozhrania si môžeme pomocou getXXX (napr. getCookies()) metód vybrať mnohé užitočné parametre. V porovnaní s WEB agentom, kde sme mali možnosť vyčítať iba niektoré štandardné CGI premenné, tu máme prístup jednak k všetkým CGI, ale aj k mnohým ďalším.

HttpServletResponse response - nastavením rôznych parametrov tohto rozhrania naopak posielame do web prehliadača odpoveď užívaťeľovi.

Takže pokúsme sa zosumarizovať naše doterajšie vedomosti a dostaneme nasledujúci jednoduchý servlet

public class S1 extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html; charset=windows-1250"; // specifikacia charsetu response uzivatelovi
  //inicializacia globalnych nastaveni
  public void init(ServletConfig config) throws ServletException {
  }

  //spracovanie HTTP GET volania
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
  doService(request, response);
  }

  // spracovanie HTTP POST volania
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doService(request, response);
  }

// implementacia oboch volani naraz
  public void doService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String p0 = request.getParameter("p");
    if (p0 == null) {
      p0 = "";
    }
    response.setContentType(CONTENT_TYPE);
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>S1</title></head>");
    out.println("<body bgcolor=\"#ffffff\">");
    out.println("<p>Tento servlet bol vyvolany metodou  " + request.getMethod() + ". A toto je odpoved.</p>");
    out.println("<p>parameter p ="+p0+"</p>");
    out.println("</body></html>");
  }

  //uzavretie zdrojov
  public void destroy() {
  }
}

Výsledok podobný tomuto uvidíte v prehliadači, ak napíšete do URL políčka túto adresu: http://localhost/servlet/s1?p=10 (pozor: je potrebné za premennú localhost zameniť meno alebo IP adresu servera) dostaneme tento výsledok :



Než sa však dopracujeme k tomuto výsledku sú potrebné ešte ďalšie kroky. Jedným z nich je úprava dokumentu v adresnej knihe (names.nsf). Predovšetkým v sekcii Server – Servers – aktuálny server dokumnet. A v tomto dokumente sekciu Internet Protocols – Domino Web Engines – Java Servlets.


Vysvetlenie políčok, ktoré sú pre nás dôležité:

Java servlet support:povolenie servlet managera a nastavenie druhu servlet managera
Servlet URL path:mapovanie časti url na servlet manager, inak ak nájde túto čast cesty server v url volaní presmeruje volanie na servlet manager
Class path:relatívna časť cesty na HD , kde je potrebné uložiť už skompilované class súbory

Vysvetlenie ostatných políčok nájdete vo vývojárskom (administrátorskom) help-e.

Ďalším krokom je vytvorenie adresáru "servlet" v LN_PATH_DATA\domino\, pretože tento sa nevytvára po nainštalovaní servra. Potom je tu ešte vytvorenie najdôležitejšieho konfiguračného súboru servlets.properties. Tento je potrebné nakopírovať do podadresára v LN_PATH_DATA\domino. Pozor, tento sa taktiež nevytvára pri inštalácii. A čo by mal obsahovať ? V našom prípade sa bude jednať o tento zápis v súbore :

# -------------   mapovanie servletu ----------------
servlet.s1.code=S1.class
# ---------------------------------------------------
servlet.XXX.code = YYY.class

Pre nás je zaujmavá možnosť, kde za XXX doplníme mapovací názov servletu (s1) a za YYY.class skutočný názov class súboru(S1). Je niekoľko možností, ako namapovať servlety na cestu url aplikácie. Na podrobnejšie a detailnejšie štúdium odporúčam si pozrieť príslušnú stať vo vývojárskom helpe. Netreba zabudnúť, že ak sme použili package v servlete, je potrebné každý package nahradiť adresárom na disku a v zápise zasa každý oddeľovač adresára nahradiť bodkou. Čiže, ak sme použili package deklaráciu package sk.firma.serial; v adresárovej štruktúre do adresára LN_PATH_DATA\domino\servlet musíme vytvoriť pod týmto adresárom ešte podadresár

sk _
     |  
    firma _
            |
           serial

a uložiť class S1 až sem. Naopak, naše namapovanie v servlets.properties musí vyzerať takto:

servlet.s1.code=sk.firma.serial.S1.class

Jedno upozornenie pre milovníkov Unixov a Linuxov. Nezabudnite zmeniť vlastníka a skupinu vlastníkov pre nakopírované class súbory na vlastníka a skupinu vlastníkov tak, aby toto nastavenie bolo rovnaké, aké majú ostatné súbory Domino servera (toto je snáď najčastejšie sa vyskytujúca chyba našich zákazníkov). Podľa doporučenia Lotusu, napríklad je potrebné pri inštalácii vytvoriť užívateľa notes a skupinu notes. V tomto prípade je potrebné podpísať súbory užívateľom a skupinou notes



A potom je tu už iba posledný krok a to je reštartnúť HTTP úlohu na serveri. Pozor, nie je dostačujúci príkaz HTTP restart. Je potrebné reštartnúť server príkazom TELL HTTP Q a následne LOAD HTTP. A nezabudnite, že servlet manager domina nie je schopný znova načítať zmenené class súbory a tak je potrebné tento posledný krok opakovať pri každej zmene zdrojového kódu.

A o čom by sme si porozprávali v nasledujúcom pokračovaní ? Trebárs ako v servlete použiť domino package. Ako odladiť servlet tak, aby sme pri tom nezošediveli :-)) A ako lahôdku si ukážeme servlet, ktorý nám vygeneruje on-fly obrázok a zobrazí ho v prehliadači .

Prílohy :

Servlet.java servlets.properties jsdk20.zip(105 kB)