Locked History Actions

Diff for "guice/Manual/Integration/WebandServlets/ServletModule"

Differences between revisions 3 and 4
Deletions are marked like this. Additions are marked like this.
Line 88: Line 88:
The request and response are scoped to the current http request. Similarly the http session object is scoped to the current user session. In addition to this you may also inject the current ServletContext and a map of the request parameters using the binding annotation @RequestParameters as follows: リクエストとレスポンスは現在のhttpリクエストにスコープされる。
同様に、httpセッションオブジェクトは現在のユーザセッションにスコープされる。
これに加え、現在のServletContextを注入することができるし、@RequstParametersバインディングアノテーションを用いてリクエストパラメータマップを注入することもできる。
Line 92: Line 95:
This must be a map of strings to arrays of strings because http allows multiple values to be bound to the same request parameter, though typically there is only one. Note that if you want access to any of the request or session scoped classes from singletons or other wider-scoped instances, you should inject a Provider<T> instead.
Dispatch Order
これは文字列を文字列配列にマップする、httpは一つのリクエストパラメータに複数の値を許すからだが、典型的には一つの値だけである。
ただし、リクエストあるいはセッションスコープにクラスに、シングルトンあるいはより広いスコープのインスタンスからアクセスしたい場合は、Provider<T>を使うべきである。
Line 95: Line 98:
You are free to register as many servlets and filters as you like this way. They will be compared and dispatched in the order in which the rules appear in your ServletModule: == ディスパッチの順序 ==

このようにすきなだけサーブレットやフィルタを登録することができる。
これらはServletModuleに現れた順序で比較されディスパッチされる。
Line 111: Line 117:
This will traverse down the list of rules in lexical order. For example, a url /my/file.js will first be compared against the servlet mapping: これらは、リストを語彙順で検索される。例えば、
「/my/files.js」というURLは、以下のサーブレットマッピングより先に比較される。
Line 115: Line 122:
And failing that, it will descend to the next servlet mapping: 失敗した場合は、次のサーブレットマッピングに降りる。
Line 119: Line 126:
Since this rule matches, Guice Servlet will dispatch the request to MyServlet and stop the matching process. The same process is used when deciding the dispatch order of filters (that is, matched to their order of appearance in the binding list).
Varargs Mapping
このルールはマッチするので、GuiceサーブレットはリクエストをMyServletにディスパッチし、マッチング処理を終了する。
Line 122: Line 128:
The two mapping rules above can also be written in more compact form using varargs syntax: 同様の処理がフィルタの順序ディスパッチにも適用される
(つまり、バインディングリストに現れた順である)。

== 可変引数のマッピング ==

上の二つのマッピングルールは可変引数シンタックスを使って、コンパクトに記述することができる。
Line 126: Line 137:
This way you can map several URI patterns to the same servlet. A similar syntax is also available for filter mappings. このように様々なURIパターンを一つサーブレットでマップ可能である。
同様のシンタックスがフィルタマッピングでも使用できる。

サーブレットモジュールのインストール

GuiceFilterを設定して起動すればGuiceサーブレットがセットアップされるが、 しかしGuiceサーブレットを実際に使うためにはServletModuleインスタンスのインストールが必要である。

   Guice.createInjector(new ServletModule());

このモジュールはリクエスト及びセッションスコープをセットアップし、フィルターとサーブレットをコンフィギュレーションするための方法を提供する。 インジェクタを作成する場所はいかなるところでも構わないのだが、論理的な場所としてServletContextListenerがある。

ServletContextListenerはウェブアプリケーションが配備された直後、リクエストが到着する以前にトリガーされるJavaサーブレットである。 Guiceサーブレットはサブクラス化するための便利なユーティリティを提供しているの、あなた自身のServletContextListenerを作成することができる。

public class MyGuiceServletConfig extends GuiceServletContextListener {

  @Override
  protected Injector getInjector() {
    return Guice.createInjector(new ServletModule());
  }
}

次に、以下のようなweb.xmlを追加し、サーブレットコンテナがアプリケーション配備時にこのクラスをトリガーできるようにする。

