2011-11-25 5 views
8

Tôi không biết làm thế nào để tiếp tục với một ví dụ guice đơn giản. Sau khi đọc các tài liệu tôi đã thực hiện như sau:Ví dụ đơn giản với Guice Servlets

  • thiết lập guiceFilter
  • tạo một vòi phun và khởi tạo một ServletModule mới trong một GuiceServletContextListener và thêm người nghe để web.xml
  • ràng buộc serve("*.jsp").with(IndexController.class); trong servlets configure

Sau khi tôi đã làm điều đó, làm cách nào để sử dụng tính năng tiêm phụ thuộc? Giả sử tôi có một index.jsp, IndexController.class (servlet) và hai lớp được gọi là Person và Order với Person tùy thuộc vào Order. Làm thế nào để tiêm phụ thuộc vào thứ tự vào người xây dựng thông qua guice và sau khi tôi làm điều đó tôi sẽ cần phải trả lại nói một danh sách các đơn đặt hàng của người này trở lại bộ điều khiển? Tôi đã sử dụng Ninject với ASP.NET MVC trong quá khứ và đó là khá đơn giản, nhưng tôi rất bối rối về cách thực hiện ngay cả ví dụ DI đơn giản nhất với Guice. Cảm ơn.

Trả lời

20

Để bắt đầu, đây là ví dụ cho phép đưa dịch vụ trả về danh sách tên vào bộ điều khiển chỉ mục. (Không có sự lừa dối trong ví dụ này, mọi thứ đều rõ ràng.)

Giao diện ListService xác định dịch vụ đơn giản.

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

DummyListService cung cấp thực hiện tầm thường.

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

ListModule dây ListService đến việc thực hiện dummy.

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

GuiceServletContextListener thực hiện ánh xạ một servlet để chỉ mục, và tạo ra một ListModule như trên.

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

IndexController đặt tên vào phạm vi yêu cầu (bằng tay) và chuyển tiếp đến một trang 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); 
    } 

} 

Trang JSP đổ tên (chỉ phân đoạn).

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

@Dave cảm ơn ví dụ đáng kinh ngạc này. Một câu hỏi ... nên ListModule mở rộng ServletModule hoặc là không cần thiết? – Robert

+1

@Robert Nope; nó không phải là một mô-đun servlet. [Mô-đun Servlet] (http://google-guice.googlecode.com/svn/tags/3.0/javadoc/com/google/inject/servlet/ServletModule.html) rõ ràng để định cấu hình trình xử lý yêu cầu, AFAICT. Ngoài ra, bạn không thể sử dụng 'ServletModule.configure()' để thực hiện cùng một công việc, vì nó là phương thức 'final'. –

+0

@Lưu Ah ... Tôi hoàn toàn bỏ lỡ điều đó. Cảm ơn đã giúp đỡ. Rất nhiều đánh giá cao. – Robert