4

我上周发现了 Guice……我正在尝试一些简单的技巧。但是,我目前被阻止了...

我正在尝试将请求转发到由包含“ * ”的 url 模式提供的 Servlet 中的 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 中定义 servlet),它有效......

  • 我做错了什么?

感谢阅读!

4

3 回答 3

7

客户端无法直接(通过 url)从 Web-INF 访问资源。所以在这种情况下转发不起作用。但是您的 servlet 可以。所以只需使用include而不是forward.

于 2011-03-12T18:38:32.293 回答
6

很有可能你根本没有做错任何事。Guice 中存在一个错误,源于他们对 servlet 标准的 Include 和 Forward 属性处理不当,如此处所述... http://code.google.com/p/google-guice/issues/detail?id=647

结果是接收 servlet 被错误地告知了路径,因此即使正确指定了加载资源的请求,即使使用 web.xml 时相同的代码有效(由您的 servlet 解释),加载资源的请求也找不到正确的目标引擎而不是 Guice)。

我无休止地感到困惑,为什么这对于 Guice 中的许多项目来说并不是一个死胡同,所以也许其他 servlet 引擎配置的行为中有些东西掩盖了这个错误。我正在使用使用 Server#start(); 在 Java 中显式启动的 Jetty;它是许多服务器逻辑的交易破坏者。

然而,Guice 团队似乎很长时间以来一直故意忽略该错误,即使为他们提供了针对 v2.0 的补丁也是如此。他们需要的是针对他们的 SVN 构建编写的测试用例,但考虑到创建模拟 servlet 引擎等的存根所需的所有工作,我从未成功过。

于 2011-09-02T09:36:33.037 回答
4

该问题已在 guice 和 guice servlet 3.1.1 中得到部分修复,但仍然存在一个问题:

使用星号模式“/*”映射 servlet 时,如下所示:

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 转发对于使用 /* 映射的 servlet 不起作用。原因是 WEB-INF 包含一个破折号字符,由于某种原因,它给 guice servlet 造成了问题。尝试上述示例时,请确保在尝试验证上述案例时将文件 myservlet.jsp 重命名为 my_servlet.jsp。

我不知道为什么会发生这种奇怪的情况。注意:我使用的是 Tomcat 6.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 Servlet 罐子

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

吉斯罐

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

于 2012-04-21T16:41:39.660 回答