Ohjelmointi

Kutsu JavaBean-menetelmiä JSP 2.0 -sivuilta

Uusi JavaServer Pages (JSP) -versio sisältää JSP Standard Tag Library (JSTL): n käyttöön ottaman ilmaisukielen (EL), jotta Web-suunnittelijat voivat tuottaa komentosarjottomia JSP-sivuja, jotka eivät sisällä Java-koodia. Koska JSP 2.0 tarjoaa taaksepäin yhteensopivuuden JSP 1.x: n kanssa, saatat silti sisällyttää Java-katkelmia sivuillesi, mutta tunnistekäsittelijät ja JavaBean-komponentit ovat paljon parempia paikkoja Java-pohjaisiin toimintoihin.

JSP 2.0 tarjoaa uusia ominaisuuksia tunnistekäsittelijöille, kuten dynaamiset määritteet, Simple Invocation Protocol ja .tag tiedostot. Käytät edelleen vanhoja JSP 1.0 -standarditoimintoja JavaBean-esiintymien luomiseen ja niiden ominaisuuksien asettamiseen, mutta nyt voit käyttää papuominaisuuksia, pyyntöparametreja ja JSP-attribuutteja / muuttujia uudella lausekekielellä.

Kaikkien näiden JSP-tekniikan parannusten avulla voit saavuttaa tavoitteen erottaa JSP / HTML-merkinnät Java-koodista. Yksi asia puuttuu kuitenkin. JSP 2.0: lla ei ole syntaksia kutsua julkista ei-staattista JavaBean-menetelmää komentosarjattomalta JSP-sivulta. Tämä artikkeli ratkaisee ongelman tarjoamalla yksinkertaisen JSP 2.0 -tunnisteen, jolla on dynaamiset määritteet.

merkintä: Voit ladata tämän artikkelin lähdekoodin Resursseista.

Tarvitaan ilmaisukieli

Oletetaan, että sinulla on java.util.List Esimerkiksi sinun on esitettävä HTML-luettelona. Tässä on nopea ratkaisu, joka perustuu JSP 1.x: ään:

Olemassa olevat JSP-pohjaiset verkkosovellukset koostuvat Java-koodista sekoitettuna HTML-merkintöihin, kuten yllä oleva koodinpätkä. Satojen sellaisten sivujen ylläpito voi olla painajainen, jos sinulla on erilliset Java-kehitystyöryhmät. Ratkaisu on siirtää Java-koodi tag-kirjastoihin, jotta kehittäjät voivat tehdä työnsä liittämättä Java-koodia verkkosivuille ja suunnittelijat voivat muokata verkkosivujaan huolimatta Java-koodin rikkomisesta.

JSP 1.x: llä on kuitenkin useita ongelmia, jotka eivät anna sinun kehittää helposti komentosarjottomia JSP-sivuja. Viime aikoihin asti ei ollut olemassa tavanomaista tapaa käyttää Java-objekteja JSP-sivulta käyttämättä Java-koodia. Lisäksi tunnisteiden käsittelijäluokkien koodaus ei ollut niin yksinkertaista kuin se olisi voinut olla.

Seuraavat koodirivit perustuvat JSTL 1.0: een, jota voidaan käyttää JSP 1.2: n kanssa. tagi iteroituu annetun elementin yli lista ja vie elem muuttuja jokaiselle elementille. Sen sijaan, että julistaisit elem paikallisena muuttujana -tunniste luo sivumääritteen pageContext.setAttribute (). Tämän attribuutin arvo tulostetaan JSTL: llä tag:

JSTL tarjoaa vakiotunnisteet XML-asiakirjojen käsittelemiseksi ja relaatiotietokantojen käyttämiseksi sekä muotoilutunnisteet, kansainvälistämistunnisteet, ehdolliset tagit, iteraattoritagit, URL-osoitteisiin liittyvät tunnisteet ja muut yleiskäyttöiset tagit. JSTL on ratkaissut monet JSP 1.x: n ongelmista ilmaisukielen avulla, jonka avulla voit käyttää Java-objekteja JSP-sivuilta käyttämättä Java-koodia. Esimerkiksi sen sijaan, että etsitään määritettä tai käytettäisiin pyyntöparametriä seuraavilla tavoilla:

voit nyt käyttää:

$ {a} $ {param.p} 

Voit käyttää JSP-sivun kontekstikohteita, sivu / pyyntö / istunto / sovellusattribuutteja (tunnetaan myös nimellä JSP-muuttujat), JavaBean-ominaisuuksia, kokoelmaelementtejä, pyyntöparametreja, alustusparametreja, evästeitä ja HTTP-otsikoita.

