转发对JSP的请求

时间:2011-03-12 17:06:41

标签: java jsp servlets guice guice-servlet

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

我正在尝试将请求转发到由包含“ * ”的url-pattern服务的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)并且它有效...

  • 我做错了什么?

感谢阅读!

3 个答案:

答案 0 :(得分:7)

客户端无法直接从Web-INF访问资源(通过url)。因此在这种情况下转发不起作用。但你的servlet可以。因此,只需使用include代替forward

答案 1 :(得分: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;它是许多服务器逻辑的交易破坏者。

然而,即使在针对v2.0向他们提供补丁时,Guice团队似乎已经刻意忽略了这个bug很长一段时间。他们需要的是针对他们的SVN构建编写的测试用例,但是我从未成功完成创建模拟servlet引擎的存根所需的所有工作等等。

答案 2 :(得分: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>

或者您可以从以下网址下载罐子:

Guice Servlet 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/