Programavimas

Iškvieskite „JavaBean“ metodus iš JSP 2.0 puslapių

Naujoje „JavaServer Pages“ (JSP) versijoje yra išraiškos kalba (EL), kurią įvedė JSP standartinė žymų biblioteka (JSTL), kad interneto dizaineriai galėtų kurti be scenarijų JSP puslapius, kuriuose nėra „Java“ kodo. Kadangi „JSP 2.0“ užtikrina atgalinį suderinamumą su „JSP 1.x“, vis tiek galite įtraukti „Java“ fragmentus į savo puslapius, tačiau žymų tvarkytuvai ir „JavaBean“ komponentai yra daug geresnės vietos „Java“ funkcijoms.

JSP 2.0 teikia naujas žymių tvarkytuvų funkcijas, tokias kaip dinaminiai atributai, paprastas iškvietimo protokolas ir .žyma failus. Jūs vis dar naudojate senus „JSP 1.0“ standartinius veiksmus kurdami „JavaBean“ egzempliorius ir nustatydami jų ypatybes, tačiau dabar galite prieiti prie pupelių ypatybių, užklausos parametrų ir JSP atributų / kintamųjų naudodami naują išraiškos kalbą.

Visi šie JSP technologijos patobulinimai leidžia pasiekti tikslą atskirti JSP / HTML žymėjimą nuo „Java“ kodo. Tačiau trūksta vieno dalyko. JSP 2.0 neturi sintaksės, kaip paskambinti viešam nestatiniam „JavaBean“ metodui iš scenarijaus neturinčio JSP puslapio. Šis straipsnis išsprendžia šią problemą pateikdamas paprastą JSP 2.0 žymą su dinaminiais atributais.

Pastaba: Šio straipsnio šaltinio kodą galite atsisiųsti iš išteklių.

Reikalinga išraiškos kalba

Tarkime, kad turite java.util.Sąrašas egzempliorių turite pateikti kaip HTML sąrašą. Čia yra greitas sprendimas, pagrįstas JSP 1.x:

Esamas JSP pagrįstas žiniatinklio programas sudaro „Java“ kodas, sumaišytas su HTML žymėjimu, kaip ir aukščiau pateiktas kodo fragmentas. Šimtų tokių puslapių išlaikymas gali būti košmaras, jei turite atskiras „Java“ kūrimo ir interneto dizaino komandas. Sprendimas yra perkelti „Java“ kodą į žymų bibliotekas, kad kūrėjai galėtų atlikti savo darbus neįklijuodami „Java“ kodo tinklalapiuose, o dizaineriai galėtų redaguoti savo tinklalapius, nesijaudindami dėl „Java“ kodo sulaužymo.

Tačiau „JSP 1.x“ turi keletą problemų, kurios neleidžia lengvai kurti scenarijaus neturinčių JSP puslapių. Iki šiol nebuvo jokio standartinio metodo, kaip pasiekti „Java“ objektus iš JSP puslapio nenaudojant „Java“ kodo. Be to, žymos tvarkytuvų klasių kodavimas nebuvo toks paprastas, koks galėjo būti.

Šios kodo eilutės yra pagrįstos JSTL 1.0, kurią galima naudoti su JSP 1.2. žyma kartojasi per duoto elementus sąrašą ir eksportuoja elem kintamasis kiekvienam elementui. Užuot deklaravęs elem kaip vietinis kintamasis, žymė sukuria puslapio atributą su pageContext.setAttribute (). Šio atributo vertė spausdinama naudojant JSTL žymė:

JSTL teikia standartines žymes, skirtas XML dokumentams apdoroti ir prieigai prie reliacinių duomenų bazių, taip pat formatavimo žymas, tarptautinimo žymas, sąlygines žymas, iteratoriaus žymas, su URL susijusias žymas ir kitas bendrosios paskirties žymas. JSTL išsprendė daugelį „JSP 1.x“ problemų naudodamas išraiškos kalbą, kuri leidžia jums pasiekti „Java“ objektus iš JSP puslapių nenaudojant „Java“ kodo. Pvz., Užuot ieškoję atributo ar pasiekę užklausos parametrą naudodami:

dabar galite naudoti:

$ {a} $ {param.p} 

Galite pasiekti JSP puslapio konteksto objektus, puslapio / užklausos / seanso / programos atributus (dar vadinamus JSP kintamaisiais), „JavaBean“ ypatybes, rinkinio elementus, užklausos parametrus, inicializavimo parametrus, slapukus ir HTTP antraštes.

