Node.js vs Java + Rhino + Jetty + FreeMarker



Node.jsは当初から多くのモジュールを取得してますが、 強力な Java ライブラリセットよりも機能が大幅に劣っています 。 では、Javaの可能性を利用してJavaScriptでWebアプリケーションを開発してみませんか? Javaで便利なJavaScript MVCフレームワークを構築する方法を見てみましょう。



Mozillaサイ



まず、サイから始めましょう。 JavaScriptをコンパイル/解釈するために、 Mozilla Rhinoエンジンを使用します。これは、JavaアプリケーションでのECMAScriptコードの優れた統合を提供します。 J2SE 6以降、RhinoはJava Scripting APIの一部としてJREに含まれていますが、JREのバージョンはかなり古くなっており、さらに、Sunのいくつかの不快な実装機能があるため、 フレッシュビルドを使用することをお勧めします。



まず、 helloworld.js





 print('Hey you!');
      
      





Rhinoライブラリが./lib



に解凍されていると仮定して、次のように例を実行します。

 java -Djava.ext.dirs=./lib org.mozilla.javascript.tools.shell.Main helloworld.js
      
      







ちなみに、キットには優れたUIを備えたデバッガが含まれており、次のように起動します。

 java -Djava.ext.dirs=./lib org.mozilla.javascript.tools.debugger.Main helloworld.js
      
      









Rhinoは、標準のECMAScriptオブジェクトに加えて、JavaScriptとJavaの通信を容易にするグローバルコンテキストの多くの関数を含んでいます。 はい、まだ理解していない場合は、JavaScriptコードからJavaコードを透過的に操作することができます。 パッケージを操作するために、グローバルオブジェクトPackages



ます。 たとえば、 java.io.File



インスタンスを作成できます。

 var file = new Packages.java.io.File('filename');
      
      





ただし、 java



com



org



edu



、およびnet



グローバルオブジェクトもあるため、コードは次のように縮小できます。

 var file = new java.io.File('filename');
      
      





インポートには次のパターンを使用できます。

 var File = java.io.File; //... var file = new File('filename');
      
      





しかし、次のようにさらに便利です:

 importClass(java.io.File); //... var file = new File('filename');
      
      





または:

 importPackage(java.io); //... var file = new File('filename');
      
      





Rhinoを使用すると、JSプログラマーにとって便利な方法でJavaインターフェースを実装できます。

 var runnable = new java.lang.Runnable({run: function() { print("I'm running!"); }}); new java.lang.Thread(runnable).start();
      
      





ところで、組み込みのECMAScriptタイプとの競合を避けるために、 java.lang



グローバルコンテキストインポートされないことに注意してください。



また、Rhinoの最新バージョンには、 CommonJSの完全な実装が含まれています。これは、スイッチ-require



してRhino Shellに含めることができます。



モジュール./modules/math.js



がある場合:

 exports.sum = function(a, b) { return a + b; }
      
      





その後、次のように使用できます。

 var math = require('math'); print(math.sum(2, 4));
      
      





このコードは次のように実行されます。

 java -Djava.ext.dirs=./lib org.mozilla.javascript.tools.shell.Main -require -modules ./modules test.js
      
      







桟橋



JettyをHTTPサーバーの基盤として使用します。 Jettyはサーブレットのコンテナであると同時に、SPDY、WebSocket、OSGi、JMX、JNDI、JAASをサポートするWebサーバーを柔軟に構成できます。 ディストリビューションはこちらからダウンロードできます。



Jettyを実行する最も簡単なコードは次のとおりです。

 importPackage(org.eclipse.jetty.server); var server = new Server(8888); //  8888 server.start(); server.join(); //   Jetty
      
      





Jettyディストリビューションの./lib



./lib



に配置する必要があります。将来的には、次のようにすべてを実行します。

 java -Djava.ext.dirs=./lib org.mozilla.javascript.tools.shell.Main -require -modules ./modules server.js
      
      





はい、それだけです。



このサーバーは、すべてのリクエストでHTTP 404



を発行しHTTP 404



