0

処理スケッチに Jetty を埋め込もうとしています。これまでのところ、静的ファイル (Sketch フォルダー内の html ディレクトリ) を提供できるようにしました。

静的ページの 1 つからのユーザー入力で 1 つの POST に反応したいと考えています。

私は Jetty についての知識がなく、PHP と Ruby (RoR) の Web プログラミングのバックグラウンドを持っているため、Jetty の動作に非常に混乱しています。

たとえば、すべてを除くすべてのルートに似たものが欲しいだけです

"localhost:8080/post?string=whatever"

静的ファイルです。

post?string=whatever は、送信された文字列が処理される関数 (処理中) をトリガーする必要があります。

私は 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;

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


}
4

1 に答える 1

3

はい、Jetty は最初は非常に混乱する可能性があります。特に、いくつかの単純なことだけを実行したい場合 (本格的な Web アプリケーションである必要はありません) は特にそうです。

これを機能させるための鍵は、他の各ハンドラー (例: ResourceHandler ) にContextHandlerを使用することです。ContextHandler に、どのコンテキスト (つまり URL) に応答する必要があるかを伝えることができます。ResourceHandler とカスタム Handler (例: PostHandler ) の ContextHandler を作成した後、両方をContextHandlerCollection ( uff ... ) に配置する必要があります。これにより、サーバーはどのコンテキストが存在するかを認識します。

桟橋

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

PostHandlerはのようになります。

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.");
        }
    }
}
于 2012-07-01T21:03:00.923 に答える