= サーブレット = [[[guice/Manual/Integration/WebandServlets|ウェブとサーブレット]]を参照のこと == 簡単な例 == 以下はGuice2.0, Jetty 7.0.1を使用する例。 {{{ http://localhost:8080/foo }}} や {{{ http://localhost:8080/foo/test }}} ではFooFilterが呼び出され、それ以外ではAllOtherFilterが呼び出される。 {{{ package test; import java.io.*; import javax.servlet.*; import org.eclipse.jetty.server.*; import org.eclipse.jetty.server.bio.*; import org.eclipse.jetty.servlet.*; import com.google.inject.*; import com.google.inject.servlet.*; public class GuiceServletOne { @Singleton public static class FooFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { System.out.println("FooFilter"); } public void init(FilterConfig c) {} public void destroy() {} } @Singleton public static class AllOtherFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { System.out.println("AllOtherFilter"); } public void init(FilterConfig c) {} public void destroy() {} } public static class GuiceServletConfig extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new ServletModule() { @Override protected void configureServlets() { filter("/foo", "/foo/*").through(FooFilter.class); filter("/*").through(AllOtherFilter.class); } }); } } public static void main(String[]args) throws Exception { Server server = new Server(); Connector connector = new SocketConnector(); connector.setPort(8080); server.addConnector(connector); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS); context.addFilter(GuiceFilter.class, "/*", 0); context.addEventListener(new GuiceServletConfig()); context.addServlet(DefaultServlet.class, "/"); server.start(); server.join(); } } }}} 上記の {{{ filter("/foo", "/foo/*").through(FooFilter.class); filter("/*").through(AllOtherFilter.class); }}} の順序に注意。逆にするとどんな場合でもAllOtherFilterが呼び出される。 == @RequestScopedと@SessionScopedの利用 == 以下のようにコードを追加・変更する。 {{{ @RequestScoped public static class RequestScopedObject { @Inject public RequestScopedObject(HttpServletRequest request, HttpServletResponse response, HttpSession session) { System.out.println("RequestScopedObject creation " + System.identityHashCode(this)); } } @SessionScoped public static class SessionScopedObject { @Inject public SessionScopedObject(HttpSession session) { System.out.println("SessionScopedObject creation " + System.identityHashCode(this)); } } @Singleton public static class FooFilter implements Filter { @Inject private Injector injector; public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { System.out.println("FooFilter"); RequestScopedObject reqScope = injector.getInstance(RequestScopedObject.class); SessionScopedObject sessScope = injector.getInstance(SessionScopedObject.class); System.out.println("" + System.identityHashCode(reqScope) + ", " + System.identityHashCode(sessScope)); } public void init(FilterConfig c) {} public void destroy() {} } }}} 「localhost:8080/foo/test」「localhost:8080/foo/sample」を呼び出すと次のような結果になる。 {{{ FooFilter RequestScopedObject creation 2804837 SessionScopedObject creation 8000886 2804837, 8000886 FooFilter RequestScopedObject creation 7100506 7100506, 8000886 }}} つまり、注入されたインジェクタからRequestScopedObjectとSessionScopedObjectを取得してみると、そのスコープに従ったオブジェクトが取得できるということである。 ちなみに、もちろんDOCOMO端末のようにクッキーをサポートしていないブラウザでは毎回SessionScopedObjectが作成されてしまう (Firefox+FireMobileSimulatorを使用してテスト)。 {{{ FooFilter RequestScopedObject creation 6278953 SessionScopedObject creation 2546668 6278953, 2546668 FooFilter RequestScopedObject creation 11854491 SessionScopedObject creation 25772535 11854491, 25772535 }}}