Programmēšana

JavaScript Java valodā

Nesenais JavaLobby ieraksts The Top 10 neizmantotās funkcijas Java ir bijis ārkārtīgi populārs. Šī raksta tapšanas brīdī tā ir visaugstāk novērtētā ziņa kategorijā DZone Top Links. Turklāt ir ievietota arī atbilde uz to. Abos emuāru ierakstos ir daudz interesantu novērojumu par Java nepietiekami izmantotajām funkcijām, un es vairāk nekā citiem piekrītu. Tomēr jautājums, kas patiešām piesaistīja manu uzmanību, bija apgalvojums, ka Java SE 6 ir viena no visvairāk neizmantotajām Java funkcijām.

Man ļoti patīk strādāt ar Java SE 6, un iepriekš vairākas reizes esmu rakstījis par Java SE 6 funkcijām vai blogojis par tām. Šajā emuāra ierakstā es esmu iecerējis parādīt daļu Java SE 6 spēju mitināt izpildīt JavaScript kodu.

Lielākā daļa Java izstrādātāju un JavaScript izstrādātāju saprot, ka papildus četriem burtiem "J-A-V-A" JavaScript un Java ir ļoti maz kopīga, izņemot dažus C veida mantojumus. Tomēr reizēm var būt noderīgi palaist skriptu valodu no Java koda, un Java SE 6 to ļauj.

Javax.script pakotne tika ieviesta ar Java SE 6, un tā ietver klases, saskarnes un pārbaudītu izņēmumu, kas saistīts ar skriptu dzinēju izmantošanu Java. Šajā emuāra publicēšanā galvenā uzmanība tiks pievērsta ScriptEngineFactory, ScriptEngineManager, ScriptEngine un ScriptException.

Viena no pirmajām lietām, ko varētu vēlēties darīt, ir noteikt, kuri skriptu dzinēji jau ir pieejami. Nākamais koda fragments parāda, cik viegli tas ir izdarāms ar Java SE 6.

galīgais ScriptEngineManager vadītājs = jauns ScriptEngineManager (); for (final ScriptEngineFactory scriptEngine: manager.getEngineFactories ()) {System.out.println (scriptEngine.getEngineName () + "(" + scriptEngine.getEngineVersion () + ")"); System.out.println ("\ tLanguage:" + scriptEngine.getLanguageName () + "(" + scriptEngine.getLanguageVersion () + ")"); System.out.println ("\ tKopējie nosaukumi / aizstājvārdi:"); par (final String engineAlias: scriptEngine.getNames ()) {System.out.println (engineAlias ​​+ ""); }} 

Iepriekš parādītais kods ģenerē tādu izvadi, kāds parādīts nākamajā ekrāna momentuzņēmumā.

Kā redzams šajā attēlā, Mozilla Rhino JavaScript dzinējs ir iekļauts Sun Java SE 6. komplektā. Mēs redzam arī dažus "parastos nosaukumus", kas saistīti ar šo konkrēto dzinēju. Jebkuru no šiem nosaukumiem var izmantot, lai meklētu šo dzinēju. Turpmākajos šī ziņojuma piemēros es šim uzmeklēšanai izmantošu parasto nosaukumu "js".

Nākamais koda paraugs izmantos nodrošināto Rhino JavaScript dzinēju, lai izpildītu Java kodu no Java koda. Šajā gadījumā mēs izmantosim JavaScript funkcijas toExponential priekšrocības.

 / ** * Uzrakstiet numuru eksponenciālā formā. * * @param numberToWriteInExponentialForm Skaitlis, kas jāatspoguļo * eksponenciālā formā. * @param numberDecimalPlaces Decimāldaļu skaits, kas jāizmanto * eksponenciālajā attēlojumā. * / public static void writeNumberAsExponential (final Number numberToWriteInExponentialForm, final int numberDecimalPlaces) {final ScriptEngine engine = manager.getEngineByName ("js"); mēģiniet {engine.put ("inputNumber", numberToWriteInExponentialForm); engine.put ("decimalPlaces", numberDecimalPlaces); engine.eval ("var outputNumber = inputNumber.toExponential (decimalPlaces);"); final String exponentialNumber = (virkne) engine.get ("outputNumber"); System.out.println ("Skaitlis:" + eksponenciālaisNumurs); } catch (ScriptException scriptException) {LOGGER.severe ("ScriptException radās, mēģinot rakstīt eksponenciāli:" + scriptException.toString ()); }} 