JSP 1.2: n kanssa lausekekieli on saatavana vain JSTL-pohjaisiin sovelluksiin ja tunnisteiden kirjastoihin. JSP 2.0 tekee EL: n kaikkien JSP-sovellusten ja kaikkien tunnisteiden kirjastojen (mukaan lukien vanhat JSP 1.x: lle suunnitellut taglibit) saataville. JSP 2.0 myös yksinkertaistaa tagikirjastokehitystä, kuten näet myöhemmin tässä artikkelissa.

Ensimmäisestä versiostaan ​​lähtien JSP on tarjonnut vakiotunnisteita JavaBeansin käyttämiseen JSP-sivuilla. Voit luoda tai löytää JavaBean-esiintymiä , ja sitten voit saada ja asettaa niiden ominaisuudet ja . JSP 2.0: n avulla voit saada kiinteistön arvon myös seuraavilla tavoilla:

$ {bean.property} 

Ominaisuuksien lisäksi JavaBean-komponenteilla on julkisia menetelmiä, jotka on usein kutsuttava JSP-sivuilta. Tämän artikkelin loppuosa esittelee kolme tapaa kutsua JavaBean-menetelmiä käyttämättä Java-koodia. Yksi perustuu JSP 2.0 -tukeen toiminnoille, jotka ovat EL-rakenteita, joiden avulla voit kutsua Java-luokkien staattisia menetelmiä. Toinen ratkaisu käyttää mukautettuja tunnisteita, jotka saavat menetelmän parametrit tagimääritteinä. Kolmas tapa perustuu yleiseen tagiin, jonka avulla voit kutsua minkä tahansa JavaBean-luokan julkisen menetelmän JSP-sivulta.

Käytä toimintoja

Alkuperäisestä JSTL 1.0 EL: stä puuttui toimintojen tuki. JSP 2.0 EL antaa sinun soittaa Java-luokan julkiseen staattiseen menetelmään seuraavaa syntaksia käyttäen:

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

JSP-toiminto on ilmoitettava tunnuskirjaston kuvauksessa (TLD):

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

Java-luokan ei tarvitse toteuttaa mitään erityistä käyttöliittymää. Ainoa vaatimus on tehdä Java-menetelmä julkiseksi ja staattiseksi.

TestBean-luokka

TestBean luokassa on julkinen menetelmä nimeltä testausmenetelmä(), jota kutsutaan seuraavissa osioissa esitetyiltä JSP-sivuilta. JavaBeanilla on kolme ominaisuutta teksti, määräja logiikka. Näitä ominaisuuksia muokkaa testausmenetelmä(), joka palauttaa merkkijonon, joka sisältää kolme ominaisuuden muokattua arvoa:

paketti com.devsphere.articles.calltag; julkinen luokka TestBean {private String text; yksityinen int-numero; yksityinen looginen logiikka; public TestBean () {text = ""; luku = 0; logiikka = väärä; } public String getText () {return text; } public void setText (String text) {this.text = text; } public int getNumber () {palautusnumero; } public void setNumber (int numero) {this.number = numero; } julkinen looginen getLogic () {paluulogiikka; } public void setLogic (looginen logiikka) {this.logic = logiikka; } public String testMethod (String text, int number, boolean logic) setText (getText () + text); setNumber (getNumber () + numero); setLogic (getLogic ()} 

TestFunction-luokka

Koska JSP 2.0 EL sallii vain staattisten menetelmien kutsun, TestBeanon testausmenetelmä() on käärittävä staattiseen menetelmään. TestFunction class tarjoaa sellaisen staattisen kääreen, joka ottaa samat parametrit kuin papumenetelmä ja papuobjekti, jonka menetelmää on kutsuttava:

paketti com.devsphere.articles.calltag; public class TestFunction {public static String testMethod (TestBean-objekti, String-teksti, int-numero, looginen logiikka) {return object.testMethod (teksti, numero, logiikka); }} 

Koottu TestFunction.class tiedosto on sijoitettava yhdessä TestBean.class Web-sovelluksiin / WEB-INF / luokat hakemistoon. Vaihtoehtoisesti nämä kaksi luokkatiedostoa voidaan pakata purkkitiedostoon ja tallentaa / WEB-INF / lib.

TestFunction JSP

Ennen soittamista testausmenetelmä() toiminto, TestFunction.jsp sivulla on määritettävä funktion etuliite ja kirjaston yhtenäinen resurssitunniste (URI):

-tunniste luo TestBean luokka:

testausmenetelmä() toimintoa kutsutaan kahdesti. Ensimmäinen puhelu saa joitain vakioparametreja, kun taas toinen kutsu saa papuominaisuuksien arvot parametreina:

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

TestFunction.jsp sivu tuottaa seuraavan HTML-lähdön:

  abc 123 totta 
abcabc 246 totta

TestFunction TLD

Kuten aiemmin mainittiin, JSP-toiminto on ilmoitettava tag-kirjastokuvaajassa. TestFunction.tld tiedosto määrittää jonkin versionumeron, tf lyhyt nimi, jota käytetään JSP-sivuilla etuliitteeksi testausmenetelmä(), kirjaston URI, funktion nimi, staattisen menetelmän sisältävän luokan nimi ja menetelmän allekirjoitus. URI: n ei tarvitse osoittaa olemassa olevaa verkkoresurssia, mutta sen on oltava ainutlaatuinen. Et voi käyttää samaa URI-tunnusta kahdelle tag-kirjastolle.

Tässä on TestFunction.tld tiedoston sisältö:

  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, looginen) 

