Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Виктор Гамов — Носороги на воле: прикладные возможности использования JavaScript в разработке на Java

Moscow JUG
November 13, 2014

Виктор Гамов — Носороги на воле: прикладные возможности использования JavaScript в разработке на Java

JavaScript является мощным и гибким динамически-типизированным языком. JVM давно зарекомендовала себя как надежная, стабильная и высоко-производительная платформа для разработки и запуска приложений.

Одной из сильных сторон JVM является возможность исполнять код, написанный на разных языках, в том числе JavaScript. С использованием возможностей JavaScript, вы можете сокращать время разработки, используя JavaScript как прикладной DSL для ваших приложений.

Эта презентация о подходах и фреймворках с открытым исходным кодом, которые позволяют использовать Java и JavaScript в одном приложении. Участники познакомятся с текущем состоянием полиглот-фрейворков, в которых JavaScript и Java работают бок о бок.

В программе:
- Расставим все точки над i в вопросах использования Nashorn для server- и client-side разработчиков.
- Посмотрим как интегрировать JavaScript код и NodeJS библиотеки в Java приложение.
- Посмотрим на существующие проекты, в которых используется Java-JavaScript взаимодействие, в том числе Avatar, VertX и другие.
- Проведем сессию вопросов и (если получится) ответов.

Как обычно, вас ждет живое неформальное общение и масса позитива.

Moscow JUG

November 13, 2014
Tweet

More Decks by Moscow JUG

Other Decks in Programming

Transcript

  1. www.faratasystems.com // follow me : twitter.com/gamussa Rhinoceros on the Loose

    Viktor Gamov Senior Software ENGINEER, Farata Systems JUGMSK, MOSCOW, RUSSIA 2014 Applied Real-World Projects with Java and JavaScript
  2. Objects var obj2 = {prop: 42}; // Store the data

    about Fox Mulder
 var person = { 
 lastName: "Fox",
 firstName: "Mulder",
 age: 53 }; var obj = {};
  3. // Declaring function
 function calcTaxes(income, dependent){
 // do stuff
 }

    Functions // Invoking function
 calcTaxes(5000, 2);
 var myTaxes = calcTaxes(5000, 2); // declaration and invocation at the same time
 // IIFE - immediate invoked function expression 
 (function calcTaxes(income, dependent){
 // do stuff
 })(); // Assigning function literal to a variable
 var calcTaxes = function (income, dependent){
 // do stuff
 };
  4. Assigning a Function to Object Property person.doTaxes(5000, 2); person.doTaxes =

    function (income, dependent) {
 // do stuff 
 };
  5. Object Methods in Literals var person2 = {
 lastName: "Fox",


    firstName: "Mulder",
 age: 53,
 doTaxes: function (income, dependent) {
 // do stuff
 }
 }; person2.doTaxes(5000, 2);
  6. Constructor function function Tax(income, dependents) {
 // Do something here

    
 }
 
 // Creating 2 Tax objects 
 var t1 = new Tax(50000, 3);
 var t2 = new Tax(68000, 1);
  7. prototype // Constructor function Person 
 function Person(name, title) {


    this.name = name;
 this.title = title;
 this.subordinates = [];
 }
 
 // Constructor function Employee
 function FbiAgent(name, title) {
 this.name = name;
 this.title = title;
 }
 
 FbiAgent.prototype = new Person();
 
 var emp = new FbiAgent("Dana Scully", "Special Agent");
  8. Ultimate invokedynamic consumer 100% pure Java implementation 100% ECMAScript 5.1

    compliant JavaScript Engine for JVM What is Nashorn? 100% compiled to bytecode, no interpreter http://www.1001ausmalbilder.de/ausmalbilder/gross/ausmalbild-nashorn-7.jpg
  9. HOW To USE NASHORN? ★ The only API is JSR-223:

    javax.scripting.* ★ Java from JavaScript and vice versa ★ Create and manipulate Java/JavaScript objects ★ Extend Java classes ★ Implement Java interfaces
  10. String[] options =
 new String[] {
 "--persistent-code-cache",
 "--class-cache-size=50",
 “—no-java"}; *

    
 NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
 NashornScriptEngine engine =
 (NashornScriptEngine) factory.getScriptEngine(options); 
 engine.eval("Number.prototype[3] = 'jugmsk'; print(3[3]);"); * jjs -xhelp http://cr.openjdk.java.net/~sundar/jdk.nashorn.api/8u40/javadoc/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html
  11. String[] options =
 new String[] {
 "--persistent-code-cache",
 "--class-cache-size=50",
 “—no-java"}; *

    
 NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
 NashornScriptEngine engine =
 (NashornScriptEngine) factory.getScriptEngine(options); 
 engine.eval("Number.prototype[3] = 'jugmsk'; print(3[3]);"); * jjs -xhelp http://cr.openjdk.java.net/~sundar/jdk.nashorn.api/8u40/javadoc/jdk/nashorn/api/scripting/NashornScriptEngineFactory.html
  12. https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions var System = Java.type('java.lang.System');
 System.out.println(10); // 10
 System.out["println"](11.0); //

    11.0
 System.out["println(double)"](12); // 12.0 Parameter overloading var Date = Java.type('java.util.Date');
 var date = new Date();
 date.year += 1900;
 print(date.year); // 2014 Java Beans print(__FILE__, __LINE__, __DIR__); Whereis Load Scripts // show example with underscore.js
  13. SHELL Scripting Extend app functionality on runtime 1 2 3

    JAVASCRIPT on JVM USE cASES WEB-content generation 4 provide extension points for application https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html
  14. import com.oracle.avatar.js.Server;
 
 import java.io.File;
 import java.lang.reflect.Field;
 
 public class

    Main {
 
 static {
 try {
 final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
 sysPathsField.setAccessible(true);
 sysPathsField.set(null, null);
 System.setProperty("java.library.path",
 new File(Main.class.getResource("/libavatar-js.dylib").getPath())
 .getParentFile().getCanonicalPath());
 System.loadLibrary("avatar-js");
 } catch (Throwable t) {
 throw new RuntimeException(t);
 }
 }
 
 public static void main(String[] args) throws Throwable {
 Server.main(Main.class.getResource("/app.js").getPath());
 }
 } credits: https://github.com/danveloper/midwestjs-2014-nashorn/blob/master/node-app/src/main/java/midwestjs/nashorn/Main.java
  15. ★polyglot platform ★Develop with Java, Javascript, jRuby, Groovy, jython, clojure,

    ★Scala, php, ceylon ★integration with nashorn ★https://github.com/vert-x/mod-lang-nashorn ★Event bus (down to the browser) ★Distributed data (in v.3) ★Open source: EPL / Apache vertx.io
  16. Avatar 2.0 ★polyglot platform (sort oF) ★integration with nashorn ★Node

    api ★Model-Store api ★Event bus ★Distributed data ★not open yet
  17. ★NODE api for Java platform ★USES DYNJS - ALTERNATIVE JAVASCRIPT

    ENGINE ★WILL BE INTEGRATED WITH VERTX nodyn
  18. Scalable JavaScript Applications with Project Nashorn [CON6423] Project Avatar: Server-Side

    JavaScript on the JVM [CON5675] 1 2 3 javaone 2014 taks to catch up Project Avatar: More Than Just Node.js on the JVM—Java EE Written in JavaScript [CON4091] 4 Toward Native JavaScript Performance on the JVM [CON4679]