{"id":183334,"date":"2013-06-14T14:03:03","date_gmt":"2013-06-14T10:03:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=183334"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=183334","title":{"rendered":"<span class=\"post_title\">Java + Rhino + Jetty + FreeMarker vs Node.js<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/cbf\/9de\/bdb\/cbf9debdbfbb1da43344c5acba72b486.jpg\"\/><br \/>  \u0425\u043e\u0442\u044c Node.js \u0438 \u043e\u0431\u0437\u0430\u0432\u0435\u043b\u0441\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/joyent\/node\/wiki\/modules\">\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/a>, \u043e\u043d \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Category:Java_libraries\">\u043c\u043e\u0449\u043d\u043e\u043c\u0443 \u043d\u0430\u0431\u043e\u0440\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/a> Java. \u0422\u0430\u043a \u043e\u0442\u0447\u0435\u0433\u043e \u0431\u044b \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u043c Java \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 JavaScript? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 JavaScript MVC framework \u043d\u0430 Java.<\/p>\n<h4>Mozilla Rhino<\/h4>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u043e\u0441\u043e\u0440\u043e\u0433\u043e\u0432. \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\/\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 JavaScript \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u043e\u043a <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Rhino\">Mozilla Rhino<\/a>, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 ECMAScript \u0432 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 J2SE 6 Rhino \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 JRE \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Java Scripting API, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0432 JRE \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 <a href=\"http:\/\/stackoverflow.com\/questions\/4801037\/sun-org-mozilla-rhino-and-extending-java-abstract-classes\">\u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442 Sun, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Rhino\/Download_Rhino?redirectlocale=en-US&amp;redirectslug=RhinoDownload\">\u0441\u0432\u0435\u0436\u0438\u043c build-\u043e\u043c<\/a>.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, <code>helloworld.js<\/code>:  <\/p>\n<pre><code class=\"javascript\">print('Hey you!'); <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Rhino \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 <code>.\/lib<\/code>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"bash\">java -Djava.ext.dirs=.\/lib org.mozilla.javascript.tools.shell.Main helloworld.js <\/code><\/pre>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0435 \u0438\u0434\u0435\u0442 \u0438 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a \u0441 \u043d\u0435\u043f\u043b\u043e\u0445\u0438\u043c UI, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u043d \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">java -Djava.ext.dirs=.\/lib org.mozilla.javascript.tools.debugger.Main helloworld.js <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/c4e\/190\/b8b\/c4e190b8b8101b5b326120125a8ef181.png\"\/><\/p>\n<p>  Rhino, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 ECMAScript, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0446\u0435\u043b\u044b\u0439 \u0440\u044f\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u044e\u0449\u0438\u0445 \u0441\u0432\u044f\u0437\u044c JavaScript \u0441 Java. \u0414\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0435 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u0438\u0437 \u043a\u043e\u0434\u0430 \u043d\u0430 JavaScript \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043a\u043e\u0434\u043e\u043c \u043d\u0430 Java. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>Packages<\/code>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 <code>java.io.File<\/code>:  <\/p>\n<pre><code class=\"javascript\">var file = new Packages.java.io.File('filename'); <\/code><\/pre>\n<p>  \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0442\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b <code>java<\/code>, <code>com<\/code>, <code>org<\/code>, <code>edu<\/code> \u0438 <code>net<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e:  <\/p>\n<pre><code class=\"javascript\">var file = new java.io.File('filename'); <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c pattern-\u043e\u043c:  <\/p>\n<pre><code class=\"javascript\">var File = java.io.File; \/\/... var file = new File('filename'); <\/code><\/pre>\n<p>  \u041d\u043e \u0432\u0441\u0435 \u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"javascript\">importClass(java.io.File); \/\/... var file = new File('filename'); <\/code><\/pre>\n<p>  \u0418\u043b\u0438 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"javascript\">importPackage(java.io); \/\/... var file = new File('filename'); <\/code><\/pre>\n<p>  Rhino \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b Java \u0443\u0434\u043e\u0431\u043d\u044b\u043c \u0434\u043b\u044f JS-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c:  <\/p>\n<pre><code class=\"javascript\">var runnable = new java.lang.Runnable({run: function() { print(&quot;I'm running!&quot;); }}); new java.lang.Thread(runnable).start(); <\/code><\/pre>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <code>java.lang<\/code> <b>\u043d\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/b> \u0432\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 ECMAScript.<\/p>\n<p>  \u0410 \u0435\u0449\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Rhino \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <a href=\"http:\/\/wiki.commonjs.org\/wiki\/Modules\">CommonJS<\/a>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 Rhino Shell \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e switch-\u0430 <code>-require<\/code>.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c <code>.\/modules\/math.js<\/code>:  <\/p>\n<pre><code class=\"javascript\">exports.sum = function(a, b) {   return a + b; } <\/code><\/pre>\n<p>  \u0422\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"javascript\">var math = require('math'); print(math.sum(2, 4)); <\/code><\/pre>\n<p>  \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">java -Djava.ext.dirs=.\/lib org.mozilla.javascript.tools.shell.Main -require -modules .\/modules test.js <\/code><\/pre>\n<h4>Jetty<\/h4>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u044b \u0434\u043b\u044f HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c <a href=\"http:\/\/www.eclipse.org\/jetty\/\">Jetty<\/a>. Jetty \u2014 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 servlet-\u043e\u0432, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u0433\u0438\u0431\u043a\u0438\u0439 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 web-server \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 SPDY, WebSocket, OSGi, JMX, JNDI \u0438 JAAS. \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432 \u043c\u043e\u0436\u043d\u043e <a href=\"http:\/\/download.eclipse.org\/jetty\/stable-9\/dist\/\">\u0442\u0443\u0442<\/a>.<\/p>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 Jetty:  <\/p>\n<pre><code class=\"javascript\">importPackage(org.eclipse.jetty.server);  var server = new Server(8888); \/\/ \u041f\u043e\u0440\u0442 8888 server.start(); server.join(); \/\/ \u041f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Jetty <\/code><\/pre>\n<p>  JAR-\u044b \u0438\u0437 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430 Jetty \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 <code>.\/lib<\/code>, \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"bash\">java -Djava.ext.dirs=.\/lib org.mozilla.javascript.tools.shell.Main -require -modules .\/modules server.js <\/code><\/pre>\n<p>  <b>\u0414\u0430, \u044d\u0442\u043e \u0432\u0441\u0435.<\/b><\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432\u044b\u0434\u0430\u0435\u0442 <code>HTTP 404<\/code> \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435. \u041f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.  <\/p>\n<pre><code class=\"javascript\">importPackage(org.eclipse.jetty.server); importPackage(org.eclipse.jetty.server.handler);  var resourceHandler = new ResourceHandler(); resourceHandler.setDirectoriesListed(true); \/\/ \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u043f\u0438\u0441\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0430\u0445 resourceHandler.setResourceBase('web'); \/\/ \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e .\/web resourceHandler.setWelcomeFiles(['index.html']); \/\/ \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f index.html  var server = new Server(8888); server.setHandler(resourceHandler); server.start(); server.join(); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c servlet.  <\/p>\n<pre><code class=\"javascript\">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({ \/\/ \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u0435\u0449\u0435 \u0440\u0430\u0437 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u0438\u0437\u044f\u0449\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b     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(); <\/code><\/pre>\n<p>  \u041d\u0430\u0448 servlet \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <code>http:\/\/localhost:8888\/test<\/code>. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0435\u0449\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u0444\u043e\u0440\u043c\u0438\u043c \u0432 \u0432\u0438\u0434\u0435 \u043c\u043e\u0434\u0443\u043b\u044f servlet, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u043b\u0435\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c.  <\/p>\n<pre><code class=\"javascript\">importPackage(java.awt.image); importClass(java.awt.Color); importClass(javax.imageio.ImageIO); \/\/ \u0412\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 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(); }; <\/code><\/pre>\n<p>  \u041f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0443 <code>.\/modules<\/code> \u043a\u0430\u043a <code>imageServlet.js<\/code> \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0432 \u043a\u043e\u0434 \u0441\u0435\u0440\u0432\u0435\u0440\u0430:  <\/p>\n<pre><code class=\"javascript\">contextHandler.addServlet(   new ServletHolder(new HttpServlet(require('imageServlet'))),   '\/image.png' ); <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0442\u0430\u043c \u0441 \u0421\u0423\u0411\u0414? \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 MySQL.  <\/p>\n<pre><code class=\"javascript\">importPackage(java.sql);  exports.doGet = function(request, response) {   var resultSet = DriverManager.getConnection('jdbc:mysql:\/\/localhost\/?', 'root', '')     .createStatement()     .executeQuery('show databases;');    response.setContentType('text\/html;charset=UTF-8');   var writer = response.getWriter();   writer.println('&lt;h1&gt;Databases&lt;\/h1&gt;');   while (resultSet.next()) {     writer.println(resultSet.getString('Database') + '&lt;br \/&gt;');   } }; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f <a href=\"http:\/\/dev.mysql.com\/downloads\/connector\/j\/\">MySQL Connector\/J<\/a> \u0434\u043b\u044f JDBC.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440.<\/p>\n<h4>FreeMarker<\/h4>\n<p>  <a href=\"http:\/\/freemarker.sourceforge.net\/\">FreeMarker<\/a> \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f Java, \u043f\u0440\u0438\u0447\u0435\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f HTML \u0438 HTTP. \u041f\u0440\u043e \u0435\u0433\u043e \u0431\u043e\u0433\u0430\u0442\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0435.<\/p>\n<p>  \u041f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 <code>.\/templates\/template.ftl<\/code> \u0442\u0430\u043a\u043e\u0439 \u0432\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d:  <\/p>\n<pre><code class=\"html\">&lt;html&gt; &lt;head&gt; &lt;title&gt;${title}&lt;\/title&gt; &lt;\/head&gt; &lt;body&gt; &lt;h1&gt;${title}&lt;\/h1&gt; &lt;#if message??&gt;   &lt;pre&gt;${message?html}&lt;\/pre&gt; &lt;#else&gt;   &lt;form method=&quot;post&quot;&gt;     &lt;textarea name=&quot;message&quot;&gt;&lt;\/textarea&gt;     &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;Post!&quot;\/&gt;&lt;\/p&gt;   &lt;\/form&gt; &lt;\/#if&gt; &lt;\/body&gt; &lt;\/html&gt; <\/code><\/pre>\n<p>  \u0421\u0443\u0444\u0444\u0438\u043a\u0441 <code>?html<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0432 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <a href=\"https:\/\/www.owasp.org\/index.php\/Cross-site_Scripting_(XSS)\">\u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u043f\u0435\u0446\u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/a> \u043d\u0430 escape-\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 servlet:  <\/p>\n<pre><code class=\"javascript\">importPackage(Packages.freemarker.template); importPackage(Packages.freemarker.ext.rhino);  var configuration = new Configuration(); configuration.setObjectWrapper(new RhinoWrapper()); \/\/ \u041f\u043e\u0438\u0441\u0442\u0438\u043d\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0441\u044e\u0440\u043f\u0440\u0438\u0437. 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()   ); }; <\/code><\/pre>\n<p>  \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 Node.js \u044f \u0431\u043b\u0430\u0433\u043e\u0440\u043e\u0434\u043d\u043e \u0441\u0432\u0430\u043b\u0438\u0432\u0430\u044e \u043d\u0430 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f. \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/dannote\/rhinomvc\">GitHub<\/a>. \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/183334\/\"> http:\/\/habrahabr.ru\/post\/183334\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/storage2\/cbf\/9de\/bdb\/cbf9debdbfbb1da43344c5acba72b486.jpg\"\/><br \/>  \u0425\u043e\u0442\u044c Node.js \u0438 \u043e\u0431\u0437\u0430\u0432\u0435\u043b\u0441\u044f \u0441 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f <a href=\"https:\/\/github.com\/joyent\/node\/wiki\/modules\">\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u0439<\/a>, \u043e\u043d \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c <a href=\"http:\/\/en.wikipedia.org\/wiki\/Category:Java_libraries\">\u043c\u043e\u0449\u043d\u043e\u043c\u0443 \u043d\u0430\u0431\u043e\u0440\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a<\/a> Java. \u0422\u0430\u043a \u043e\u0442\u0447\u0435\u0433\u043e \u0431\u044b \u043d\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u043e\u043c Java \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 JavaScript? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 JavaScript MVC framework \u043d\u0430 Java.<\/p>\n<h4>Mozilla Rhino<\/h4>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043d\u043e\u0441\u043e\u0440\u043e\u0433\u043e\u0432. \u0414\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438\/\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 JavaScript \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0438\u0436\u043e\u043a <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Rhino\">Mozilla Rhino<\/a>, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u043a\u043e\u0434\u0430 ECMAScript \u0432 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 J2SE 6 Rhino \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 JRE \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 Java Scripting API, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0432 JRE \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0438, \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 <a href=\"http:\/\/stackoverflow.com\/questions\/4801037\/sun-org-mozilla-rhino-and-extending-java-abstract-classes\">\u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u043c\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c\u0438<\/a> \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0442 Sun, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Rhino\/Download_Rhino?redirectlocale=en-US&amp;redirectslug=RhinoDownload\">\u0441\u0432\u0435\u0436\u0438\u043c build-\u043e\u043c<\/a>.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, <code>helloworld.js<\/code>:  <\/p>\n<pre><code class=\"javascript\">print('Hey you!'); <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Rhino \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u044b \u0432 <code>.\/lib<\/code>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:  <\/p>\n<pre><code class=\"bash\">java -Djava.ext.dirs=.\/lib org.mozilla.javascript.tools.shell.Main helloworld.js <\/code><\/pre>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-183334","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/183334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=183334"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/183334\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=183334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=183334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=183334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}