Jetty incrustado en Processing.org, activos estáticos + POST

Estoy tratando de incrustar Jetty en un boceto de procesamiento. Hasta ahora lo hice funcionar para servir archivos estáticos (un directorio html en la carpeta Sketch).

Quiero reaccionar a un POST con una entrada de usuario de una de las páginas estáticas.

Como no tengo conocimiento sobre Jetty y vengo de un fondo de programación web PHP y Ruby (RoR), estoy muy confundido con la forma en que funcionan las cosas en Jetty.

Simplemente quiero algo similar a las rutas donde todo excepto, por ejemplo.

"localhost:8080/post?string=whatever"

es un archivo estático.

La publicación? Cadena = lo que sea que tal vez debería desencadenar una función (en Procesamiento) donde se maneja la Cadena enviada.

He estado leyendo mucho los documentos de Jetty, pero hasta ahora no pude descubrir cómo hacerlo.

¡Muchas gracias por cualquier ayuda!

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

String poststr;

void setup() {

  Server server = new Server();
  SelectChannelConnector connector = new SelectChannelConnector();
  connector.setPort(8080);
  server.addConnector(connector);

  ResourceHandler resource_handler = new ResourceHandler();
  resource_handler.setDirectoriesListed(true);
  resource_handler.setWelcomeFiles(new String[] { 
    "index.html"
  }
  );

  resource_handler.setResourceBase(sketchPath("")+"pftf");

  HandlerList handlers = new HandlerList();
  handlers.setHandlers(new Handler[] { 
    resource_handler, new DefaultHandler()
  }
  );
  server.setHandler(handlers);




  try {
    server.start();
    server.join();
  } 
  catch(Exception e) {
  };


}

preguntado el 01 de julio de 12 a las 13:07

1 Respuestas

Sí, Jetty puede ser muy confuso al principio, especialmente cuando solo desea hacer un par de cosas simples (no necesariamente aplicaciones web completas).

La clave para que esto funcione es utilizar un Controlador de contexto para cada uno de sus otros controladores (por ejemplo, controlador de recursos). Puede decirle a ContextHandler a qué contexto (es decir, URL) debe responder. Después de crear un ContextHandler para ResourceHandler y su controlador personalizado (por ejemplo, PostManejador) tienes que poner ambos en un ColecciónContextHandlerCollectionContextHandlerCollection (uff ...), por lo que su servidor sabe qué contextos existen.

Embarcadero

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;


void setup() {
    /* Configure the http server */
    Server server = new Server();
    SelectChannelConnector connector = new SelectChannelConnector();
    connector.setPort(8080);
    server.addConnector(connector);

    /* Resources */
    ResourceHandler resourceHandler = new ResourceHandler();
    resourceHandler.setDirectoriesListed(true);
    resourceHandler.setWelcomeFiles(new String[] { 
        "index.html"
    }
    );

    resourceHandler.setResourceBase(sketchPath("")+"pftf");
    ContextHandler resourceContext = new ContextHandler();
    resourceContext.setContextPath("/");
    resourceContext.setHandler(resourceHandler);


    /* Post API */
    PostHandler postHandler = new PostHandler();
    ContextHandler postContext = new ContextHandler();
    postContext.setContextPath("/post");
    postContext.setHandler(postHandler);

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    contexts.setHandlers(new Handler[] { 
        resourceContext, postContext
    }
    );

    server.setHandler(contexts);


    /* Start the server (finally)  */

    try {
        server.start();
        server.join();
    } 
    catch(Exception e) {
        println("Could not start http server. Reason: " + e.toString());
    };
}


void printCard(String mtext) {
    println("Printing card with text: " + mtext);
}

Tus PostManejador podría verse algo como esto:

public class PostHandler extends AbstractHandler
{
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/html;charset=utf-8");

        String stringParameter = request.getParameter("string");

        /* Check if the string parameter is there and not empty */
        if (stringParameter != null && !stringParameter.trim().equals("")) {

            response.setStatus(HttpServletResponse.SC_OK);
            baseRequest.setHandled(true);
            response.getWriter().println("<h1>You sent me: " + stringParameter + "</h1>");

            println("Received a string via /post: " + stringParameter);

            printCard(stringParameter);
        } 
        else {
            // Parameter is missing
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST );
            baseRequest.setHandled(true);
            response.getWriter().println("<h1>Error: Missing string parameter</h1>");

            println("Missing string via /post.");
        }
    }
}

Respondido 01 Jul 12, 22:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.