Google Guiceでservlet

GuiceでServeletを利用するには、guice-servlet.jarが必要になります。
mavenのglobal repositoryにないので、ローカルリポジトリに登録します。

%maven install:install-file -Dfile=guice-servlet-3.0.jar -DgoupdId=com.google.guice -DartifactId=guice-servlet -Dversion=3.0 -Dpackaging=jar

webapp用のプロジェクトを作成する。

%mvn archetype:generate

maven3.0ですと対話型でできます。
最初のChoose a numberを112を指定します。

そして必要な項目をpom.xmlに設定します。
最低限だとこんな感じかな。
ポイントは、WEBコンテナがもっているjarは、scopeにprovidedを指定してdeployする対象から外す。

	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.3</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>[2.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>[1.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>[0.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>[0.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>[4.,)</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>com.google.inject</groupId>
			<artifactId>guice</artifactId>
			<version>[3.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.google.inject</groupId>
			<artifactId>guice-servlet</artifactId>
			<version>[3.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>[0.,)</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>commons-beanutils</groupId>
			<artifactId>commons-beanutils-core</artifactId>
			<version>[1.,)</version>
			<scope>runtime</scope>
		</dependency>
	</dependencies>
	<build>
		<finalName>pae-web</finalName>
		<sourceDirectory>src/main/java</sourceDirectory>
		<testSourceDirectory>src/test/java</testSourceDirectory>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-eclipse-plugin</artifactId>
					<version>2.8</version>
					<configuration>
						<downloadSources>true</downloadSources>
						<downloadJavadocs>true</downloadJavadocs>
					</configuration>
				</plugin>
			</plugins>
		</pluginManagement>
	</build>

いつも通り、eclipseのプロジェクトに変換しますが、ついで、WTP対応にしておくと便利なので、WTPの指定をします。

% mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0

web.xmlguiceのフィルターの設定をします。
guiceサーブレットの動作は、listenerでinitializeしたservletやfilterのマッピングをGuiceFilterでキャッチしてDispatchしてくれるというものらしい。

	<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>jp.co.sandbox.GuiceServletConfig</listener-class>
    </listener>	

Guiceでのfilterやservletの指定の仕方

public class GuiceServletConfig extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                serve("*.do2").with(MyServlet.class);
            }
        });
    }
}

サンプルの何もしないサーブレット

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        System.out.println("enter doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        System.out.println("enter d oPost");
    }
}