Programovanie

Volajte metódy JavaBean zo stránok JSP 2.0

Nová verzia JavaServer Pages (JSP) obsahuje výrazový jazyk (EL) zavedený knižnicou štandardných značiek JSP (JSTL), ktorá umožňuje webovým dizajnérom vytvárať bezskriptové stránky JSP, ktoré neobsahujú kód Java. Pretože JSP 2.0 poskytuje spätnú kompatibilitu s JSP 1.x, môžete na svoje stránky stále vkladať útržky Java, ale manipulátory značiek a komponenty JavaBean sú oveľa lepším miestom pre funkcie založené na Jave.

JSP 2.0 poskytuje nové funkcie pre manipulátory značiek, ako sú dynamické atribúty, protokol Simple Invocation Protocol a .štítok súbory. Na vytváranie inštancií JavaBean a nastavovanie ich vlastností stále používate staré štandardné akcie JSP 1.0, teraz však môžete pristupovať k vlastnostiam fazule, vyžadovať parametre a atribúty / premenné JSP pomocou nového výrazového jazyka.

Všetky tieto vylepšenia technológie JSP vám umožňujú dosiahnuť cieľ oddelenia kódu JSP / HTML od kódu Java. Jedna vec však chýba. JSP 2.0 nemá žiadnu syntax pre volanie verejnej nestatickej metódy JavaBean zo stránky JSP bez skriptov. Tento článok tento problém rieši poskytnutím jednoduchej značky JSP 2.0 s dynamickými atribútmi.

Poznámka: Zdrojový kód tohto článku si môžete stiahnuť zo zdrojov.

Vyžaduje sa výrazový jazyk

Predpokladajme, že máte java.util.List inštanciu musíte uviesť ako zoznam HTML. Tu je rýchle riešenie založené na JSP 1.x:

Existujúce webové aplikácie založené na JSP pozostávajú z kódu Java zmiešaného s označením HTML, ako je vyššie uvedený fragment kódu. Udržiavanie stoviek takýchto stránok môže byť nočnou morou, ak máte samostatné tímy pre vývoj v prostredí Java a webdizajn. Riešením je presunutie kódu Java do knižníc značiek, aby vývojári mohli vykonávať svoju prácu bez prilepovania kódu Java na webové stránky a návrhári mohli upravovať svoje webové stránky bez obáv z porušenia kódu Java.

JSP 1.x má však niekoľko problémov, ktoré vám neumožnia ľahko vyvinúť stránky JSP bez skriptov. Donedávna neexistovala žiadna štandardná metóda na prístup k objektom Java zo stránky JSP bez použitia kódu Java. Triedy obsluhy kódovania značiek navyše neboli také jednoduché, ako by mohli byť.

Nasledujúce riadky kódu vychádzajú z JSTL 1.0, ktorý je možné použiť s JSP 1.2. The tag iteruje nad prvkami daného zoznam a vyváža elem premenná pre každý prvok. Namiesto vyhlásenia elem ako lokálna premenná sa použije značka vytvorí atribút stránky s pageContext.setAttribute (). Hodnota tohto atribútu je vytlačená s JSTL značka:

JSTL poskytuje štandardné značky na spracovanie dokumentov XML a prístup k relačným databázam spolu s formátovacími značkami, značkami internacionalizácie, podmienenými značkami, značkami iterátora, značkami súvisiacimi s URL a inými značkami na všeobecné použitie. JSTL vyriešil mnoho problémov JSP 1.x pomocou výrazového jazyka, ktorý umožňuje prístup k objektom Java zo stránok JSP bez použitia kódu Java. Napríklad namiesto hľadania atribútu alebo prístupu k parametru požiadavky pomocou:

teraz môžete použiť:

$ {a} $ {param.p} 

Môžete pristupovať k kontextovým objektom stránky JSP, atribútom page / request / session / application (tiež známym ako premenné JSP), vlastnostiam JavaBean, elementom kolekcie, parametrom request, inicializačným parametrom, cookies a hlavičkám HTTP.

S JSP 1.2 je jazyk výrazu k dispozícii iba pre aplikácie a knižnice značiek založené na JSTL. JSP 2.0 sprístupňuje EL pre všetky aplikácie JSP a všetky knižnice značiek (vrátane starých taglibs určených pre JSP 1.x). JSP 2.0 tiež zjednodušuje vývoj knižnice značiek, ako uvidíte ďalej v tomto článku.

