4

この単純なケースでは、静的ページに対して、Jetty が Web 要求を処理する方法を構成するために Guice サーブレットを動作させるのに苦労しています。

GuiceServlet を使用するリクエストと、使用しないリクエストの 2 つの異なるリクエストをマップすることになっている単純なアプリケーションを作成しました。後者は機能しますが、GuiceServlet にマップされたものは 404 エラーを返します。

任意のヒント?私が使用しています:JDK 1.7.0_15; eclipse.jetty.jetty-サーブレット 8.1.9.v20130131; guice サーブレット 3.0。ありがとう。

public class Main {
    public static void main(String... args) {
        Guice.createInjector().getInstance(Main.class).start();
    }

    public void start() {
        Server server = new Server(8080);
        ServletContextHandler handler = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
        handler.addEventListener(new MyGuiceServletConfig());
        handler.addServlet(MyServlet.class, "/non-guice");
        server.setHandler(handler);
        try {
            server.start();
            server.join();
        } catch (Exception e) {
            e.printStackTrace();
        }       
    }
}

public class MyGuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                System.out.println("MyGSC->getInjector->configureServlets"); //I'm seeing this in the console...
                serve("/guice").with(MyServlet.class);
            }
        });
    }
}

@Singleton
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("Hello!\nYour path is: " + request.getServletPath());        
    }
}

これを超えて、さまざまなインジェクターを作成する最良の方法は何ですか? main(..) をそのように構造化して、他のモジュールをプラグインできるようにし、どこかで見たように MyServletModule を MyGuiceServletConfig で指定したままにします - これは正しいですか?

4

2 に答える 2

3

機能する方法で、これをはるかに簡単にすることができました。「/」パスに DefaultServlet を追加する必要がありました。

public class MyMain {
    public static void main(String... args) throws Exception {
        Guice.createInjector(new MyServletModule());
        Server server = new Server(8080);    
        ServletContextHandler handler = 
            new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
        handler.addFilter(GuiceFilter.class, "/*", allOf(DispatcherType.class));
        handler.addServlet(DefaultServlet.class, "/");
        server.start();
    }
}

@Singleton
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().print("Hello!\nYour path is: " + request.getServletPath());        
    }
}

public class MyServletModule extends ServletModule {
    @Override
    protected void configureServlets() {
        serve("/guice").with(MyServlet.class);
    }
}
于 2013-03-05T21:13:20.293 に答える
1

Jettyに静的コンテンツを提供させたい場合は、必ずDefaultServletも構成してください。

Jetty埋め込みサンプルツリーにある例:OneServletContext.java

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;

public class OneServletContext
{
    public static void main(String[] args) throws Exception
    {
        Server server = new Server(8080);

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        // Serve static content from /tmp
        ServletHolder holder = context.addServlet(DefaultServlet.class,"/tmp/*");
        holder.setInitParameter("resourceBase","/tmp");
        holder.setInitParameter("pathInfoOnly","true");

        // Serve some hello world servlets
        context.addServlet(new ServletHolder(new HelloServlet()),"/*");
        context.addServlet(new ServletHolder(new HelloServlet("Buongiorno Mondo")),"/it/*");
        context.addServlet(new ServletHolder(new HelloServlet("Bonjour le Monde")),"/fr/*");

        server.start();
        server.join();
    }
}

これにより、ファイルシステムディレクトリのコンテンツが/tmpのURLコンテキストパスとして提供されますhttp://localhost:8080/tmp/

例:

File System       URL
/tmp/hello.txt    http://localhost:8080/tmp/hello.txt
/tmp/a/hi.txt     http://localhost:8080/tmp/a/hi.txt
/tmp/index.html   http://localhost:8080/tmp/
于 2013-03-05T19:28:52.883 に答える