Programmēšana

Zvaniet uz JavaBean metodēm no JSP 2.0 lapām

Jaunajā JavaServer Pages (JSP) versijā ir iekļauta izteiksmes valoda (EL), kuru ieviesa JSP Standard Tag Library (JSTL), lai Web dizaineri ļautu izveidot bez skripta JSP lapas, kurās nav Java koda. Tā kā JSP 2.0 nodrošina savietojamību ar JSP 1.x, jūs joprojām varat savās lapās iekļaut Java fragmentus, taču tagu apstrādātāji un JavaBean komponenti ir daudz labākas vietas Java balstītai funkcionalitātei.

JSP 2.0 nodrošina jaunus tagu apstrādātāju līdzekļus, piemēram, dinamiskos atribūtus, vienkāršo izsaukšanas protokolu un .tag failus. Jūs joprojām izmantojat vecās JSP 1.0 standarta darbības, lai izveidotu JavaBean gadījumus un iestatītu to rekvizītus, taču tagad jūs varat piekļūt pupiņu īpašībām, pieprasījumu parametriem un JSP atribūtiem / mainīgajiem ar jauno izteiksmes valodu.

Visi šie JSP tehnoloģiju uzlabojumi ļauj sasniegt mērķi atdalīt JSP / HTML marķējumu no Java koda. Tomēr pietrūkst vienas lietas. JSP 2.0 nav sintakses, lai izsauktu publisku nestatisku JavaBean metodi no JSP lapas bez skripta. Šis raksts atrisina šo problēmu, nodrošinot vienkāršu JSP 2.0 tagu ar dinamiskiem atribūtiem.

Piezīme: Šī raksta avota kodu varat lejupielādēt vietnē Resursi.

Nepieciešama izteiksmes valoda

Pieņemsim, ka jums ir java.util.List Piemēram, jums jāiesniedz kā HTML saraksts. Šeit ir ātrs risinājums, kura pamatā ir JSP 1.x:

Esošās JSP bāzes tīmekļa lietojumprogrammas sastāv no Java koda, kas sajaukts ar HTML marķējumu, tāpat kā iepriekš minētais koda fragments. Simtiem tādu lapu uzturēšana var būt murgs, ja jums ir atsevišķas Java izstrādes un Web dizaina komandas. Risinājums ir pārvietot Java kodu tagu bibliotēkās, lai izstrādātāji varētu paveikt savus darbus, neielīmējot Java kodu vietnēs, un dizaineri varētu rediģēt savas tīmekļa lapas, neuztraucoties par Java koda pārkāpšanu.

Tomēr JSP 1.x ir vairākas problēmas, kas neļauj jums viegli izstrādāt bezskriptu JSP lapas. Vēl nesen nebija standarta metodes piekļuvei Java objektiem no JSP lapas, neizmantojot Java kodu. Turklāt tagu apstrādātāju klases kodēšana nebija tik vienkārša, kā tas varēja būt.

Turpmākās koda rindas ir balstītas uz JSTL 1.0, kuru var izmantot ar JSP 1.2. The tag atkārtojas pār dotā elementiem sarakstā un eksportē elem mainīgais katram elementam. Deklarēšanas vietā elem kā lokāls mainīgais, tag izveido lapas atribūtu ar pageContext.setAttribute (). Šī atribūta vērtība tiek drukāta ar JSTL tags:

JSTL nodrošina standarta tagus XML dokumentu apstrādei un piekļuvei relāciju datu bāzēm, kā arī formatēšanas tagus, internacionalizācijas tagus, nosacītos tagus, iteratora tagus, ar URL saistītos tagus un citus vispārējas nozīmes tagus. JSTL ir atrisinājis daudzas JSP 1.x problēmas ar izteiksmes valodas palīdzību, kas ļauj piekļūt Java objektiem no JSP lapām, neizmantojot Java kodu. Piemēram, tā vietā, lai meklētu atribūtu vai piekļūtu pieprasījuma parametram ar:

tagad varat izmantot:

$ {a} $ {param.p} 

Jūs varat piekļūt JSP lapas konteksta objektiem, lapas / pieprasījuma / sesijas / lietojumprogrammas atribūtiem (kurus sauc arī par JSP mainīgajiem), JavaBean rekvizītiem, kolekcijas elementiem, pieprasījuma parametriem, inicializācijas parametriem, sīkfailiem un HTTP galvenēm.