Od svojej prvej verzie poskytuje JSP štandardné značky na používanie JavaBeans na stránkach JSP. Inštancie JavaBean môžete vytvoriť alebo nájsť pomocou , a potom môžete získať a nastaviť ich vlastnosti pomocou a . S JSP 2.0 môžete tiež získať hodnotu nehnuteľnosti s:

$ {bean.property} 

Okrem vlastností majú komponenty JavaBean verejné metódy, ktoré sa často musia volať zo stránok JSP. Zvyšok tohto článku predstaví tri spôsoby volania metód JavaBean bez použitia kódu Java. Jeden je založený na podpore funkcií JSP 2.0, čo sú konštrukty EL, ktoré umožňujú volať statické metódy tried Java. Iné riešenie používa vlastné značky, ktoré dostanú parametre metódy ako atribúty značiek. Tretia cesta je založená na generickej značke, ktorá umožňuje volať zo stránky JSP ľubovoľnú verejnú metódu ktorejkoľvek triedy JavaBean.

Používajte funkcie

Počiatočnému JSTL 1.0 EL chýbala podpora funkcií. JSP 2.0 EL umožňuje volať verejnú statickú metódu triedy Java pomocou nasledujúcej syntaxe:

$ {prefix: methodName (param1, param2, ...)} 

Funkcia JSP musí byť deklarovaná v deskriptore knižnice značiek (TLD):

 methodName className returnType methodName (param1Type, param2Type, ...) 

Trieda Java nemusí implementovať žiadne špeciálne rozhranie. Jedinou požiadavkou je, aby bola metóda Java verejná a statická.

Trieda TestBean

The TestBean trieda má verejnú metódu pomenovanú testovacia metóda(), ktorá sa volá zo stránok JSP uvedených v nasledujúcich častiach. JavaBean má tri pomenované vlastnosti text, čísloa logika. Tieto vlastnosti upravuje testovacia metóda(), ktorý vráti reťazec obsahujúci upravené hodnoty troch vlastností:

