2012-07-01 1 views
0

J'essaye d'intégrer Jetty dans un Sketch de traitement. Jusqu'à présent, je l'ai fait travailler pour servir des fichiers statiques (un répertoire html dans le dossier Sketch).Jetty embed dans Processing.org, assets statiques + POST

Je souhaite réagir à un POST avec une entrée utilisateur provenant de l'une des pages statiques.

Comme je n'ai aucune connaissance sur Jetty et venant d'un PHP & Ruby (RoR) web de programmation de fond Je suis très confus avec la façon dont les choses vont dans Jetty.

Je veux simplement quelque chose de similaire à des routes où tout, sauf par ex.

"localhost:8080/post?string=whatever" 

est un fichier statique. La chaîne post? = Tout ce qui devrait déclencher une fonction (en cours de traitement) où la chaîne soumise est gérée.

Je lisais beaucoup les docs de la jetée mais je n'arrivais pas à comprendre comment le faire.

Merci beaucoup pour toute aide!

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) { 
    }; 


} 

Répondre

3

Oui, la jetée peut être très déroutant au début, surtout quand vous voulez seulement faire quelques choses simples (pas nécessairement des applications Web épanouies).

La clé de ce travail est d'utiliser un ContextHandler pour chacun de vos autres gestionnaires (par exemple ResourceHandler). Vous pouvez indiquer au ContextHandler le contexte (c'est-à-dire l'URL) auquel il doit répondre. Après avoir fait, vous devez mettre à la fois dans un ContextHandlerCollection (uff ...), de sorte que votre serveur sait ce qui existe un contexte ContextHandler pour le ResourceHandler et votre gestionnaire personnalisé (par exemple PostHandler).

Jetty

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); 
} 

Votre PostHandler pourrait ressembler à ceci:

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."); 
     } 
    } 
}