Simple Example with Guice Servlets

家住魔仙堡 提交于 2019-12-03 13:01:34

问题


I don't know how to proceed with a simple guice example. After reading the documentation I've done the following:

  • setup the guiceFilter
  • created an injector and instantiated a new ServletModule in a GuiceServletContextListener and added the listener to web.xml
  • bound serve("*.jsp").with(IndexController.class); in configure servlets

After I've done that how do I use dependency injection? Let's say I have an index.jsp, IndexController.class (servlet), and two classes called Person and Order with Person depending on Order. How do I inject the Order dependency into the Person constructor via guice and after I do that I would need to return say a list of this person's orders back to the controller? I've used Ninject with ASP.NET MVC in the past and that was pretty simple, but I'm very confused on how to implement even the simplest DI example with Guice. Thanks.


回答1:


To get started, here's an example that injects a service returning a list of names into an index controller. (No trickery in this example, everything is explicit.)

ListService interface defines simple service.

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

DummyListService provides trivial implementation.

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

ListModule wires ListService to the dummy implementation.

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

GuiceServletContextListener implementation maps a servlet to index, and creates a ListModule as above.

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

IndexController puts the names into the request scope (manually) and forwards to a JSP page.

@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);
    }

}

JSP page dumps the names (fragment only).

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


来源:https://stackoverflow.com/questions/8275194/simple-example-with-guice-servlets

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!