balíček com.devsphere.articles.calltag; public class TestBean {private String text; súkromné ​​int číslo; súkromná logická logika; public TestBean () {text = ""; číslo = 0; logika = nepravda; } public String getText () {návratový text; } public void setText (textový reťazec) {this.text = text; } public int getNumber () {vratne cislo; } public void setNumber (int číslo) {this.number = number; } public boolean getLogic () {return logic; } public void setLogic (logická logika) {this.logic = logika; } public String testMethod (text reťazca, číslo int, logická logika) setText (getText () + text); setNumber (getNumber () + číslo); setLogic (getLogic ()} 

Trieda TestFunction

Pretože JSP 2.0 EL umožňuje iba volanie statických metód, TestBeanje testovacia metóda() musia byť zabalené statickou metódou. The Testovacia funkcia trieda poskytuje taký statický obal, ktorý berie rovnaké parametre ako metóda bean plus objekt bean, ktorého metóda sa musí volať:

balíček com.devsphere.articles.calltag; public class TestFunction {public static String testMethod (objekt TestBean, text reťazca, int číslo, logická logika) {návrat object.testMethod (text, číslo, logika); }} 

Zostavené TestFunction.class súbor musí byť vložený spolu s TestBean.class do webových aplikácií / WEB-INF / triedy adresár. Alternatívne môžu byť dva súbory triedy zabalené do súboru jar a uložené v priečinku / WEB-INF / lib.

Testovacia funkcia JSP

Pred zavolaním na testovacia metóda() funkcia, TestFunction.jsp stránka musí špecifikovať predponu funkcie a knižničný identifikátor zdroja (URI):

The značka vytvorí inštanciu súboru TestBean trieda:

The testovacia metóda() funkcia sa volá dvakrát. Prvé volanie dostane niekoľko konštantných parametrov, zatiaľ čo druhé volanie získa hodnoty vlastností fazule ako parametre:

  $ {tf: testMethod (obj, "abc", 123, true)} 
$ {tf: testMethod (obj, obj.text, obj.number, obj.logic)}

The TestFunction.jsp stránka produkuje nasledujúci výstup HTML:

  abc 123 pravda 
abcabc 246 pravda

Testovacia funkcia TLD

Ako už bolo spomenuté, funkcia JSP musí byť deklarovaná v deskriptore knižnice značiek. The TestFunction.tld súbor definuje nejaké číslo verzie, tf krátky názov používaný na stránkach JSP ako predpona pre testovacia metóda(), URI knižnice, názov funkcie, názov triedy obsahujúcej statickú metódu a podpis metódy. URI nemusí odkazovať na existujúci webový zdroj, musí však byť jedinečný. Rovnaký URI nemusíte používať pre dve rôzne knižnice značiek.

Tu je TestFunction.tld obsah súboru:

  1,0 tf //devsphere.com/articles/calltag/TestFunction.tld testMethod com.devsphere.articles.calltag.TestFunction java.lang.String testMethod (com.devsphere.articles.calltag.TestBean, java.lang.String, int, boolean) 

The TestFunction.tld súbor musí byť vložený do webovej aplikácie / WEB-INF adresár. Rovnaký adresár obsahuje aj súbor web.xml deskriptor aplikácie, ktorý deklaruje knižnicu v rámci a element. Identifikátor URI, ktorý identifikuje knižnicu na stránkach JSP, a umiestnenie súboru TLD sú špecifikované v dvoch samostatných prvkoch XML, a :

  //devsphere.com/articles/calltag/TestFunction.tld /WEB-INF/TestFunction.tld 

Používajte vlastné značky

Knižnice značiek boli zavedené programom JSP 1.1, ktorý definoval Označiť a BodyTag rozhrania. Pridané JSP 1.2 IterationTag a podpora zachytávania výnimiek. Tieto rozhrania majú obslužné metódy ako napr doStartTag (), doInitBody (), doAfterBody ()a doEndTag (). Keď pochopíte, ako by sa mali tieto metódy implementovať, je ľahké vytvoriť knižnice značiek. Mnoho vývojárov však považovalo mechanizmus spracovania značiek JSP 1.x za zbytočne zložitý.

JSP 2.0 predstavil oveľa jednoduchší protokol na spracovanie značiek. Ak predĺžite SimpleTagSupport triedy, stačí implementovať doTag () spôsob manipulácie so značkou JSP.

Trieda TestMethodTag

The TestMethodTag.jsp stránka volá testovacia metóda() Metóda JavaBean s nasledujúcou syntaxou:

Keď aplikačný server preloží stránku JSP na servlet, vyššie uvedená značka sa nahradí fragmentom kódu Java, ktorý volá metódy TestMethodTag inštancia vytvorená pre manipuláciu so značkou.

Obsluha značiek rozširuje API JSP 2.0 SimpleTagSupport triedy a definuje jedno pole pre každý atribút. Tieto polia zachovajú hodnoty atribútov značiek:

balíček com.devsphere.articles.calltag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; verejná trieda TestMethodTag rozširuje SimpleTagSupport {súkromný objekt TestBean; súkromný textový reťazec; súkromné ​​int číslo; súkromná logická logika; 

Pre každý atribút značky musí existovať metóda set, ktorá získa hodnotu atribútu a uloží ju do poľa, aby ju obslužný program značiek mohol neskôr použiť:

 public void setObject (objekt TestBean) {this.object = objekt; } public void setText (textový reťazec) {this.text = text; } public void setNumber (int číslo) {this.number = number; } public void setLogic (logická logika) {this.logic = logika; } 

Po nastavení atribútov obsluhy značiek, fragment Java (vyplývajúci zo značky JSP) vyvolá obsluhu značky doTag () metóda, ktorá volá fazuľovú metódu. The doTag () metóda vytlačí hodnotu reťazca vrátenú testovacia metóda(). Preto výstup JSP obsahuje vrátenú hodnotu:

 public void doTag () hodí JspException, IOException {String ret = object.testMethod (text, number, logic); JspWriter out = getJspContext (). GetOut (); out.println (ret); }} 

Trieda TestMethodTag2

Predpokladajme, že chcete použiť hodnotu vrátenú metódou bean v JSP. Možno ho budete musieť napríklad odovzdať ako hodnotu atribútu inej značke. Alebo môžete chcieť ovládať jeho výstup na stránke JSP:

 ... $ {ret} ... 
$config[zx-auto] not found$config[zx-overlay] not found