我正在使用以下内容(基于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等)以及带有web.xml等servlet描述符的WEB-INF目录。这是毫无例外地开始的,并且web.xml中定义的servlet可以工作,但像index.html这样的静态内容不起作用。
我很困惑:我错过了什么来处理静态内容?
答案 0 :(得分:21)
您需要定义default servlet。它是负责提供静态内容的人。这可以通过在webapp的/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");
答案 1 :(得分:5)
不是像BalusC那样配置包装器,你也可以使用这个(几乎)完全相同的单行:
Tomcat.initWebappDefaults(rootContext);
在启动服务器之前在某处添加此行。使用 JDK1.7 和 Tomcat 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");
}