Locked History Actions

guice/Servlet

サーブレット

ウェブとサーブレットを参照のこと

簡単な例

以下は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

つまり、注入されたインジェクタからRequestScopedObjectSessionScopedObjectを取得してみると、そのスコープに従ったオブジェクトが取得できるということである。

ちなみに、もちろんDOCOMO端末のようにクッキーをサポートしていないブラウザでは毎回SessionScopedObjectが作成されてしまう (Firefox+FireMobileSimulatorを使用してテスト)。

FooFilter
RequestScopedObject creation 6278953
SessionScopedObject creation 2546668
6278953, 2546668
FooFilter
RequestScopedObject creation 11854491
SessionScopedObject creation 25772535
11854491, 25772535