【问题标题】:Using Guice Servlet with Jetty to map paths to servlets without using a web.xml使用带有 Jetty 的 Guice Servlet 将路径映射到 servlet,而不使用 web.xml
【发布时间】:2013-03-05 19:19:02
【问题描述】:

我正在努力让 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 中指定,正如我在某处看到的那样 - 这是正确的吗?

【问题讨论】:

    标签: java jetty guice embedded-jetty guice-servlet


    【解决方案1】:

    我最终能够以一种有效的方式简单得多。需要为“/”路径添加 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);
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您希望 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") 提供服务似乎可以正常工作?我可能把问题的标题弄错了。
      • 我遇到的问题是,如果我在 Guice 之外以编程方式指定 HelloWorld 样式的 servlet,但通过 Guice Servlet 指定的 servlet 不起作用。
      • 哦,在这种情况下,请正确设置 guiceFilter ...code.google.com/p/google-guice/wiki/Servlets
      • 不能像like 那样以编程方式完成吗?类似于:FilterHolder guiceFilter = new FilterHolder(injector.getInstance(GuiceFilter.class));handler.addFilter(guiceFilter, "/*", EnumSet.allOf(DispatcherType.class));
      猜你喜欢
      • 2012-01-02
      • 2012-02-19
      • 2015-03-01
      • 2013-01-20
      • 1970-01-01
      • 2016-02-05
      • 2016-07-05
      • 2012-04-17
      相关资源
      最近更新 更多