Programiranje

JavaScript v Javi

Nedavna objava JavaLobby Top 10 neizkoriščenih funkcij v Javi je bila izjemno priljubljena. V času pisanja tega prispevka je to najbolje uvrščena objava v kategoriji DZone Top Links. Poleg tega je bil objavljen tudi odgovor nanj. V obeh objavah v blogih je veliko zanimivih opažanj o premalo izkoriščenih funkcijah Java in z nekaterimi se strinjam bolj kot z drugimi. Vendar pa mi je pozornost pritegnila trditev, da je Java SE 6 ena najbolj neuporabljenih funkcij Java.

Resnično uživam v delu z Javo SE 6 in v preteklosti sem že večkrat pisal ali pisal o njih. V tej objavi v spletnem dnevniku nameravam pokazati del sposobnosti Java SE 6 za gostovanje izvajanja kode JavaScript.

Večina razvijalcev Java in razvijalcev JavaScript razume, da imata JavaScript in Java poleg štirih črk "J-A-V-A" zelo malo skupnega, razen nekatere dediščine, podobne C. Kljub temu je včasih koristno zagnati skriptni jezik znotraj kode Java in Java SE 6 to omogoča.

Paket javax.script je bil predstavljen z Java SE 6 in vključuje razrede, vmesnike in preverjeno izjemo, povezano z uporabo skriptnih mehanizmov v Javi. Ta objava v spletnem dnevniku se bo osredotočila na ScriptEngineFactory, ScriptEngineManager, ScriptEngine in ScriptException.

Ena prvih stvari, ki bi jih morda želeli storiti, je določiti, kateri skriptni mehanizmi so že na voljo. Naslednji delček kode prikazuje, kako enostavno je to storiti z Java SE 6.

končni upravitelj ScriptEngineManager = nov ScriptEngineManager (); za (končni ScriptEngineFactory scriptEngine: manager.getEngineFactories ()) {System.out.println (scriptEngine.getEngineName () + "(" + scriptEngine.getEngineVersion () + ")"); System.out.println ("\ tLanguage:" + scriptEngine.getLanguageName () + "(" + scriptEngine.getLanguageVersion () + ")"); System.out.println ("\ tSkupna imena / vzdevki:"); za (končni niz engineAlias: scriptEngine.getNames ()) {System.out.println (engineAlias ​​+ ""); }} 

Zgornja koda ustvari izhod, kot je prikazan na naslednjem posnetku zaslona.

Kot prikazuje ta slika, je Mozilla Rhino JavaScript motor vključen v Sunjevo Java SE 6. Vidimo tudi nekaj "pogostih imen", povezanih s tem motorjem. Vsako od teh imen je mogoče uporabiti za iskanje tega motorja. V kasnejših primerih v tej objavi bom za to iskanje uporabil splošno ime "js".

Naslednji vzorec kode bo izkoristil zagotovljeni mehanizem Rhino JavaScript za izvedbo neke kode JavaScript iz kode Java. V tem primeru bomo izkoristili funkcijo JavaScript toExponential.

 / ** * Zapiši številko v eksponentni obliki. * * @param numberToWriteInExponentialForm Število, ki bo predstavljeno v * eksponentni obliki. * @param numberDecimalPlaces Število decimalnih mest, ki se uporabijo v eksponentni predstavitvi *. * / javna statična void writeNumberAsExponential (končno število numberToWriteInExponentialForm, končni int numberDecimalPlaces) {final ScriptEngine engine = manager.getEngineByName ("js"); poskusite {engine.put ("inputNumber", numberToWriteInExponentialForm); engine.put ("decimalPlaces", numberDecimalPlaces); engine.eval ("var outputNumber = inputNumber.toExponential (decimalPlaces);"); končni niz exponentialNumber = (String) engine.get ("outputNumber"); System.out.println ("Število:" + eksponentnoŠtevilo); } catch (ScriptException scriptException) {LOGGER.severe ("ScriptException je naletel na poskus pisanja eksponentnega:" + scriptException.toString ()); }} 

Zgornja koda neposredno prikliče JavaScript z uporabo metode ScriptEngine.eval (String) za oceno podanega niza, ki vsebuje sintakso JavaScript. Pred uporabo eval Metodi se dva parametra "preneseta" (vezana) na kodo JavaScript prek klicev ScriptEngine.put (String, Object). Do rezultatskega predmeta izvedenega JavaScripta se dostopa v kodi Java s klicem ScriptEngine.get (String).

Za prikaz zgornje kode s pomočjo toExponential funkcijo, uporabil bom naslednjo kodo "odjemalca".

končni int sourceNumber = 675456; writeNumberAsExponential (sourceNumber, 1, System.out); writeNumberAsExponential (sourceNumber, 2, System.out); writeNumberAsExponential (sourceNumber, 3, System.out); writeNumberAsExponential (sourceNumber, 4, System.out); writeNumberAsExponential (sourceNumber, 5, System.out); 

Ko se zgornja koda zažene s prej prikazano metodo writeNumberAsExponential in se uporabi JavaScript, je izhod videti podoben tistemu, ki je prikazan na naslednjem posnetku zaslona.

Ta primer zadostuje za prikaz, kako enostavno je priklicati funkcionalnost JavaScript znotraj Java SE 6. Vendar bi to lahko izvedli še bolj splošno, kot bosta prikazana naslednja dva primera. Prvi primer prikazuje klic sorazmerno poljubnega JavaScript-a brez posredovanih / vezanih parametrov, drugi primer pa priklic sorazmerno poljubnega JavaScript-a s posredovanimi / vezanimi parametri.

