サーブレット
ウェブとサーブレットを参照のこと
簡単な例
以下は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