。 シンプルなファイルサーバーに変えてください。

 importPackage(org.eclipse.jetty.server); importPackage(org.eclipse.jetty.server.handler); var resourceHandler = new ResourceHandler(); resourceHandler.setDirectoriesListed(true); //       resourceHandler.setResourceBase('web'); //    ./web resourceHandler.setWelcomeFiles(['index.html']); //       index.html var server = new Server(8888); server.setHandler(resourceHandler); server.start(); server.join();
      
      





それでは、サーブレットを作成してみましょう。

 importPackage(org.eclipse.jetty.server); importPackage(org.eclipse.jetty.server.handler); importPackage(org.eclipse.jetty.servlet); importPackage(javax.servlet.http); var contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); contextHandler.setContextPath('/'); contextHandler.addServlet( new ServletHolder(new HttpServlet({ //      ,     doGet: function(request, response) { response.setContentType('text/plain'); response.getWriter().println('Yes, it works!'); } })), '/test' ); var server = new Server(8888); server.setHandler(contextHandler); server.start(); server.join();
      
      





私たちのサーブレットは localhost:8888/test



localhost:8888/test



別の例として、その場でテキストを含む画像を生成するサーブレットモジュールの形式で配置してみましょう。

 importPackage(java.awt.image); importClass(java.awt.Color); importClass(javax.imageio.ImageIO); //    J2SE 6 var width = 400, height = 400; exports.doGet = function(request, response) { var image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); var graphics = image.createGraphics(); var color = new Color(Math.random(), Math.random(), Math.random()); graphics.setColor(color); graphics.fillRect(0, 0, width, height); graphics.setColor(color.brighter()); graphics.drawString('On the fly!', 10, 20); response.setContentType('image/png'); var outputStream = response.getOutputStream(); ImageIO.write(image, 'png', outputStream); outputStream.close(); };
      
      





./modules



として./modules



フォルダーに入れ、サーバーコードに含めます。

 contextHandler.addServlet( new ServletHolder(new HttpServlet(require('imageServlet'))), '/image.png' );
      
      





DBMSには何がありますか? MySQLからデータベースのリストを取得する方法を見てみましょう。

 importPackage(java.sql); exports.doGet = function(request, response) { try { var connection = DriverManager.getConnection('jdbc:mysql://localhost/?', 'root', ''); try { var resultSet = connection .createStatement() .executeQuery('show databases;'); response.setContentType('text/html;charset=UTF-8'); var writer = response.getWriter(); writer.println('<h1>Databases</h1>'); while (resultSet.next()) { writer.println(resultSet.getString('Database') + '<br />'); } } catch(e) {} finally { resultSet.close(); } } catch(e) {} finally { if(connection) connection.close(); } };
      
      





このコードには、JDBC用のMySQL Connector / Jが必要です。



これで、最後のコンポーネントであるテンプレートエンジンが残ります。



フリーマーカー



FreeMarkerは、HTMLとHTTPだけでなく、間違いなくJavaの最高のテンプレートエンジンです。 その豊富な機能については、別の記事を書くことができますので、すぐに詳細に目を向けてください。



このようなテンプレートを./templates/template.ftl



入れてください:

 <html> <head> <title>${title}</title> </head> <body> <h1>${title}</h1> <#if message??> <pre>${message?html}</pre> <#else> <form method="post"> <textarea name="message"></textarea> <p><input type="submit" value="Post!"/></p> </form> </#if> </body> </html>
      
      





サフィックス?html



、同じ特殊文字を、置換された変数のエスケープシーケンスに置き換えます。 このテンプレートは次のサーブレットを使用します。

 importPackage(Packages.freemarker.template); importPackage(Packages.freemarker.ext.rhino); var configuration = new Configuration(); configuration.setObjectWrapper(new RhinoWrapper()); //   . var template = configuration.getTemplate('templates/template.ftl'); exports.doGet = function(request, response) { response.setContentType('text/html;charset=UTF-8'); template.process( {'title': 'Compose a message'}, response.getWriter() ); }; exports.doPost = function(request, response) { response.setContentType('text/html;charset=UTF-8'); template.process( { 'title': 'Message', 'message': request.getParameter('message') }, response.getWriter() ); };
      
      





Node.jsとの比較読者を気の毒に思う。 完全なサンプルコードはGitHubで入手できます



All Articles