Upload page content

You can upload content for the page named below. If you change the page name, you can also upload content for another page. If the page name is empty, we derive the page name from the file name.

File to load page content from
Page name
Comment

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