2011-11-25 12 views
8

No sé cómo proceder con un ejemplo simple de guice. Después de leer la documentación que he hecho lo siguiente:Ejemplo simple con Servlets de Guice

  • configuración del guiceFilter
  • creado un inyector y una nueva instancia ServletModule en un GuiceServletContextListener y ha añadido que el oyente web.xml
  • obligado serve("*.jsp").with(IndexController.class); en servlets de configure

Después de haberlo hecho, ¿cómo uso la inyección de dependencia? Digamos que tengo un index.jsp, IndexController.class (servlet) y dos clases llamadas Person and Order with Person (persona y orden) dependiendo del orden. ¿Cómo inyecté la dependencia de orden en el constructor de persona a través de guice y después de hacerlo tendré que devolver una lista de las órdenes de esta persona al controlador? He usado Ninject con ASP.NET MVC en el pasado y eso fue bastante simple, pero estoy muy confundido sobre cómo implementar incluso el ejemplo DI más simple con Guice. Gracias.

Respuesta

20

Para comenzar, he aquí un ejemplo que inyecta un servicio que devuelve una lista de nombres en un controlador de índice. (Sin engaños en este ejemplo, todo es explícito.)

ListService interfaz define el servicio simple.

public interface ListService { 
    List<String> names(); 
} 

DummyListService proporciona aplicación trivial.

public class DummyListService implements ListService { 
    public List<String> names() { 
     return Arrays.asList("Dave", "Jimmy", "Nick"); 
    } 
} 

ListModule cables ListService a la aplicación ficticia.

public class ListModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(ListService.class).to(DummyListService.class); 
    } 
} 

GuiceServletContextListener aplicación asigna un servlet para indexar, y crea una ListModule que el anterior.

@Override 
protected Injector getInjector() { 
    return Guice.createInjector(
      new ServletModule() { 
       @Override protected void configureServlets() { 
        serve("/index.html").with(IndexController.class); 
       } 
      }, 
      new ListModule()); 
} 

IndexController pone los nombres en el ámbito de la petición (manualmente) y hacia delante a una página JSP.

@Singleton 
public class IndexController extends HttpServlet { 

    @Inject ListService listService; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     req.setAttribute("names", listService.names()); 
     req.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(req, resp); 
    } 

} 

página JSP vertederos de los nombres (sólo fragmento).

<c:forEach items="${names}" var="name"> 
    ${name}<br/> 
</c:forEach> 
+0

@Dave gracias por este increíble ejemplo. Una pregunta ... ¿debería ListModule extender ServletModule o no es necesario? – Robert

+1

@Robert Nope; no es un módulo servlet. [Módulos de servlet] (http://google-guice.googlecode.com/svn/tags/3.0/javadoc/com/google/inject/servlet/ServletModule.html) son explícitamente para configurar controladores de solicitudes, AFAICT. Además, no puede usar 'ServletModule.configure()' para hacer el mismo trabajo, ya que es un método 'final'. –

+0

@Dave Ah ... Me lo perdí por completo. Gracias por la ayuda. Muy apreciado. – Robert