【问题标题】:Embedded Tomcat not serving static content嵌入式 Tomcat 不提供静态内容
【发布时间】:2011-09-15 00:31:55
【问题描述】:

我正在使用以下(基于this)来创建嵌入式 Tomcat 服务器:

File catalinaHome = new File(".");
File webAppDir = new File("web");

Embedded server = new Embedded();
server.setCatalinaHome(catalinaHome.getAbsolutePath());

Context rootContext = server.createContext("", webAppDir.getAbsolutePath());
rootContext.setParentClassLoader(Thread.currentThread().getContextClassLoader());

Host localHost = server.createHost("localhost", webAppDir.getAbsolutePath());
localHost.addChild(rootContext);

Engine engine = server.createEngine();
engine.setName("localEngine");
engine.addChild(localHost);
engine.setDefaultHost(localHost.getName());
server.addEngine(engine);

Connector http = server.createConnector((InetAddress) null, 8080, false);
server.addConnector(http);

server.setAwait(true);
server.start();

web 目录具有静态内容(index.html 等)以及带有 servlet 描述符(如 web.xml)的 WEB-INF 目录。这无一例外地开始了,web.xml 中定义的 servlet 可以正常工作,但 index.html 等静态内容无法正常工作。

我很困惑:我在处理静态内容时缺少什么?

【问题讨论】:

    标签: java apache tomcat


    【解决方案1】:

    您需要定义default servlet。它负责提供静态内容。这可以通过在您的 web 应用程序的 /WEB-INF/web.xml 中显式声明它来完成,就像 Tomcat 自己的常规 /conf/web.xml 正在做的那样,或者以嵌入式 Tomcat 的以下声明方式:

    // Define DefaultServlet.
    Wrapper defaultServlet = rootContext.createWrapper();
    defaultServlet.setName("default");
    defaultServlet.setServletClass("org.apache.catalina.servlets.DefaultServlet");
    defaultServlet.addInitParameter("debug", "0");
    defaultServlet.addInitParameter("listings", "false");
    defaultServlet.setLoadOnStartup(1);
    rootContext.addChild(defaultServlet);
    rootContext.addServletMapping("/", "default");
    

    您可能还想对JSP servlet 执行相同的操作,以便您也可以使用 JSP:

    // Define JspServlet.
    Wrapper jspServlet = rootContext.createWrapper();
    jspServlet.setName("jsp");
    jspServlet.setServletClass("org.apache.jasper.servlet.JspServlet");
    jspServlet.addInitParameter("fork", "false");
    jspServlet.addInitParameter("xpoweredBy", "false");
    jspServlet.setLoadOnStartup(2);
    rootContext.addChild(jspServlet);
    rootContext.addServletMapping("*.jsp", "jsp");
    

    【讨论】:

      【解决方案2】:

      除了像BalusC 显示的那样配置包装器之外,您还可以使用这个(几乎)完全相同的单行:

      Tomcat.initWebappDefaults(rootContext);
      

      在启动服务器之前添加此行。使用 JDK1.7Tomcat 7.0.50 测试。

      注意:它额外添加了欢迎文件和一些MIME类型映射。该方法如下所示:

      public static void initWebappDefaults(Context ctx) {
              // Default servlet 
              Wrapper servlet = addServlet(
                      ctx, "default", "org.apache.catalina.servlets.DefaultServlet");
              servlet.setLoadOnStartup(1);
              servlet.setOverridable(true);
      
              // JSP servlet (by class name - to avoid loading all deps)
              servlet = addServlet(
                      ctx, "jsp", "org.apache.jasper.servlet.JspServlet");
              servlet.addInitParameter("fork", "false");
              servlet.setLoadOnStartup(3);
              servlet.setOverridable(true);
      
              // Servlet mappings
              ctx.addServletMapping("/", "default");
              ctx.addServletMapping("*.jsp", "jsp");
              ctx.addServletMapping("*.jspx", "jsp");
      
              // Sessions
              ctx.setSessionTimeout(30);
      
              // MIME mappings
              for (int i = 0; i < DEFAULT_MIME_MAPPINGS.length;) {
                  ctx.addMimeMapping(DEFAULT_MIME_MAPPINGS[i++],
                          DEFAULT_MIME_MAPPINGS[i++]);
              }
      
              // Welcome files
              ctx.addWelcomeFile("index.html");
              ctx.addWelcomeFile("index.htm");
              ctx.addWelcomeFile("index.jsp");
          }
      

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 2015-06-20
        • 2011-02-01
        • 2018-12-25
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 2019-10-20
        相关资源
        最近更新 更多