TestFunction.tld tiedosto on sijoitettava verkkosovelluksiin / WEB-INF hakemistoon. Samassa hakemistossa on myös web.xml sovelluskuvaaja, joka ilmoittaa kirjaston a elementti. Kirjasto JSP-sivuilla tunnistava URI ja TLD-tiedoston sijainti määritetään kahdessa erillisessä XML-elementissä, ja :

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

Käytä mukautettuja tunnisteita

Tag-kirjastot otettiin käyttöön JSP 1.1: lla, joka määritteli Tag ja BodyTag rajapinnat. JSP 1.2 lisätty IteraatioTag ja tuki poikkeusten saamiseksi. Näillä rajapinnoilla on käsittelijämenetelmiä, kuten doStartTag (), doInitBody (), doAfterBody ()ja doEndTag (). Kun ymmärrät näiden menetelmien toteuttamisen, on helppo luoda tag-kirjastoja. Monet kehittäjät pitivät JSP 1.x: n tagien käsittelymekanismia tarpeettoman monimutkaisena.

JSP 2.0 esitteli paljon yksinkertaisemman tagien käsittelyprotokollan. Jos jatkat SimpleTagSupport luokassa, sinun on vain toteutettava doTag () menetelmä JSP-tunnisteen käsittelemiseksi.

TestMethodTag-luokka

TestMethodTag.jsp sivu kutsuu testausmenetelmä() JavaBean-menetelmä käyttäen seuraavaa syntaksia:

Kun sovelluspalvelin kääntää JSP-sivun servletiksi, yllä oleva tunniste korvataan Java-koodin fragmentilla, joka kutsuu TestMethodTag luotu tagin käsittelyä varten.

Tunnisteiden käsittelijä laajentaa JSP 2.0 -sovellusliittymiä SimpleTagSupport luokka ja määrittelee yhden kentän kullekin määritteelle. Nämä kentät ylläpitävät tagimääritteiden arvoja:

paketti com.devsphere.articles.calltag; tuo javax.servlet.jsp.JspException; tuo javax.servlet.jsp.JspWriter; tuo javax.servlet.jsp.tagext.SimpleTagSupport; tuo java.io.IOException; public class TestMethodTag laajentaa SimpleTagSupport {private TestBean -objektia; yksityinen merkkijono teksti; yksityinen int-numero; yksityinen looginen logiikka; 

Jokaiselle tunnistemääritteelle on oltava asetettu menetelmä, joka hankkii attribuutin arvon ja tallentaa sen kenttään, jotta tunnistekäsittelijä voi käyttää sitä myöhemmin:

 public void setObject (TestBean-objekti) {this.object = objekti; } public void setText (String text) {this.text = text; } public void setNumber (int numero) {this.number = numero; } public void setLogic (looginen logiikka) {this.logic = logiikka; } 

Asetettuaan tunnistekäsittelijän määritteet Java-fragmentti (joka johtuu JSP-tagista) kutsuu tunnistekäsittelijän doTag () method, joka kutsuu papumenetelmää. doTag () method tulostaa merkkijonon, jonka palauttaa testausmenetelmä(). Siksi JSP-lähtö sisältää palautetun arvon:

 public void doTag () heittää JspException, IOException {String ret = object.testMethod (teksti, numero, logiikka); JspWriter out = getJspContext (). GetOut (); out.println (ret); }} 

TestMethodTag2-luokka

Oletetaan, että haluat käyttää papumenetelmän palauttamaa arvoa JSP: ssä. Saatat joutua esimerkiksi välittämään sen attribuutin arvoksi toiselle tagille. Tai haluat ehkä hallita sen tulosta JSP-sivulla:

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