4

先週Guiceを発見しました...それを使って簡単なトリックを試しています。しかし、私は現在ブロックされています...

「 * 」を含むurl-patternによって提供されるサーブレットのJSPにリクエストを転送しようとしています。しかし、私はいつも「エラー404」を受け取ります:(

ステップバイステップ:


ServletModule :
serve("/test/*").with(TestServlet.class);

TestServlet :
public void doGet(HttpServletRequest req, HttpServletResponse resp)  
{

    System.err.println("Start");
    try 
    {
        req.getRequestDispatcher("/WEB-INF/layout/test.jsp").forward(req, resp);
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }

}

このエラーが発生します:

HTTPエラー404
/WEB-INF/layout/test.jspへのアクセスに問題があります。理由:
/WEB-INF/layout/test.jsp

「serve( "/ test")。with(TestServlet.class);」でテストしました Guiceなしで(web.xmlでサーブレットを定義して)テストしたところ、機能しまし
た...

  • 私は何を間違えましたか?

読んでくれてありがとう!

4

3 に答える 3

7

クライアントは、Web-INFからリソースに直接(URLで)アクセスできません。したがって、この場合、転送は機能しません。しかし、サーブレットは可能です。したがって、includeの代わりに使用してforwardください。

于 2011-03-12T18:38:32.293 に答える
6

何も悪いことをしなかった可能性が高いです。ここで説明するように、サーブレット標準に対するインクルード属性とフォワード属性の誤った処理に起因するGuiceのバグがあります... http://code.google.com/p/google-guice/issues/detail?id = 647

結果として、受信側サーブレットはパスについて誤った情報を受け取るため、リソースをロードするリクエストは、正しく指定されていても、web.xml(サーブレットによって解釈される)を使用するときに同じコードが機能する場合でも、適切なターゲットを見つけることができません。エンジンであり、Guiceによるものではありません)。

なぜこれがGuiceの多くのプロジェクトの行き止まりとして機能しないのか、私は際限なく戸惑っています。そのため、他のサーブレットエンジン構成の動作に、このエラーを隠す何かがあるのか​​もしれません。Server#start()を使用してJavaで明示的に起動されたJettyを使用しています。そして、それは多くのサーバーロジックにとって大きな問題です。

ただし、Guiceチームは、v2.0に対してパッチが提供されていたとしても、長い間、このバグを慎重に無視してきたようです。彼らが必要としているのは、SVNビルドに対して作成されたテストケースですが、サーブレットエンジンなどをエミュレートするスタブを作成するために必要なすべての作業を考えると、私は成功していません。

于 2011-09-02T09:36:33.037 に答える
4

この問題は、guiceおよびguiceサーブレット3.1.1で部分的に修正されましたが、1つの問題がまだ発生しています。

以下のようにアスタリスクパターン「/*」を使用してサーブレットをマッピングする場合:

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

また、MyServlet.javaをjspページに転送すると、forward()は、jspページにアンダースコアがない場合にのみ機能します(したがって、myservlet.jspは機能し、my_servlet.jspは機能しません)。

// This WORKS
req.getRequestDispatcher("/myservlet.jsp").forward(req,resp);

// These DONT WORK (any file having _ or - characetsrs wont work)
req.getRequestDispatcher("/my_servlet.jsp").forward(req,resp); 
req.getRequestDispatcher("/my-servlet.jsp").forward(req,resp); 
req.getRequestDispatcher("/WEB-INF/myservlet.jsp").forward(req,resp);

これで、/*でマップされたサーブレットに対してWEB-INF転送が機能しない理由が説明されます。その理由は、WEB-INFにダッシュ文字が含まれているため、何らかの理由でguiceサーブレットに問題が発生しているためです。上記の例を試すときは、上記のケースを確認するためにケースを試すときに、ファイルmyservlet.jspの名前をmy_servlet.jspに変更してください。

なぜこの奇妙な事件が起こっているのか私には分かりません。注:Tomcat6.0.35を使用しています

Guice 3.1.1を使用するには、これらをpom.xmlに追加します

    <dependency>
        <groupId>org.sonatype.sisu</groupId>
        <artifactId>sisu-guice</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.sonatype.sisu.inject</groupId>
        <artifactId>guice-servlet</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

    <dependency>
        <groupId>org.sonatype.sisu.inject</groupId>
        <artifactId>guice-assistedinject</artifactId>
        <version>3.1.1</version>
        <scope>compile</scope>
    </dependency>

または、次の場所からjarファイルをダウンロードできます。

GuiceサーブレットJar

http://repo1.maven.org/maven2/org/sonatype/sisu/inject/guice-servlet/3.1.1/

Guice Jar

http://repo1.maven.org/maven2/org/sonatype/sisu/sisu-guice/3.1.1/

于 2012-04-21T16:41:39.660 に答える