Guice でサーブレット


Guiceサーブレット書いてみる
これだけだと、web.xmlサーブレットマッピングをJavaコードとして記載できるだけだけど、練習

Jetty利用の事前準備

前回の記事と同様、Jettyをインメモリのサーバとして使うので、Jetty起動用のランチャーを作成
Jettyのjarにもクラスパス通す

public class JettyLauncher {

    private static final int PORT = 8080;
    private static final String WAR_PATH = "WebContent";
    private static final String CONTEXT_PATH = "/web";

    public static void launch() throws Exception {
        Server server = new Server(PORT);
        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
        server.setHandler(context);

        WebAppContext web = new WebAppContext(WAR_PATH, CONTEXT_PATH);
        server.setHandler(web);
        
        server.start();
        server.join();
    }
    
    public static void main(String[] args) throws Exception {
        JettyLauncher.launch();
    }
}

web.xmlの設定

フィルタとして GuiceFilter を設定
リスナを登録(後述)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  
  <listener>
    <listener-class>guice.GuiceServletConfig</listener-class>
  </listener>
</web-app>

リスナの実装

ここではリスナでサーブレットのマッピングを記載

public class GuiceServletConfig extends GuiceServletContextListener {
    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override 
            protected void configureServlets() {
               serve("*.html").with(HelloServlet.class);
             }
        });
    }
}

Servlet

Servletは何でもよいけど、@Singletonを指定しないと怒られた

@Singleton
public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);
        response.getWriter().println("<h1>Hello Servlet</h1>");
    }
}

実行

JettyLauncherでサーバ起動してhttp://localhost:8080/web/test.htmlとかでServletが動く