!..y de frontend:TiddlyWiki Basándome en el hecho de que el [[Dojo toolkit|http://archive.dojotoolkit.org/nightly-src.tgz]] está diseñado para funcionar con [[spidermonkey|http://www.mozilla.org/js/spidermonkey/]], me planteo recuperar mi antiguo dúo Rhino-Jetty, pero esta vez teniendo en cuenta las Continuations y el módulo cometd, que nos permite hacer uso de [[Comet]] para facilitar actualizaciones del site en tiempo real. Leo en [[server-side javascript (bluishcoder) |http://www.bluishcoder.co.nz/2006/05/server-side-javascript.html]] que ya existe otra implementación aparte de la [[mía|jsdbc]] . También nos habla de [[spidermonkey-dojo |http://www.bluishcoder.co.nz/2006/05/dojo-and-spidermonkey.html]]... {{{ // Copyright (C) 2006 Chris Double. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, // INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND // FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE // DEVELOPERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // /* Load the JavascriptServlet Class. This wraps HttpServlet in a manner that allows it to be subclassed in Javascript */ importClass(Packages.JavascriptServlet) /* The rest of the routines are what is required to start up a Jetty 6 server from within Javascript. */ importClass(Packages.org.mortbay.jetty.Connector) importClass(Packages.org.mortbay.jetty.Server) importClass(Packages.org.mortbay.jetty.Handler) importClass(Packages.org.mortbay.jetty.handler.ContextHandler) importClass(Packages.org.mortbay.jetty.nio.SelectChannelConnector) importClass(Packages.org.mortbay.jetty.servlet.ServletHolder) importClass(Packages.org.mortbay.jetty.servlet.ServletHandler) importClass(Packages.org.mortbay.jetty.servlet.ServletMapping) importClass(Packages.org.mortbay.jetty.servlet.SessionHandler) /* Given a Javascript object containing method definitions, return an object that contains the JavaAdapter, servlet definition, classloader, etc */ function makeServlet(methods) { var s = {}; s["methods"] = methods; s["adapter"] = new JavaAdapter(JavascriptServlet, methods); s["classloader"] = s["adapter"].getClass().getClassLoader(); s["name"] = s["adapter"].getClass().getName(); s["holder"] = new JavaAdapter(ServletHolder, { newInstance: function () { return new JavaAdapter(JavascriptServlet, methods); } }); s["holder"].setName(s["name"]); s["holder"].setClassName(s["name"]); return s; } /* Given a port, return a SelectChannelConnector for that port */ function makeSelectChannelConnector(port) { var connector = new SelectChannelConnector(); connector.setPort(port); return connector; } /* Given a Javascript array of objects return a Java array of objects of the given type */ function toJArray(type, objects) { var jarray = java.lang.reflect.Array.newInstance(type, objects.length); for(var i = 0; i < objects.length; ++i) { jarray[i] = objects[i]; } return jarray; } /* Return a context which maps a javascript servlet object to a given server path */ function makeContext(path, servlet) { var context = new ContextHandler(); context.setContextPath(path); context.setClassLoader(servlet.classloader); return context; } /* Return a mapping between a server path and the servlet */ function makeMapping(path, servlet) { var mapping = new ServletMapping(); mapping.setPathSpec(path); mapping.setServletName(servlet.name); return mapping; } /* Start a Jetty 6 server on the given port. Return the server instance */ function startServer(port) { var server = new Server(); server.setConnectors(toJArray(Connector, [ makeSelectChannelConnector(port) ])); server.start(); return server; } function addServlet(server, path, servlet) { var handler = new ServletHandler() handler.setServlets(toJArray(ServletHolder, [servlet.holder])); handler.setServletMappings(toJArray(ServletMapping, [makeMapping("/", servlet)])); var sessionhandler = new SessionHandler(); sessionhandler.setHandler(handler); var context = makeContext(path, servlet); context.setHandler(sessionhandler); server.addHandler(context); } /* A simple HelloWorldServlet. It provides a definition for the abstract ProcessGet method in JavascriptServlet */ HelloWorldServlet = makeServlet({ ProcessGet: function (req, resp) { var text = "Hello World!"; resp.setContentType("text/plain") resp.setContentLength(text.length) resp.getOutputStream().print(text) resp.flushBuffer() } }); GoodbyeWorldServlet = makeServlet({ ProcessGet: function (req, resp) { var text = "Goodbye World!"; resp.setContentType("text/plain") resp.setContentLength(text.length) resp.getOutputStream().print(text) resp.flushBuffer() } }); HTMLServlet = makeServlet({ ProcessGet: function (req, resp) { var doctype = ''; var result =HTML Using E4X! Hello from E4X on: {new Date()}
; var text = doctype + result.toString(); resp.setContentType("text/html") resp.setContentLength(text.length) resp.getOutputStream().print(text) resp.flushBuffer() } }); }}} !!y en JavascriptServlet.java {{{ import javax.servlet.http.*; import java.io.*; import javax.servlet.ServletException; public abstract class JavascriptServlet extends HttpServlet { public JavascriptServlet() {} public abstract void ProcessGet(HttpServletRequest req, HttpServletResponse resp); protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { ProcessGet(req, resp); } } }}} Desde luego, lo de "ProcessGet" no me gusta mucho... En mi caso prefiero mantener la compatibilidad con la interfaz HttpServlet. Por otro lado, vemos como por cuestiones de eficiencia lo compila previamente. !!nota!!: El código está disponible aquí: [[http://www.lshift.net/~tonyg/javascript-server/|http://www.lshift.net/~tonyg/javascript-server/]] ---- En [[lshift|http://www.lshift.net/blog/2006/07/18/a-rhino-at-the-seaside]], cuentan como cargar prototype del lado del servidor En definitiva, abandono el back-end php/cctiddly y vuelvo a una versión estática en la espera de tener tiempo de enlazarlo todo. !Enlaces de interés: *[[Jetty 6.1|http://docs.codehaus.org/display/JETTY/Downloading+and+Installing#download]] *[[Dojo Toolkit|http://archive.dojotoolkit.org/]] *[[Dojo Spidermonkey]]
The date above was generated dynamically by calling new Date().