Izmantojot JSP 1.2, izteiksmes valoda ir pieejama tikai uz JSTL balstītām lietojumprogrammām un tagu bibliotēkām. JSP 2.0 padara EL pieejamu visām JSP lietojumprogrammām un visām tagu bibliotēkām (ieskaitot vecās taglibs, kas paredzētas JSP 1.x). JSP 2.0 arī vienkāršo tagu bibliotēkas izstrādi, kā redzēsit vēlāk šajā rakstā.

Kopš pirmās versijas JSP ir nodrošinājis standarta tagus JavaBeans izmantošanai JSP lapās. Izmantojot, varat izveidot vai atrast JavaBean gadījumus , un pēc tam jūs varat iegūt un iestatīt to īpašības ar un . Izmantojot JSP 2.0, jūs varat iegūt īpašuma vērtību arī ar:

$ {bean.property} 

Papildus rekvizītiem JavaBean komponentiem ir publiskas metodes, kuras bieži jāizsauc no JSP lapām. Šī raksta atlikušajā daļā tiks parādīti trīs veidi, kā izsaukt JavaBean metodes, neizmantojot Java kodu. Viens no tiem ir balstīts uz JSP 2.0 atbalstu funkcijām, kas ir EL konstrukcijas, kas ļauj izsaukt Java klases statiskās metodes. Cits risinājums izmanto pielāgotus tagus, kas metodes parametrus iegūst kā tagu atribūtus. Trešais veids ir balstīts uz vispārīgu tagu, kas ļauj no JSP lapas izsaukt jebkuru jebkuras JavaBean klases publisko metodi.

Izmantojiet funkcijas

Sākotnējā JSTL 1.0 EL trūka atbalsta funkcijām. JSP 2.0 EL ļauj izsaukt Java klases publisko statisko metodi, izmantojot šādu sintaksi:

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

JSP funkcija ir jādeklarē tagu bibliotēkas aprakstā (TLD):

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

Java klasei nav jāievieš īpašs interfeiss. Vienīgā prasība ir padarīt Java metodi publisku un statisku.

TestBean klase

The TestBean klasei ir publiska metode ar nosaukumu pārbaudes metode(), kas tiek izsaukts no nākamajās sadaļās norādītajām JSP lapām. JavaBean ir nosaukti trīs rekvizīti tekstu, numuru, un loģika. Šīs īpašības modificē pārbaudes metode(), kas atgriež virkni, kurā ir trīs rekvizītu modificētās vērtības:

pakete com.devsphere.articles.calltag; publiskā klase TestBean {privāts virknes teksts; privāts int numurs; privāta loģiskā loģika; publiskais TestBean () {text = ""; skaitlis = 0; loģika = nepatiesa; } public String getText () {return text; } public void setText (String text) {this.text = text; } public int getNumber () {atgriešanās numurs; } public void setNumber (int numurs) {this.number = numurs; } public boolean getLogic () {return logic; } public void setLogic (Būla loģika) {this.logic = loģika; } public String testMethod (String text, int number, Boolean logic) setText (getText () + text); setNumber (getNumber () + numurs); setLogic (getLogic ()} 

TestFunction klase

Tā kā JSP 2.0 EL ļauj izsaukt tikai statiskas metodes, TestBean's pārbaudes metode() jāiesaiņo ar statisku metodi. The TestFunction klase nodrošina tādu statisku iesaiņojumu, kurā ņemti tādi paši parametri kā pupiņu metodei un pupiņu objektam, kura metode jāsauc:

pakete com.devsphere.articles.calltag; public class TestFunction {public static String testMethod (TestBean objekts, String text, int numurs, Būla loģika) {return object.testMethod (teksts, skaitlis, loģika); }} 

Sastādīts TestFunction.class fails jāievieto kopā ar TestBean.class Web lietojumprogrammā / WEB-INF / nodarbības direktorijā. Kā alternatīvu abus klases failus var iesaiņot burku failā un saglabāt / WEB-INF / lib.

TestFunction JSP

Pirms zvanīšanas uz pārbaudes metode() funkcija TestFunction.jsp lapā jānorāda funkcijas prefikss un bibliotēkas vienotais resursu identifikators (URI):

The tag izveido TestBean klase:

The pārbaudes metode() funkcija tiek izsaukta divreiz. Pirmais zvans iegūst dažus nemainīgus parametrus, bet otrais izsauc pupu īpašību vērtības kā parametrus:

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

The TestFunction.jsp lapa rada šādu HTML izvadi:

  abc 123 taisnība 
abcabc 246 taisnība

TestFunction TLD

Kā minēts iepriekš, JSP funkcija ir jādeklarē tagu bibliotēkas aprakstā. The TestFunction.tld fails nosaka kādu versijas numuru, tf īss nosaukums, kas JSP lapās izmantots kā prefikss pārbaudes metode(), bibliotēkas URI, funkcijas nosaukums, klases nosaukums, kurā ir statiskā metode, un metodes paraksts. URI nav jānorāda uz esošu tīmekļa resursu, taču tam jābūt unikālam. Divām dažādām tagu bibliotēkām nevar izmantot vienu un to pašu URI.

Šeit ir TestFunction.tld faila saturs:

  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, būla) 