Iepriekš minētais kods tieši izsauc JavaScript, izmantojot ScriptEngine.eval (String) metodi, lai novērtētu sniegto virkni, kas satur JavaScript sintaksi. Pirms eval metodi, caur ScriptEngine.put (virkne, objekts) zvaniem tiek "iesūtīti" (piesaistīti) JavaScript kodam. Izpildītā JavaScript rezultāta objektam var piekļūt Java kodā, izmantojot ScriptEngine.get (String) izsaukumu.

Lai parādītu iepriekš minēto kodu, izmantojot toExponential funkciju, es izmantošu šādu klienta kodu.

galīgais int avotsNumber = 675456; writeNumberAsExponential (sourceNumber, 1, System.out); writeNumberAsExponential (sourceNumber, 2, System.out); writeNumberAsExponential (sourceNumber, 3, System.out); writeNumberAsExponential (avota numurs, 4, System.out); writeNumberAsExponential (sourceNumber, 5, System.out); 

Kad iepriekšējais kods tiek palaists ar iepriekš parādīto metodi WriteNumberAsExponential un tiek izmantots JavaScript, izvade šķiet līdzīga tai, kas parādīta nākamajā ekrāna momentuzņēmumā.

Šis piemērs ir pietiekams, lai parādītu, cik viegli ir izsaukt JavaScript funkcionalitāti no Java SE 6. Tomēr to varētu ieviest vēl vispārīgāk, kā parādīs nākamie divi piemēri. Pirmajā piemērā parādīta samērā patvaļīga JavaScript izsaukšana bez parametriem, kas nodoti / piesaistīti, un otrajā piemērā parādīta samērā patvaļīga JavaScript izsaukšana ar parametriem, kas nodoti / piesaistīti.

Salīdzinoši patvaļīgu JavaScript virkni var apstrādāt ar kodu, kas līdzīgs nākamajam.

 / ** * Apstrādājiet ievadīto JavaScript skriptu, kurā jāiekļauj piešķiršana * mainīgajam ar nosaukumu, ko nosaka norādītais nameOfOutput, un * var ietvert parametrus, kurus nosaka inputParameters. * * @param javaScriptCodeToProcess Vērtējama virkne, kas satur JavaScript kodu. Šīs virknes derīgums netiek pārbaudīts, un tā *, iespējams, var novest pie ScriptException, kas * tiks reģistrēts. * @param nameOfOutput Izvades mainīgā nosaukums, kas saistīts ar * nodrošināto JavaScript skriptu. * @param inputParameters Izvēles parametru nosaukumu karte ar parametru vērtībām *, kuras, iespējams, tiks izmantotas paredzētajā JavaScript skriptā. Šī karte * var būt nulle, ja skriptā nav gaidāmi ievades parametri. * / public static Object processArbitraryJavaScript (final String javaScriptCodeToProcess, final String nameOfOutput, final Map inputParameters) {Object result = null; galīgais ScriptEngine dzinējs = manager.getEngineByName ("js"); mēģiniet {if (inputParameters! = null) {for (galīgais Map.Entry parametrs: inputParameters.entrySet ()) {engine.put (parametrs.getKey (), parametrs.getValue ()); }} engine.eval (javaScriptCodeToProcess); rezultāts = engine.get (nameOfOutput); } catch (ScriptException scriptException) {LOGGER.severe ("ScriptException radās, mēģinot uzrakstīt patvaļīgu JavaScript '" + javaScriptCodeToProcess + "':" + scriptException.toString ()); } atgriešanās rezultāts; } 

