【问题标题】:Forwarding request to a JSP将请求转发到 JSP
【发布时间】:2011-07-14 03:09:00
【问题描述】:

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

我正在尝试将请求转发到 Servlet 中的 JSP,该 Servlet 由包含“*”的 url-pattern 提供服务。但我一直收到“错误 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)并且它有效...

  • 我做错了什么?

感谢阅读!

【问题讨论】:

  • 不如尝试使用include 而不是forward)
  • @Stas:听起来你只是在建议随机猜测。
  • 我不做Guice,但是这个错误页面提示请求被重定向到JSP而不是被RequestDispatcher转发。 @Matt 提到,/WEB-INF 文件夹确实不可公开访问。有没有看到浏览器地址栏中的 URL 变成了一个带有/WEB-INF 的 URL?如果是这样,则以某种方式进行了重定向。
  • @Matt Ball,正确。所以这不是答案。只是评论。我会删除错误的建议。
  • 我的地址栏中有:localhost:8888/test/74854 - @Stas Kurilin 包括作品!为什么转发不起作用?

标签: java jsp servlets guice guice-servlet


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    很有可能你根本没有做错任何事。 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 引擎等的存根所需的所有工作,我从未成功过。

    【讨论】:

      【解决方案3】:

      该问题已在 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/

      Guice 罐子

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

      【讨论】:

      • 不确定这个“org.sonatype”...它是官方的 Google Guice 吗?人们使用 com.google.inject.extensions
      • sisu-guice 不是官方的 guice。它是 sisu 项目的一部分eclipse.org/sisu
      猜你喜欢
      • 2014-02-25
      • 2014-06-07
      • 2012-04-24
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-09
      • 1970-01-01
      相关资源
      最近更新 更多