The TestFunction.tld fails jāievieto tīmekļa lietojumprogrammās / WEB-INF direktorijā. Tajā pašā direktorijā ir arī web.xml lietojumprogrammas deskriptors, kas deklarē bibliotēku a elements. URI, kas identificē bibliotēku JSP lapās, un TLD faila atrašanās vieta ir norādīta divos atsevišķos XML elementos: un :

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

Izmantojiet pielāgotus tagus

Tagu bibliotēkas ieviesa JSP 1.1, kas definēja Atzīmēt un BodyTag saskarnes. Pievienots JSP 1.2 AtkārtojumsTag un atbalsts izņēmumu ķeršanai. Šīm saskarnēm ir tādas apstrādātāju metodes kā doStartTag (), doInitBody (), doAfterBody (), un doEndTag (). Kad esat sapratis, kā šīs metodes jāievieš, ir viegli izveidot tagu bibliotēkas. Tomēr daudzi izstrādātāji uzskatīja JSP 1.x tagu apstrādes mehānismu par nevajadzīgi sarežģītu.

JSP 2.0 ieviesa daudz vienkāršāku tagu apstrādes protokolu. Ja jūs pagarināt SimpleTagSupport klasē, jums vienkārši jāievieš doTag () metode, kā apstrādāt JSP tagu.

TestMethodTag klase

The TestMethodTag.jsp lappuses zvani pārbaudes metode() JavaBean metode, izmantojot šādu sintaksi:

Kad lietojumprogrammu serveris tulko JSP lapu servletī, iepriekšminēto tagu aizstāj ar Java koda fragmentu, kas izsauc a TestMethodTag eksemplārs, kas izveidots, lai apstrādātu tagu.

Tagu apstrādātājs paplašina JSP 2.0 API SimpleTagSupport klase un katram atribūtam nosaka vienu lauku. Šie lauki saglabās tagu atribūtu vērtības:

pakete com.devsphere.articles.calltag; importēt javax.servlet.jsp.JspException; importēt javax.servlet.jsp.JspWriter; importēt javax.servlet.jsp.tagext.SimpleTagSupport; importēt java.io.IOException; publiskā klase TestMethodTag paplašina objektu SimpleTagSupport {private TestBean; privāts virknes teksts; privātais int numurs; privāta loģiskā loģika; 

Katram taga atribūtam ir jābūt noteiktai metodei, kas iegūst atribūta vērtību un saglabā to laukā, lai tagu apstrādātājs to varētu izmantot vēlāk:

 public void setObject (TestBean objekts) {this.object = objekts; } public void setText (String text) {this.text = text; } public void setNumber (int numurs) {this.number = numurs; } public void setLogic (Būla loģika) {this.logic = loģika; } 

Pēc tagu apstrādātāja atribūtu iestatīšanas Java fragments (kas izriet no JSP taga) izsauc tagu apstrādātāju doTag () metodi, kas izsauc pupu metodi. The doTag () metode izdrukā virknes vērtību, kuru atgrieza pārbaudes metode(). Tāpēc JSP izvade satur atgriezto vērtību:

 public void doTag () izmet JspException, IOException {String ret = object.testMethod (teksts, skaitlis, loģika); JspWriter out = getJspContext (). GetOut (); out.println (ret); }} 

TestMethodTag2 klase

Pieņemsim, ka JSP vēlaties izmantot vērtību, ko atgrieza pupiņu metode. Piemēram, jums, iespējams, būs jānodod tā kā atribūta vērtība citam tagam. Vai arī, iespējams, vēlēsities kontrolēt tā izvadi JSP lapā:

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