Iepriekš minētais kods nodrošina diezgan daudz elastības attiecībā uz apstrādājamo JavaScript. Šī, iespējams, nav labākā ražošanas koda ideja, taču tā atvieglo dažādu Java funkciju izmantošanu Java.

Pirmais piemērs, lai izmantotu šo salīdzinoši patvaļīgo JavaScript apstrādi, izmanto JavaScript objekta Datums priekšrocības. Tālāk tiek parādīts koda paraugs.

 System.out.println ("Šodienas datums:" + processArbitraryJavaScript ("var date = new Date (); var month = (date.getMonth () + 1) .toFixed (0)", "month", null) + " / "+ processArbitraryJavaScript (" var date = new Date (); var day = date.getDate (). toFixed (0) "," day ", null) +" / "+ processArbitraryJavaScript (" var date = new Date () ; var year = date.getFullYear (). toFixed (0) "," gads ", null)); 

Šis kods norāda, ka ir jāiegūst JavaScript datums (kas būs pašreizējais datums) un no šī saīsinātā datuma jāizņem šis mēnesis, mēneša datums un pilns gads. Izvade tam parādās pēc tam.

Pēdējais piemērs strādāja pie patvaļīgas JavaScript virknes, taču neizmantoja parametrus. Nākamais piemērs parāda parametru nodrošināšanu šai patvaļīgajai JavaScript virkņu apstrādei, jo tas parāda JavaScript POW funkcijas izmantošanu. Tālāk ir norādīts šī piemēra kods.

 gala kartes exponentParameters = new HashMap (); exponentParameters.put ("bāze", 2); exponentParameters.put ("eksponents", 5); System.out.println ("2 pret 5 ir:" + processArbitraryJavaScript ("var answer = Math.pow (bāzes, eksponents)", "atbilde", exponentParameters)); 

Šī piemēra izpildes rezultāts ir parādīts šajā ekrāna momentuzņēmumā.

Kā pēdējo šī emuāra ievietošanas piemēru es demonstrēju standartu toString () produkcija ScriptException deklarēts dažos iepriekšējos piemēros. The ScriptEngine.eval metode izmet šo pārbaudīto izņēmumu, ja izpildot / novērtējot sniegto skriptu, ir kļūda. Šī metode arī rada NullPointerException, ja norādītā virkne ir nulle. Tālāk tiek parādīts kods, ko izmanto, lai piespiestu skripta kļūdu.

 / ** * Ar nodomu izraisīt skriptu apstrādes kļūdu, lai parādītu informācijas veidu, ko ietver ScriptException. * / public static void testScriptExceptionHandling () {System.out.println (processArbitraryJavaScript ("Garbage In", "none", null)); } 

Šis kods nodrošina bezjēdzīgu skriptu (JavaScript sintakses izteiksmē), taču tieši tas ir nepieciešams, lai parādītu ScriptException.toString (), kas tiek izsaukts kā daļa no izņēmumu apstrādes iepriekš parādītajā metodē, lai apstrādātu patvaļīgu JavaScript virkni . Kad kods ir izpildīts, mēs redzam informāciju par izņēmumiem, kā parādīts nākamajā attēlā.

Izvades daļa, no kuras nāk ScriptException.toString () ir daļa, kurā teikts: "javax.script.ScriptException: sun.org.mozilla.javascript.internal.EvaluatorException: trūkst; pirms priekšraksta (# 1) rindas 1. rindā."

The ScriptException satur faila nosaukumu, rindas numuru un izņēmuma kolonnas numuru, kas ir īpaši noderīgi, ja novērtēšanai ir paredzēts fails ar JavaScript kodu.

Secinājums

Java SE 6 atvieglo JavaScript izmantošanu Java kodā. Citus skriptu dzinējus var saistīt arī ar Java, taču ir ērti, ja viens tiek piegādāts ārpus Mozilla Rhino.

Pilnīgs koda un izvades ekrāna momentuzņēmums

Pilnības labad šeit es iekļauju pilnīgu kodu sarakstu vienā vietā un iegūto rezultātu pēc tam.

JavaScriptInJavaExample.java

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