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

JavaScript on the Server – RingoJS

JavaScript on the Server – RingoJS

Talk for stahlstadt.js (JS Meetup in Linz, Austria) about server-side JavaScript with Ringo.

Philipp Naderer

February 19, 2014
Tweet

More Decks by Philipp Naderer

Other Decks in Programming

Transcript

  1. RingoJS? • Anders als Node! • Blocking & Non-Blocking •

    JavaScript on the JVM • Multithreaded JavaScript • Basiert auf Mozilla Rhino • Module (CommonJS-Art) • CommonJS Module • JSGI Web Services
  2. Theads?!?! • Fundamentales Konzept der JVM • Threads sind nicht

    teuer in der JVM • Deadlocks & Race Conditions sind möglich • Shared Resources vermeiden • Ringo verwendet keine gewöhnlichen Threads
  3. Philosophien • Event Loops (u.a. NodeJS)
 • Multi-Threading (traditionelles Java,

    C++, …)
 • Message Passing / Actors / Shared-Nothing- Threads / Workers / …
  4. Aber wenn man will … (function () { var x

    = false; // you will never write code like this … (new java.lang.Thread({ run: function() { x = true; } })).start(); ! while(x) { /* do nothing */ } ! return x; })();
  5. Eher so … addToClasspath("./twitter4j.jar"); importPackage(Packages.twitter4j); ! exports.get("/stories/:id", function(id) { var

    story = store.query("…", {id: id}); ! var twtr = TwitterFactory().getInstance(); twtr.updateStatus(new StatusUpdate("Story#" + id); ! return env.renderResponse("page.html", { story: story } ); }; * das hier ist Demo-Code, einige Teile fehlen
  6. Destructoring Assignments // Extract escapeHtml & isUrl properties // from

    ringo/utils/strings ! var {escapeHtml, isUrl} =
 require("ringo/utils/strings"); ! escapeHtml("<h1>Foo</h1>"); isUrl("so much url");
  7. rp ~ npm • ringo-sqlstore (ORM) • reinhardt (Django-like templates)

    • gestalt (easy configuration) • stick (JSGI Web framework) • ringo-xom (XML) • ringo-ehcache (Caching) • ringo-mongodb • httpclient-jetty • underscore
  8. JVM & Java? • Einfacher Zugriff auf Java-Libraries • var

    now = java.util.Calendar.getInstance(); • var y = new Packages.at.orf.MeineSuperKlasse() • Für Java gibt es fast alles: • ORM, J2EE, JDBC-Driver, Imaging, XML, I/O,
 Spring, LDAP, Apache Commons, …
  9. Ringo on Google App Engine • Easy to integrate since

    Ringo runs on the JVM • No compiling needed, hot reload of scripts • Access all the Java APIs from GAE • Datastore API • Cloud SQL • Service APIs (OpenID, Images, …)
  10. App Engine Demo // Note: packages prefixed with com.google. importPackage(appengine.api.users);

    importPackage(appengine.api.images); importPackage(appengine.api.datastore); importPackage(appengine.api.blobstore); ! var userService = UserServiceFactory.getUserService(); ! userService.isUserLoggedIn(); userService.createLoginURL(requestURL);
  11. App Engine Demo var datastore = DatastoreServiceFactory.getDatastoreService(); var bs =

    new Entity("Bookshelf"); bs.setProperty("title", req.postParams.title); bs.setProperty("created", new java.util.Date()); bs.setProperty("creator", credentials.currentUser); ! datastore.put(bs); return response.redirect("/bookshelf/" + bs.getKey().getId());
  12. App Engine Demo var book; try { book = datastore.get(bookKey);

    ! } catch (e if e.javaException instanceof EntityNotFoundException) { ! // return 404 - File not Found ! } catch (e) { // return 500 - Internal Error }
  13. • Deployment wie App Engine Java-SDK / WEB-INF • Ich

    habe ant für Dependency-Download genommen • App Engine SDK, Rhino, Ringo, JAFFL, JNR-POSIX • Ringo Core Modules • Packages (stick Web Framework, etc.) • In unter einer Stunde war alles erledigt!