<listener>
  <listener-class>com.example.MyGuiceServletConfig</listener-class>
</listener>

これで、必要に応じてGuiceサーブレットを使えるようになった。 ただし、必ずしもGuiceサーブっトを使うために、ServletContextListenerは必要ではない、 インジェクタ生成時にServletModuleのインストールを忘れさえしなければ。

バインディング言語

ServletModuleをweb.xml配備デスクリプタのコードによる置き換えと考えてみよう。 フィルタとサーブレットは通常のJavaメソッド呼び出しによってコンフィギュレーションされる。 以下はGuiceインジェクタを作成する際にサーブレットを登録する典型的な例である。

   Guice.createInjector(..., new ServletModule() {

     @Override
     protected void configureServlets() {
       serve("*.html").with(MyServlet.class)
     }
   }

これは.htmlで終了するすべてのウェブリクエストをサービスするためのMyServletという名のサーブレット(HttpServletのサブクラス)を登録するものである。

       serve("/my/*").with(MyServlet.class)

フィルタマッピング

サーブレットフィルタを同様のシンタックスでマップすることができる。

      filter("/*").through(MyFilter.class);

これはMyFilterを通して到着するすべてのリクエストをルーティングし、 他のマッチするフィルタを通し、最終的に処理サーブレットに配布する。

注意:すべてのサーブレット(あるいはフィルタ)は@Singletonでなければならない。 もしこれらのクラスに直鉄的にアノテーションできない場合は、bind(..).in(Singleton.class)でバインドすること、 separate to the filter() or servlet() rules. 他のスコープへのマッピングはエラーとなる。 これはサーブレット仕様の一貫性保持のためである。 Guiceサーブレットは古いSingleThreadModelはサポートしていない。

提供される注入

サーブレットモジュールをインストールすることにより、サーブレットフレームワークから様々なクラスにアクセスが可能となる。 ServletModuleをインストールすると、サーブレットプログラミングモデルで便利なものが得られるし、デフォルトでGuiceが注入するオブジェクトが得られる。

{{{ @RequestScoped class SomeNonServletPojo {

} }}}

リクエストとレスポンスは現在のhttpリクエストにスコープされる。 同様に、httpセッションオブジェクトは現在のユーザセッションにスコープされる。 これに加え、現在のServletContextを注入することができるし、@RequstParametersバインディングアノテーションを用いてリクエストパラメータマップを注入することもできる。

@Inject @RequestParameters Map<String, String[]> params;

これは文字列を文字列配列にマップする、httpは一つのリクエストパラメータに複数の値を許すからだが、典型的には一つの値だけである。 ただし、リクエストあるいはセッションスコープにクラスに、シングルトンあるいはより広いスコープのインスタンスからアクセスしたい場合は、Provider<T>を使うべきである。

ディスパッチの順序

このようにすきなだけサーブレットやフィルタを登録することができる。 これらはServletModuleに現れた順序で比較されディスパッチされる。

   Guice.createInjector(..., new ServletModule() {

     @Override
     protected void configureServlets() {
       filter("/*").through(MyFilter.class);
       filter("*.css").through(MyCssFilter.class);
       // etc..

       serve("*.html").with(MyServlet.class);
       serve("/my/*").with(MyServlet.class);
       // etc..
      }
    }

これらは、リストを語彙順で検索される。例えば、 「/my/files.js」というURLは、以下のサーブレットマッピングより先に比較される。

       serve("*.html").with(MyServlet.class);

失敗した場合は、次のサーブレットマッピングに降りる。

       serve("/my/*").with(MyServlet.class);

このルールはマッチするので、GuiceサーブレットはリクエストをMyServletにディスパッチし、マッチング処理を終了する。

同様の処理がフィルタの順序ディスパッチにも適用される (つまり、バインディングリストに現れた順である)。

可変引数のマッピング

上の二つのマッピングルールは可変引数シンタックスを使って、コンパクトに記述することができる。

       serve("*.html", "/my/*").with(MyServlet.class);

このように様々なURIパターンを一つサーブレットでマップ可能である。 同様のシンタックスがフィルタマッピングでも使用できる。