【问题标题】:How to serve JSPs using Guice 3.0?如何使用 Guice 3.0 为 JSP 提供服务?
【发布时间】:2012-12-11 01:18:06
【问题描述】:

我正在尝试从 Guice 提供 JSP。我没有找到任何关于如何做到这一点的基本示例!

我的设置:

web.xml

<filter>
    <filter-name>guiceFilter</filter-name>
    <filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>guiceFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<listener>
    <listener-class>org.example.Bootstrap</listener-class>
</listener>

org.example.Bootstrap(类似...)

public class Bootstrap extends GuiceServletContextListener 
{
    @Override
    protected Injector getInjector()
    {
        return Guice.createInjector(new org.example.BootstrapModule());
    }

}

org.example.BootstrapModule(类似...)

public class BootstrapModule extends ServletModule
{
    @Override
    protected void configureServlets()
    {
        // serve .JSPs
        bind(org.apache.jasper.servlet.JspServlet.class).in(Scopes.SINGLETON);
        serveRegex("/.*\\.jsp").with(org.apache.jasper.servlet.JspServlet.class);

        // serve my controllers 
        bind(MainServlet.class).in(Scopes.SINGLETON);
        serveRegex("/.*").with(MainServlet.class);
    }
}

MainServlet 中,我执行以下操作:

request.getRequestDispatcher("test.jsp").include(request, response);

request.getRequestDispatcher("test.jsp").forward(request, response);

request.getRequestDispatcher("/test.jsp").include(request, response);

request.getRequestDispatcher("/test.jsp").forward(request, response);

我的 test.jsp 位于 webapp/test.jsp(我使用 Maven)。

这行不通!我总是会遇到如下错误:

SEVERE: PWC6117: File XXX not found

Guice 传递给 org.apache.jasper.servlet.JspServlet 的信息似乎不是 JSP 工作所需的信息。

我错过了什么?我什至必须手动指定 org.apache.jasper.servlet.JspServlet 吗?从 Guice 正确提供 JSP 需要什么?

【问题讨论】:

    标签: java jsp guice guice-servlet


    【解决方案1】:

    看来这是known bug

    作为一种解决方法,有人说您可以编译 Guice 的 TRUNK。我还发现设置

    request.setAttribute(org.apache.jasper.Constants.JSP_FILE, "/test.jsp");
    

    在转发之前也可以。

    但在 Guice 在公开版本中修复之前,我必须运行更多测试才能看到我将使用什么。

    【讨论】:

      【解决方案2】:

      您需要覆盖Bootstrap#getModule() 以返回new BootstrapModule()

      @Override
      protected Module getModule() {
          return new BootstrapModule();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-26
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-08
        • 2018-09-12
        相关资源
        最近更新 更多