Naudojant JSP 1.2, išraiškos kalba prieinama tik JSTL pagrįstoms programoms ir žymų bibliotekoms. „JSP 2.0“ suteikia EL galimybę naudotis visomis JSP programomis ir visomis žymų bibliotekomis (įskaitant senus „Taglibs“, skirtus JSP 1.x). JSP 2.0 taip pat supaprastina žymių bibliotekos kūrimą, kaip pamatysite vėliau šiame straipsnyje.

Nuo pirmosios versijos JSP pateikė standartines žymas, skirtas naudoti „JavaBeans“ JSP puslapiuose. Galite sukurti arba rasti „JavaBean“ egzempliorių naudodami ir tada galite gauti ir nustatyti jų ypatybes naudodami ir . Naudodami „JSP 2.0“, jūs taip pat galite gauti turto vertę:

$ {bean.property} 

Be savybių, „JavaBean“ komponentai turi viešus metodus, kuriuos dažnai reikia iškviesti iš JSP puslapių. Likusioje šio straipsnio dalyje bus pateikti trys būdai, kaip iškviesti „JavaBean“ metodus nenaudojant „Java“ kodo. Vienas jų yra pagrįstas JSP 2.0 palaikymu funkcijoms, kurios yra EL konstrukcijos, leidžiančios iškviesti statinius „Java“ klasių metodus. Kitas sprendimas naudoja pasirinktines žymas, kurios metodo parametrus gauna kaip žymos atributus. Trečiasis būdas pagrįstas bendrine žyma, leidžiančia iš JSP puslapio iškviesti bet kurį viešą bet kurios „JavaBean“ klasės metodą.

Naudokite funkcijas

Pradiniame JSTL 1.0 EL trūko funkcijų palaikymo. JSP 2.0 EL leidžia iškviesti „Java“ klasės viešąjį statinį metodą naudojant šią sintaksę:

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

JSP funkcija turi būti deklaruota žymos bibliotekos apraše (TLD):

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

„Java“ klasei nereikia įdiegti jokios specialios sąsajos. Vienintelis reikalavimas yra padaryti „Java“ metodą viešą ir statinį.

„TestBean“ klasė

TestBean klasė turi viešą metodą, pavadintą Bandymo metodas(), kuris iškviečiamas iš JSP puslapių, pateiktų tolesniuose skyriuose. „JavaBean“ turi tris ypatybes tekstas, numerisir logika. Šias savybes modifikuoja Bandymo metodas(), kuri pateikia eilutę, kurioje yra trys ypatybių modifikuotos reikšmės:

paketas com.devsphere.articles.calltag; public class TestBean {private String text; privatus int numeris; privati ​​loginė logika; public TestBean () {text = ""; skaičius = 0; logika = klaidinga; } public String getText () {return text; } public void setText (String text) {this.text = text; } public int getNumber () {grąžinimo numeris; } public void setNumber (int numeris) {this.number = skaičius; } public Boolean getLogic () {grįžimo logika; } public void setLogic (loginė logika) {this.logic = logika; } public String testMethod (eilutės tekstas, int numeris, loginė logika) setText (getText () + text); setNumber (getNumber () + skaičius); setLogic (getLogic ()} 

„TestFunction“ klasė

Kadangi JSP 2.0 EL leidžia skambinti tik statiniais metodais, TestBean's Bandymo metodas() turi būti apgaubtas statiniu metodu. „TestFunction“ klasėje yra toks statinis apvalkalas, kuris naudoja tuos pačius parametrus kaip pupelių metodas ir pupelių objektas, kurio metodą reikia vadinti:

paketas com.devsphere.articles.calltag; public class TestFunction {public static String testMethod (TestBean object, String text, int number, Boolean logic) {return object.testMethod (text, number, logic); }} 

Sudarė „TestFunction.class“ byla turi būti dedama kartu su TestBean.class į žiniatinklio programą / WEB-INF / užsiėmimai kataloge. Kaip alternatyvą, dvi klasių rinkmenas galima supakuoti į stiklainį ir laikyti / WEB-INF / lib.

„TestFunction JSP“

Prieš skambindami Bandymo metodas() funkcija „TestFunction.jsp“ puslapyje turi būti nurodytas funkcijos priešdėlis ir bibliotekos vienodas išteklių identifikatorius (URI):

žymė sukuria TestBean klasė:

Bandymo metodas() funkcija iškviečiama du kartus. Pirmasis skambutis gauna keletą pastovių parametrų, o antrasis skambutis gauna pupelių savybių vertes kaip parametrus:

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

„TestFunction.jsp“ puslapyje pateikiama tokia HTML išvestis:

  abc 123 tiesa 
abcabc 246 tiesa

TestFunction TLD

Kaip minėta anksčiau, JSP funkcija turi būti deklaruota žymos bibliotekos apraše. TestFunction.tld failas apibrėžia tam tikrą versijos numerį tf trumpasis pavadinimas, naudojamas JSP puslapiuose kaip priešdėlis Bandymo metodas(), bibliotekos URI, funkcijos pavadinimą, klasės, kurioje yra statinis metodas, pavadinimą ir metodo parašą. URI nebūtina nurodyti į esamą žiniatinklio šaltinį, tačiau jis turi būti unikalus. Negalite naudoti to paties URI dviem skirtingoms žymų bibliotekoms.

Čia yra TestFunction.tld failo turinys:

  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, loginė) 

