使用Guice Servlet和Jetty,在不使用web.xml的情况下将路径映射到servlet。

4

我在使用Guice Servlet配置Jetty提供Web请求时遇到了困难,特别是对于静态页面。我创建了一个简单的应用程序,可以映射两个不同的请求,一个使用GuiceServlet,另一个不使用。后者有效,而映射到GuiceServlet的那个返回404错误。

有什么建议吗?我正在使用:JDK 1.7.0_15;eclipse.jetty.jetty-servlet 8.1.9.v20130131;guice-servlet 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中指定,就像我在某个地方看到的那样-这是正确的吗?
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);
    }
}

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提供内容,作为http://localhost:8080/tmp/的URL上下文路径。
示例:
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/

似乎对于正常添加的servlet(“/non-guice”)可以正常工作,但是没有这个呢?我可能给问题起了一个错误的标题。 - neuronotic
我遇到的问题是,如果我在Guice之外以编程方式指定HelloWorld样式的servlet,则可以提供服务,但是通过Guice Servlet指定的那个却无法工作。 - neuronotic
哦,那样的话,请适当设置guiceFilter... http://code.google.com/p/google-guice/wiki/Servlets - Joakim Erdfelt
这个不能通过编程方式完成吗?就像这篇文章里的那些人所做的一样:使用以下代码片段:FilterHolder guiceFilter = new FilterHolder(injector.getInstance(GuiceFilter.class)); handler.addFilter(guiceFilter, "/*", EnumSet.allOf(DispatcherType.class)); - neuronotic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接