Programování

Volání metod JavaBean ze stránek JSP 2.0

Nová verze JavaServer Pages (JSP) obsahuje výrazový jazyk (EL) zavedený knihovnou standardních značek JSP (JSTL), která umožňuje webovým návrhářům vytvářet bezskriptové stránky JSP, které neobsahují kód Java. Vzhledem k tomu, že JSP 2.0 poskytuje zpětnou kompatibilitu s JSP 1.x, můžete na své stránky stále zahrnovat fragmenty Java, ale obslužné rutiny značek a komponenty JavaBean jsou mnohem lepšími místy pro funkčnost založenou na Javě.

JSP 2.0 poskytuje pro obsluhu značek nové funkce, jako jsou dynamické atributy, protokol Simple Invocation Protocol a .štítek soubory. Pro vytváření instancí JavaBean a nastavení jejich vlastností stále používáte staré standardní akce JSP 1.0, ale nyní můžete přistupovat k vlastnostem fazole, požadovat parametry a atributy / proměnné JSP pomocí nového jazyka výrazu.

Všechna tato vylepšení technologie JSP vám umožní dosáhnout cíle oddělení kódu JSP / HTML od kódu Java. Jedna věc však chybí. JSP 2.0 nemá žádnou syntaxi pro volání veřejné nestatické metody JavaBean ze stránky JSP bez skriptu. Tento článek řeší tento problém poskytnutím jednoduché značky JSP 2.0 s dynamickými atributy.

Poznámka: Zdrojový kód tohoto článku si můžete stáhnout ze zdrojů.

Vyžaduje se výrazový jazyk

Předpokládejme, že máte java.util.List instance musíte uvést jako seznam HTML. Zde je rychlé řešení založené na JSP 1.x:

Stávající webové aplikace založené na JSP se skládají z kódu Java smíchaného se značkami HTML, jako je výše uvedený fragment kódu. Údržba stovek takových stránek může být noční můrou, pokud máte samostatné vývojové týmy Java a týmy webového designu. Řešením je přesunout kód Java do knihoven značek, aby vývojáři mohli dělat svou práci bez vkládání kódu Java na webové stránky a návrháři mohli upravovat své webové stránky bez obav z porušení kódu Java.

JSP 1.x má však několik problémů, které vám nedovolí snadno vyvinout stránky JSP bez skriptů. Až donedávna neexistovala žádná standardní metoda pro přístup k objektům Java ze stránky JSP bez použití kódu Java. Třídy obsluhy kódování značek navíc nebyly tak jednoduché, jak by mohly být.

Následující řádky kódu jsou založeny na JSTL 1.0, který lze použít s JSP 1.2. The tag iteruje nad prvky daného seznam a exportuje elem proměnná pro každý prvek. Místo deklarace elem jako lokální proměnná značka vytvoří atribut stránky s pageContext.setAttribute (). Hodnota tohoto atributu je vytištěna s JSTL štítek:

JSTL poskytuje standardní značky pro zpracování dokumentů XML a přístup k relačním databázím spolu s formátovacími značkami, značkami pro internacionalizaci, podmíněnými značkami, značkami iterátorů, značkami souvisejícími s URL a dalšími značkami pro všeobecné účely. JSTL vyřešil mnoho problémů JSP 1.x pomocí výrazového jazyka, který umožňuje přístup k objektům Java ze stránek JSP bez použití kódu Java. Například místo hledání atributu nebo přístupu k parametru požadavku pomocí:

nyní můžete použít:

$ {a} $ {param.p} 

Můžete přistupovat k kontextovým objektům stránky JSP, atributům stránky / požadavku / relace / aplikace (také známým jako proměnné JSP), vlastnostem JavaBean, prvkům kolekce, parametrům požadavku, inicializačním parametrům, cookies a hlavičkám HTTP.

S JSP 1.2 je jazyk výrazu k dispozici pouze aplikacím a knihovnám značek založeným na JSTL. JSP 2.0 zpřístupňuje EL všem aplikacím JSP a všem knihovnám značek (včetně starých taglibs určených pro JSP 1.x). JSP 2.0 také zjednodušuje vývoj knihovny značek, jak uvidíte dále v tomto článku.

Od své první verze poskytuje JSP standardní značky pro používání JavaBeans na stránkách JSP. Instance JavaBean můžete vytvořit nebo najít pomocí , a poté můžete získat a nastavit jejich vlastnosti pomocí a . S JSP 2.0 můžete také získat hodnotu vlastnosti s:

$ {bean.property} 

Kromě vlastností mají komponenty JavaBean veřejné metody, které je často nutné volat ze stránek JSP. Zbývající část tohoto článku představí tři způsoby volání metod JavaBean bez použití kódu Java. Jeden je založen na podpoře funkcí JSP 2.0, což jsou konstrukce EL, které umožňují volat statické metody tříd Java. Jiné řešení používá vlastní značky, které získají parametry metody jako atributy značek. Třetí způsob je založen na obecné značce, která vám umožní volat jakoukoli veřejnou metodu jakékoli třídy JavaBean ze stránky JSP.

Používejte funkce

Počáteční JSTL 1.0 EL postrádal podporu funkcí. JSP 2.0 EL umožňuje volat veřejnou statickou metodu třídy Java pomocí následující syntaxe:

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

Funkce JSP musí být deklarována v deskriptoru knihovny značek (TLD):

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

Třída Java nemusí implementovat žádné speciální rozhraní. Jediným požadavkem je, aby byla metoda Java veřejná a statická.

Třída TestBean