TestFunction.tld failas turi būti įdėtas į žiniatinklio programą / WEB-INF kataloge. Tame pačiame kataloge yra ir web.xml programos aprašas, kuris deklaruoja biblioteką per elementas. URI, identifikuojantis biblioteką JSP puslapiuose, ir TLD failo vieta nurodomi dviejuose atskiruose XML elementuose, ir :

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

Naudokite tinkintas žymas

Žymų bibliotekas pristatė JSP 1.1, apibrėžusi Žyma ir „BodyTag“ sąsajos. Pridėta JSP 1.2 „IterationTag“ ir parama gaudant išimtis. Šios sąsajos turi tokius tvarkymo metodus kaip „doStartTag“ (), doInitBody (), doAfterBody ()ir „doEndTag“ (). Kai suprasite, kaip šie metodai turėtų būti įgyvendinti, lengva sukurti žymių bibliotekas. Tačiau daugelis kūrėjų manė, kad „JSP 1.x“ žymų tvarkymo mechanizmas yra be reikalo sudėtingas.

JSP 2.0 pristatė daug paprastesnį žymenų tvarkymo protokolą. Jei prailginsite „SimpleTagSupport“ klasę, jūs tiesiog turite įgyvendinti „doTag“ () JSP žymos tvarkymo metodas.

„TestMethodTag“ klasė

„TestMethodTag.jsp“ puslapis skambina Bandymo metodas() „JavaBean“ metodas, naudojant šią sintaksę:

Kai programų serveris išverčia JSP puslapį į servletą, aukščiau nurodyta žyma pakeičiama „Java“ kodo fragmentu, kuriame iškviečiami „TestMethodTag“ sukurtas egzempliorius, skirtas apdoroti žymą.

Žymų tvarkytuvas išplečia JSP 2.0 API „SimpleTagSupport“ klasę ir kiekvienam atributui nustato vieną lauką. Šie laukai išlaikys žymos atributų vertes:

paketas com.devsphere.articles.calltag; importuoti javax.servlet.jsp.JspException; importuoti javax.servlet.jsp.JspWriter; importuoti javax.servlet.jsp.tagext.SimpleTagSupport; importuoti java.io.IOException; viešoji klasė „TestMethodTag“ išplečia „SimpleTagSupport“ {privatų „TestBean“ objektą; privati ​​eilutės tekstas; privatus int numeris; privati ​​loginė logika; 

Kiekvienam žymos atributui turi būti nustatytas metodas, kuris gauna atributo vertę ir ją saugo lauke, kad žymų tvarkytojas galėtų ją naudoti vėliau:

 public void setObject („TestBean“ objektas) {this.object = objektas; } public void setText (String text) {this.text = text; } public void setNumber (int numeris) {this.number = skaičius; } public void setLogic (loginė logika) {this.logic = logika; } 

Nustačius žymų tvarkytuvo atributus, „Java“ fragmentas (gautas iš JSP žymos) iškviečia žymų tvarkytuvą „doTag“ () metodas, kuris vadina pupelių metodu. „doTag“ () metodas spausdina eilutės vertę, kurią grąžino Bandymo metodas(). Todėl JSP išvestyje yra grąžinta vertė:

 public void doTag () meta JspException, IOException {String ret = object.testMethod (tekstas, skaičius, logika); JspWriter out = getJspContext (). GetOut (); out.println (ret); }} 

„TestMethodTag2“ klasė

Tarkime, kad JSP norite naudoti pupelių metodu grąžintą vertę. Pvz., Gali tekti perduoti ją kaip atributo vertę kitai žymai. Arba galbūt norėsite valdyti jo išvestį JSP puslapyje:

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