我使用以下(基于此)创建嵌入式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之类的静态内容却不起作用。
我很困惑:缺少什么来处理静态内容?
您需要定义默认的servlet。它是负责提供静态内容的人。这可以通过在Web应用程序中/WEB- INF/web.xml以与Tomcat自己的常规/conf/web.xml行为相同的方式显式声明它来完成,也可以通过以下嵌入式Tomcat声明性方式来完成:
/WEB- INF/web.xml
/conf/web.xml
// 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");