The TestBean třída má veřejnou metodu s názvem testovací metoda(), který je volán ze stránek JSP uvedených v následujících částech. JavaBean má tři pojmenované vlastnosti text, číslo, a logika. Tyto vlastnosti upravuje testovací metoda(), který vrací řetězec obsahující upravené hodnoty tří vlastností:

balíček com.devsphere.articles.calltag; veřejná třída TestBean {soukromý text řetězce; soukromé int číslo; soukromá logická logika; public TestBean () {text = ""; číslo = 0; logic = false; } public String getText () {návratový text; } public void setText (text řetězce) {this.text = text; } public int getNumber () {návratové číslo; } public void setNumber (int number) {this.number = number; } public boolean getLogic () {logika návratu; } public void setLogic (logická logika) {this.logic = logika; } public String testMethod (text řetězce, číslo int, logická logika) setText (getText () + text); setNumber (getNumber () + number); setLogic (getLogic ()} 

Třída TestFunction

Protože JSP 2.0 EL umožňuje pouze volání statických metod, TestBeanje testovací metoda() musí být zabaleno statickou metodou. The Testovací funkce class provides such a static wrapper that takes the same parameters as the bean method plus the bean object whose method must be called:

balíček com.devsphere.articles.calltag; veřejná třída TestFunction {public static String testMethod (objekt TestBean, text řetězce, číslo int, logická logika) {návratový objekt.testMethod (text, číslo, logika); }} 

Zkompilovaný TestFunction.class soubor musí být umístěn společně s TestBean.class do webové aplikace / WEB-INF / třídy adresář. Alternativně lze dva soubory třídy zabalit do souboru jar a uložit do / WEB-INF / lib.

Testovací funkce JSP

Před zavoláním na testovací metoda() funkce, TestFunction.jsp stránka musí specifikovat předponu funkce a URI (Uniform Resource Identifier) ​​knihovny:

The značka vytvoří instanci souboru TestBean třída:

The testovací metoda() funkce je volána dvakrát. První volání získá nějaké konstantní parametry, zatímco druhé volání získá hodnoty vlastností fazole jako parametry:

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

The TestFunction.jsp stránka vytvoří následující výstup HTML:

  abc 123 true 
abcabc 246 pravda

Testovací funkce TLD

Jak již bylo zmíněno dříve, funkce JSP musí být deklarována v deskriptoru knihovny značek. The TestFunction.tld soubor definuje nějaké číslo verze, tf zkrácený název používaný na stránkách JSP jako předpona pro testovací metoda(), URI knihovny, název funkce, název třídy obsahující statickou metodu a podpis metody. URI nemusí odkazovat na existující webový prostředek, ale musí být jedinečný. Nemusíte použít stejný URI pro dvě různé knihovny značek.

Zde je TestFunction.tld obsah souboru:

  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 soubor musí být umístěn do webové aplikace / WEB-INF adresář. Stejný adresář také obsahuje web.xml deskriptor aplikace, který deklaruje knihovnu v rámci živel. Identifikátor URI, který identifikuje knihovnu na stránkách JSP, a umístění souboru TLD jsou uvedeny ve dvou samostatných prvcích XML, a :

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

Použijte vlastní značky

Knihovny značek byly zavedeny JSP 1.1, který definoval Štítek a BodyTag rozhraní. Přidáno JSP 1.2 IterationTag a podpora pro chytání výjimek. Tato rozhraní mají metody obslužné rutiny, jako je doStartTag (), doInitBody (), doAfterBody (), a doEndTag (). Jakmile pochopíte, jak by tyto metody měly být implementovány, je snadné vytvářet knihovny značek. Mnoho vývojářů však považovalo mechanismus zpracování značek JSP 1.x za zbytečně složitý.

JSP 2.0 představil mnohem jednodušší protokol pro manipulaci s tagy. Pokud rozšíříte SimpleTagSupport třídy, stačí implementovat doTag () metoda pro manipulaci se značkou JSP.

Třída TestMethodTag

The TestMethodTag.jsp stránka volá testovací metoda() Metoda JavaBean s následující syntaxí:

Když aplikační server převede stránku JSP na servlet, výše uvedená značka se nahradí fragmentem kódu Java, který volá metody TestMethodTag instance vytvořená pro manipulaci se značkou.

Obslužná rutina značky rozšiřuje rozhraní API JSP 2.0 SimpleTagSupport třídy a definuje jedno pole pro každý atribut. Tato pole budou udržovat hodnoty atributů značky:

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; veřejná třída TestMethodTag rozšiřuje SimpleTagSupport {soukromý objekt TestBean; soukromý text řetězce; soukromé int číslo; soukromá logická logika; 

Pro každý atribut značky musí existovat metoda set, která získá hodnotu atributu a uloží ji do pole, aby ji obslužná rutina značky mohla později použít:

 public void setObject (objekt TestBean) {this.object = objekt; } public void setText (text řetězce) {this.text = text; } public void setNumber (int number) {this.number = number; } public void setLogic (logická logika) {this.logic = logika; } 

Po nastavení atributů obslužné rutiny značky vyvolá fragment Java (vyplývající ze značky JSP) obslužnou rutinu značky doTag () metoda, která volá fazolovou metodu. The doTag () metoda vytiskne hodnotu řetězce vrácenou testovací metoda(). Výstup JSP proto obsahuje vrácenou hodnotu:

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

Třída TestMethodTag2

Předpokládejme, že chcete použít hodnotu vrácenou metodou bean v JSP. Možná budete muset například předat jako hodnotu atributu jiné značce. Nebo můžete chtít ovládat jeho výstup na stránce JSP:

 ... $ {ret} ...