上周我发现了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)并且它有效...
感谢阅读!
答案 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
<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>
或者您可以从以下网址下载罐子:
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/