2013-03-05 3 views
4

Я борюсь с получением Guice Servlet, работающего над настройкой того, как Jetty обслуживает веб-запросы в этом простом случае для статических страниц.Использование Guice Servlet с Jetty для сопоставления путей к сервлетам без использования web.xml

Я создал простое приложение, которое должно отображать два разных запроса: один с использованием 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());   
    } 
} 

Помимо этого, что является лучшим способом создания различных форсунок? У меня есть основной (..) структурированный таким образом, чтобы я мог подключать другие модули, оставляя MyServletModule указанным в MyGuiceServletConfig, как я где-то видел - это правильно?

ответ

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 в качестве контекста 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/ 
+0

Как представляется, это нормально для обслуживания сервлета, добавленного нормально («/ non-guice») без этого? Возможно, я неправильно назвал этот вопрос. – neuronotic

+0

Проблема, с которой я столкнулась, заключается в том, что я могу служить сервлетам стиля HelloWorld, если я их программно программирую за пределами Guice, но тот, который указан через Guice Servlet, не работает. – neuronotic

+0

О, в этом случае правильно настройте guiceFilter ... http://code.google.com/p/google-guice/wiki/Servlets –

Смежные вопросы