DISKUSE
ECL 
03.04.2019 16:10

Agent přestal fungovat (1)
18.03.2019 08:28

Načíst krátký text z webu 
17.03.2019 23:32

Indexy mimo DB (1)
19.02.2019 15:46

planovaný agent v mail.box (1)
17.02.2019 15:11

Hint v Link 
17.12.2018 11:08

NoCache a ReCache (1)
17.12.2018 10:54

IBM se zbavilo Domina (1)
12.12.2018 10:26


ŠKOLENÍ


REKLAMA


KOMENTÁŘE

Programujeme servlety 2

Vytisknout článek

Druhá část seriálu o programování servletů v J2EE. Mj. se naučíme ladit servlety, použijeme Domino balíček a ukážeme si servlet na zobrazní obrázku v prohlížeči.


Tak a je tu čas pokračovať v našom seriály. A o čom bude tento článok?
  • ako v servlete použiť domino balíček.
  • ako odladiť servlet tak, aby sme pri tom nezošediveli.
  • a na záver si ukážeme servlet, ktorý nám vygeneruje on-fly obrázok a zobrazí ho v prehliadači.

Keď som pred niekoľkými rokmi začínal s programovaním svojho prvého servletu pre Domino, moja práca sa opakovala asi v takomto cykle. Niečo som naprogramoval, skompiloval, prekopíroval do príslušného adresáru a dúfal, že servlet pobeží. Čo sa občas aj podarilo. Pokiaľ ale išlo o zložitejší servlet, odlaďovanie bolo veľmi zdĺhavé a časovo náročne. Pozrime sa teda ako sa táto vec dá elegantne vyriešiť. Najprv ale začnime s niečím úplne základným a poďme si pohovoriť o dvoch jar balíkoch. Po nainštalovaní Domino servra síce nájdeme na disku hneď niekoľko, nás budú ale zaujímať predovšetkým tieto dva:
  • Notes.jar ( nájdeme v adresári LN_PATH_SERVER\Notes.jar) – tento balíček obsahuje všetky triedy, ktoré používame pri vytváraní aplikácie/servletov, spúšťajúce sa v rámci jedného servra.
  • NCSO.jar ( nájdeme v adresári LN_PATH_DATA\domino\java\NCSO.jar) – tento balíček vlastne obsahuje tú istú funkcionalitu ako predchádzajúci, ale používa sa v prípade že aplikácia sa bude spúšťať na servri/klientovi, kde nebol nainštalovaný žiadny Lotus/Domina software.

Prečo teda popisujeme NCSO.jar ? Keď predsa servlet manager je súčasťou Domino servra a teda zákonite potrebujeme prvý balíček. A tu sú dôvody. Prvý je, že servlet, ktorý sa bude pripájať na Domino databázu, môže trebárs bežať v rámci iného servlet manageru na inom servri ( Tomcat, Websphere). No a ten druhý dôvod je práve "inteligentné" odlaďovanie servletov mimo prostredia Lotus Notes v ľubovoľne nami zvolenom IDE. Ja som si zvolil IDE JBuildraX. Pravdaže podobné princípy použitia platia pre Vás obľúbené nástroje.

Ako vidíme na obrázku 1 a 2 nejedná sa o zložitú záležitosť. Iba v odpovedajúcom správcovi balíčkov si namapujeme najprv NCSO.jar pod hlavičku DominoR5 a Notes.jar pod hlavičku NotesR5.


obr. 1



obr. 2

Nezabudnite potom ale obe tieto knižnice zaradiť do aktuálneho projektu. Ako to ukazuje obrázok 3.


obr. 3

A ešte jedna malá, ale dôležitá pomôcka. Dnešné IDE už nepočítajú s tým, že by sa niekto mohol "zabávať" s programovaním vo verzii JDK 1.18 ( SUN práve uvolnil verziu 1.5:-)))). My s tým žiaľ rátať musíme a tak doporučujem, ak Vaše IDE umožňuje zmenu JDK, nainštalovať si aj verziu IBM JDK 1.18 alebo SUN JDK 1.18.

A ešte malá poznámka. Pre vzdialenom pripájaní sa na server používate pre prístup k dátam LN CORBA protokol a to znamená, aby ste sa k dátam dostali, musíte nastaviť a spustiť CORBA task na servri. (viď. administrátorská príručka).

Tak ale vráťme sa teraz od nudnej konfigurácie prostredia k programovaniu. Pravdaže ako stále existuje niekoľko riešení tohto problému. My skúsime požiť ten najjednoduchší a sofistikovanejšie už nechám na Vás. Základom tejto pomôcky z pohľadu programovania je súbor tried, ako nám to ukazuje UML diagram.



Existujú určité odlišnosti v použití remote a local tried v LN a práve tieto odlišnosti je možné postrehnúť v zdrojovom kóde. Súčasťou tohto jednoduchého balíka sú dve triedy, ktoré implementujú rozdiely v prístupe k Lotus Notes databáze(ALnDBLocal a AlnDbRemote). Abstraktná trieda AlnDb implementuje IDomino interface, ktorý nám ukryje rozdiely v prístupe, ktoré naopak nájdeme v triede ALnDBLocal a AlnDbRemote. Takže je potom veľmi jednoduché, ak v projekte na základe premennej TEST vytvárate objekt Idomino, či už z lokálnej alebo remote triedy (ako to vidíte v nasledujúcej ukážke kódu z ľubovolného servletu).

