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, TestBean
on 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} ...