2011-11-25 274 views
8

我不知道如何處理一個簡單的guice示例。閱讀文檔我已經做了以下後:Guice Servlets的簡單示例

  • 設置的guiceFilter
  • 創造了一個注射器,並在GuiceServletContextListener實例化一個新的servlet和添加偵聽到web.xml
  • 在配置servlet的約束serve("*.jsp").with(IndexController.class);

當我這樣做後,我該如何使用依賴注入?比方說,我有一個index.jsp,IndexController.class(s​​ervlet)和兩個名爲Person和Order的Person,其中Person依賴於Order。如何通過guice將Order依賴注入到Person構造函數中,並且在我這樣做之後,我需要返回將此人的命令列表返回給控制器?我以前在ASP.NET MVC中使用過Ninject,這很簡單,但是我很困惑如何使用Guice實現最簡單的DI示例。謝謝。

回答

20

要開始,下面是一個示例,該示例將注入名稱列表的服務注入到索引控制器中。 (在這個例子中沒有欺騙,一切都是明確的)。

ListService接口定義了簡單的服務。

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

DummyListService提供了簡單的實現。

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

ListModule電線ListService到啞實現。

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

GuiceServletContextListener執行映射servlet來索引,並且如上文創建ListModule

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

IndexController提出的名稱到請求範圍(手動地)並轉發到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); 
    } 

} 

JSP頁面轉儲名(僅片段)。

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

@Dave感謝這個令人難以置信的例子。一個問題...應該ListModule擴展ServletModule還是沒有必要? – Robert

+1

@Robert Nope;它不是一個servlet模塊。 [Servlet模塊](http://google-guice.googlecode.com/svn/tags/3.0/javadoc/com/google/inject/servlet/ServletModule.html)明確用於配置請求處理程序AFAICT。另外你不能使用'ServletModule.configure()'做同樣的工作,因爲它是一個'final'方法。 –

+0

@Dave啊......我完全錯過了。謝謝您的幫助。非常感謝。 – Robert