private static boolean TEST = true;
IDomino idomino = null;

try {
      if (TEST) {
        idomino = new ALnDbRemote();
      } else {
        idomino = new ALnDbLocal();
      }
      out.println(idomino.getValue(kluc,item));
    }  catch (DataSourceException ex) {
      out.println("<p>pri dotaze v LN databaze sa vyskytla chyba "+ex.getMessage()+"</p>");
    } finally {
      idomino.destroy()
      idomino = null;      
    }

Tento model môže byť podľa ľubovôle parametrizovateľný, pre zjednodušenie som použil v kóde parametre "natvrdo" (názvy databáz, pohľadov). No a teraz keď už máte vytvorený základ LN remote interface pre aplikáciu, môžete smelo pokračovať v budovaní určite tej najlepšej web aplikácie, aká kedy vznikla a pravdaže môžete ladiť svoje servlety vo Vašom obľúbenom IDE.

Na a čo dodať na záver. Ak ste so svojim kódom spokojný a všetky automatické testy zbehli správne, stačí už iba zmeniť premennú TEST na False a znova skompilovať celú aplikáciu. Na záver už iba posledná pripomienka. Kvôli kontrole je práve v tejto fáze rozumne prekompilovať projekt vo verzii JDK 1.18. To aby ste sa presvedčili či ste náhodou nepoužili metódu, ktorá ešte nebola súčasťou verzie 1.18.

Mimochodom tento trik používam aj keď vyvíjam kód pre java Agentov. Podstata je ta istá, s tým rozdielom, že celá logika je napísaná mimo hlavnej triedy agenta (ktorá rozširuje AgentBase), ale namiesto nej mám hlavnú triedu, ktorá pracuje s remote rozhraním, takže ak trebárs agent má pracovať s kolekciou dokumentov, ako argument mu moja trieda dodá kolekciu dokumentov. V poslednom kroku už iba celý výsledný jar balíček nainportujem do LN a nastavím v Designerovi tu správnu "základnú triedu".


Dynamický obrázok

A teraz k druhej časti. Určite ste sa niekedy stretli s tým, že Vám pri vytváraní webového riešenia nestačil statický obrázok. Ponúkam vám teda jednoduchý návod, ako toto obísť a vytvoriť servlet, ktorý bude generovať dynamický obrázok. Základom projektu je knižnica, ktorú si môžete stiahnuť s ACME labs . Mimochodom potrebné knižnice sú súčasťou Notes.jar.

Základný princíp spočíva v tom, že kreslíme na virtuálne plátno. Po ukončení kreslenia potrebujeme ešte skonvertovať obrázok z natívneho java formátu do formátu, ktorému Váš prehliadač rozumie. Nuž a to dosiahneme práve pomocou balíčka od ACME labu. Pre jednoduchosť som postup okomentoval priamo v zdrojovom kóde.

    response.setContentType("image/gif");

    // na rozdiel od klasickeho servletu neotvarame textovy ale bit-e stream
    OutputStream os = response.getOutputStream();
    // precitanie parametru zo vstupu
    String znak = request.getParameter("znak");

    // vytvorenie virtualneho platna na ktore budeme kreslit 20x20 pixlov
    Frame frameTemp = new Frame();
    frameTemp.addNotify();
    Image image = frameTemp.createImage(20,20);
    Graphics g = image.getGraphics();
    g.setColor(Color.black);
    // vykreslenie znaku s pozicie
    g.drawString(znak,0,15);

    // zmena z nativneho java formatu,do formatu gif
    GifEncoder encoder = new GifEncoder(image, os);
    encoder.encode();
    os.flush();
    os.close();

No a na záver pravdaže nezabudnite pridať do html stránky niečo podobné tomuto zápisu.
<img src="/servlet/elog?znak=SvetNotes>
Pravdaže modrá časť závisí od aktuálneho namapovania Vášho servletu, ale toto už je obsah prvej časti.

Upozornenie. Pozor, ak by ste tento príklad skúšali na nejakom Unix/Linux servri, asi by ste boli zaskočení, že nefunguje. Na konzole sa vám pravdepodobne objavia zaujímavé chyby. Problém nastane práve preto, že ak na danom servri nie je nainštalovaný X-server, nie ste schopní vytvoriť virtuálne plátno. Riešenie už ale nad rámec tohto článku. Takže zatiaľ sme iba Windows only :-).

Príloha:

- servlet vytvárajúci obrázok
- servlety pre ladenie

project.zip


Autor: Štefan Vidiš
Datum: 26.02.2004


Sdílet článek Seznam komentářů
 
Od
Téma
 Datum
Michal S.
Tesim se na pokracovani ...
07.04.2004 20:25

Související články:
» 

Lotus vsadil na Wiki

 (Odkazy, 13.01.2010)

» 

Programujeme servlety 1

 (Programování, 25.11.2003)

» 

Počet webů na Dominu roste

 (Události, 16.10.2003)

» 

Kalendár českých a slovenských mien

 (Kalendář, 20.08.2003)

» 

Move2Lotus

 (Notes/Domino R6, 04.06.2003)

» 

UNK table - po druhé.

 (Tipy a triky, 19.11.2002)

» 

UNK table - po prvé.

 (Tipy a triky, 14.11.2002)