一尘不染

嵌入式Tomcat不提供静态内容

tomcat

我使用以下(基于此)创建嵌入式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之类的静态内容却不起作用。

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


阅读 200

收藏
2020-06-16

共1个答案

一尘不染

您需要定义默认的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");
2020-06-16