2011-11-25 10 views
8

私は単純なguiceの例を進める方法がわかりません。ドキュメントを読んだ後、私は次のことをやった:Guiceサーブレットを使用した簡単な例

  • セットアップguiceFilter
  • は、インジェクタを作成し、GuiceServletContextListenerに新しいServletModuleをインスタンス化し、
  • をweb.xmlにリスナーを追加したのconfigureサーブレットでserve("*.jsp").with(IndexController.class);を拘束しました

私はそれをどうしたら依存性注入を使うのですか?私は、index.jsp、IndexController.class(サーブレット)、およびOrde​​rに応じてPersonとOrderというPersonとOrderという2つのクラスがあるとしましょう。 Guiceを介してPersonコンストラクタにOrder依存関係を注入するにはどうしたらいいですか?そうしたら、この人の注文のリストをコントローラに返す必要がありますか?以前は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実装は、インデックスにサーブレットをマッピングし、上記のよう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この素晴らしい例のおかげで、 1つの質問... ListModuleはServletModuleを拡張する必要がありますか? – Robert

+1

@Robert Nope;それはサーブレットモジュールではありません。 [サーブレットモジュール](http://google-guice.googlecode.com/svn/tags/3.0/javadoc/com/google/inject/servlet/ServletModule.html)は、リクエストハンドラAFAICTを設定するためのものです。さらに、 'final'メソッドなので、' ServletModule.configure() 'を使って同じ作業をすることはできません。 –

+0

@Daveああ...私は完全にそれを逃した。助けてくれてありがとう。非常に高く評価。 – Robert

関連する問題