2

Currently I'm preparing for Java EE Web Component Developer exam.

In both exam study guide and Servlet API Java docs I found that method

ServletRequest.getRequestDispatcher()

returns

null if the servlet container cannot return a RequestDispatcher.

When I tried it with non-existent static file I actually got non-null value. And forward resulted in 404 sent to client. Same effect for non-existent servlet. I use Apache Tomcat 7.0.

Does it mean that this behaviour isn't defined and is left to implementer's choice? What do they (Java docs authors) mean by "servlet container cannot return a RequestDispatcher"? I tried to look for it in JSR spec but wasn't able to find answer.

4

1 に答える 1

2

これは、サーブレット 3.0 仕様がディスパッチャの動作について述べていることです。

getRequestDispatcher メソッドは、ServletContext のスコープ内のパスを記述する String 引数を取ります。このパスは、ServletContext のルートからの相対パスで、'/' で始まるか、空にする必要があります。メソッドはパスを使用してサーブレットを検索し、第 12 章「サーブレットへのリクエストのマッピング」のサーブレット パス マッチング ルールを使用して、それを RequestDispatcher オブジェクトでラップし、結果のオブジェクトを返します。指定されたパスに基づいて解決できるサーブレットがない場合は、そのパスのコンテンツを返す RequestDispatcher が提供されます。

ディスパッチパスに一致するサーブレットが見つからない場合にnullを返すことについてはどこにも言及していません。代わりに、ディスパッチパスで見つかった「コンテンツ」が見つかると述べています。これは、実装により、コンテナーがパスを完全に解決できることを意味します (シナリオでは 404 が生成されます)。

ただし、Javadoc に関する限り、コンテナが何らかの理由でディスパッチャーを作成できない場合、(例外をスローするのではなく) null オブジェクトを返すという、可能な限り幅広いユースケースで文書化されているようです。これは、実装の技術的な問題が原因であるか、実際に有効である可能性があります (たとえば、JAX-RS 実装はサーブレット インフラストラクチャの一部のレベルにアクセスできますが、サーブレット コンテキストまたはディスパッチャを使用できません)。

于 2013-03-03T12:18:29.820 に答える