Sorazmerno poljuben niz JavaScript lahko obdelamo s kodo, podobno tisti, ki je prikazana v nadaljevanju.

 / ** * Obdelajte predani skript JavaScript, ki bi moral vključevati dodelitev * spremenljivki z imenom, predpisanim z navedenim nameOfOutput, in * lahko vključuje parametre, predpisane z inputParameters. * * @param javaScriptCodeToProcess String, ki vsebuje kodo JavaScript za *, se oceni. Ta niz ni preverjen za nobeno veljavnost in * bi lahko privedel do metanja ScriptException, ki bi bil * zabeležen. * @param nameOfOutput Ime izhodne spremenljivke, povezane s * skriptom JavaScript. * @param inputParameters Izbirna mapa imen parametrov v vrednosti parametrov *, ki se lahko uporabljajo v priloženem skriptu JavaScript. Ta zemljevid * je lahko ničen, če v skriptu ni pričakovati vhodnih parametrov. * / javni statični objekt ProcessArbitraryJavaScript (končni niz javaScriptCodeToProcess, končni niz imenaOfOutput, končni zemljevid inputParameters) {Rezultat predmeta = null; končni ScriptEngine motor = manager.getEngineByName ("js"); poskusite {if (inputParameters! = null) {for (final Map.Entry parameter: inputParameters.entrySet ()) {engine.put (parameter.getKey (), parameter.getValue ()); }} engine.eval (javaScriptCodeToProcess); rezultat = engine.get (nameOfOutput); } catch (ScriptException scriptException) {LOGGER.severe ("ScriptException je naletel na poskus pisanja poljubnega JavaScript '" + javaScriptCodeToProcess + "':" + scriptException.toString ()); } vrni rezultat; } 

Zgornja koda ponuja kar nekaj prilagodljivosti glede JavaScript-a, ki ga je mogoče obdelati. To verjetno ni najboljša ideja za produkcijsko kodo, vendar pa olajša prikaz različnih funkcij JavaScript v Javi.

Prvi primer, ki uporablja to razmeroma poljubno obdelavo JavaScript, izkorišča objekt Date JavaScript. Vzorčna koda je prikazana naprej.

 System.out.println ("Današnji datum:" + processArbitraryJavaScript ("var datum = nov datum (); var mesec = (date.getMonth () + 1) .toFixed (0)", "mesec", nič) + / "+ processArbitraryJavaScript (" var date = new Date (); var day = date.getDate (). toFixed (0) "," day ", null) +" / "+ processArbitraryJavaScript (" var datum = nov datum () ; var leto = datum.getFullYear (). toFixed (0) "," leto ", null)); 

Ta koda določa, da je treba pridobiti datum JavaScript (kar bo trenutni datum) in iz tega primernega datuma izvleči ta mesec, datum meseca in celo leto. Rezultat za to se prikaže naslednji.

Zadnji primer je delal na poljubnem nizu JavaScript, vendar ni uporabil nobenih parametrov. Naslednji primer prikazuje zagotavljanje parametrov za to poljubno obdelavo niza JavaScript, saj prikazuje uporabo funkcije pow funkcije JavaScript. Koda za ta primer je navedena naslednji.

 končni zemljevid exponentParameters = nov HashMap (); exponentParameters.put ("osnova", 2); exponentParameters.put ("eksponent", 5); System.out.println ("2 do 5 je:" + processArbitraryJavaScript ("var odgovor = Math.pow (osnova, eksponent)", "odgovor", exponentParameters)); 

Rezultat izvajanja tega primera je prikazan na naslednjem posnetku zaslona.

Za svoj zadnji primer objave v spletnem dnevniku predstavim standard toString () izhodna vrednost ScriptException v nekaterih prejšnjih primerih. The ScriptEngine.eval metoda vrže to preverjeno izjemo, če pride do napake pri izvajanju / ocenjevanju podanega skripta. Ta metoda vrže tudi NullPointerException, če je navedeni niz ničen. Koda, ki se uporablja za vsiljevanje napake skripta, je prikazana naprej.

 / ** * Namerno povzroči, da napaka pri ravnanju s skripti prikaže vrsto informacij *, ki jih vsebuje ScriptException. * / public static void testScriptExceptionHandling () {System.out.println (processArbitraryJavaScript ("Garbage In", "none", null)); } 

Ta koda vsebuje nesmiselni skript (v smislu sintakse JavaScript), vendar je točno to tisto, kar je potrebno za prikaz ScriptException.toString (), ki je poklican kot del obravnave izjem v zgornji metodi za obdelavo poljubnega niza JavaScript . Ko se koda izvede, vidimo informacije o izjemi, kot je prikazano na naslednji sliki.

Del rezultata, ki prihaja iz ScriptException.toString () je del, ki navaja: "javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: manjka; pred stavkom (# 1) v vrstici številka 1."

The ScriptException vsebuje ime datoteke, številko vrstice in številko stolpca izjeme, kar je še posebej koristno, če je za oceno na voljo datoteka s kodo JavaScript.

Zaključek

Java SE 6 olajša uporabo JavaScripta znotraj kode Java. Tudi druge skriptne mehanizme je mogoče povezati z Javo, vendar je priročno, če imate enega, ki je na voljo z Mozilla Rhino.

Izpolnite posnetek kode in izhodnega zaslona

Za popolnost sem na enem mestu tukaj vključil celoten seznam kod in posledični izhod po tem.

JavaScriptInJavaExample.java

$config[zx-auto] not found$config[zx-overlay] not found