我正在嵌入码头,服务单个servlet和一些静态内容。我已经从http://download.eclipse.org/jetty/7.4.5.v20110725/dist/下载了jetty ,并将JETTY_HOME / lib / 和JETTY_HOME / lib / jsp / 的所有jar添加到了eclipe的用户库中; 这些用户库已添加到我的项目中。如果我将JSP文件放在我的静态内容文件夹(./webapps/static/)中并在http:// localhost:8080 / static / test.jsp上查看,则不会对Java表达式进行求值,并且会显示完整的内容文件内容。
我想念什么?
我的主要Java类:
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; public class Test { public static void main(String[] args) throws Exception { Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(8080); server.addConnector(connector); // Create a resource handler for static content. ResourceHandler staticResourceHandler = new ResourceHandler(); staticResourceHandler.setResourceBase("./webapps/static/"); staticResourceHandler.setDirectoriesListed(true); //staticResourceHandler.setWelcomeFiles(new String[]{ "index.html", }); //staticResourceHandler.setCacheControl("no-store,no-cache,must-revalidate"); // Create context handler for static resource handler. ContextHandler staticContextHandler = new ContextHandler(); staticContextHandler.setContextPath("/static"); staticContextHandler.setHandler(staticResourceHandler); // Create servlet context handler for main servlet. ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); servletContextHandler.setContextPath("/"); servletContextHandler.addServlet(new ServletHolder(new HelloServlet()),"/"); // Create a handler list to store our static and servlet context handlers. HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { staticContextHandler, servletContextHandler }); // Add the handlers to the server and start jetty. server.setHandler(handlers); server.start(); server.join(); } }
我要提供的JSP文件:
<html> <body> Time: <%= new java.util.Date() %> </body> </html>
JETTY_HOME / lib /中的jar列表:
$ ls -1 ./jetty-distribution-7.4.5.v20110725/lib/*.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-ajp-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-annotations-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-client-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-continuation-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-deploy-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-http-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-io-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-jmx-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-jndi-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-overlay-deployer-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-plus-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-policy-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-rewrite-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-security-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-server-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-servlet-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-servlets-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-util-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-webapp-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-websocket-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jetty-xml-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/servlet-api-2.5.jar
JETTY_HOME / lib / jsp /中的jar列表:
$ ls -1 ./jetty-distribution-7.4.5.v20110725/lib/jsp/*.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/com.sun.el_1.0.0.v201004190952.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/ecj-3.6.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.el_2.1.0.v201004190952.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.servlet.jsp_2.1.0.v201004190952.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/javax.servlet.jsp.jstl_1.2.0.v201004190952.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/jetty-jsp-2.1-7.4.5.v20110725.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/org.apache.jasper.glassfish_2.1.0.v201007080150.jar ./jetty-distribution-7.4.5.v20110725/lib/jsp/org.apache.taglibs.standard.glassfish_1.2.0.v201004190952.jar
更新:@JJ的建议有助于确定如何正确使用码头服务JSP文件。我现在唯一的问题是如何阻止Jetty列出./webapps/jsp/的目录内容。目前,我最基本的解决方法是将index.html或index.jsp放在./webapps/jsp/中,但我希望能够配置jetty返回禁止的错误。
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.webapp.WebAppContext; public class Test { public static void main(String[] args) throws Exception { Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setHost("127.0.0.1"); connector.setPort(8080); server.addConnector(connector); // Create a resource handler for static content. ResourceHandler staticResourceHandler = new ResourceHandler(); staticResourceHandler.setResourceBase("./webapps/static/"); staticResourceHandler.setDirectoriesListed(true); // Create context handler for static resource handler. ContextHandler staticContextHandler = new ContextHandler(); staticContextHandler.setContextPath("/static"); staticContextHandler.setHandler(staticResourceHandler); // Create WebAppContext for JSP files. WebAppContext webAppContext = new WebAppContext(); webAppContext.setContextPath("/jsp"); webAppContext.setResourceBase("./webapps/jsp/"); // ??? THIS DOES NOT STOP DIR LISTING OF ./webapps/jsp/ ??? webAppContext.setInitParameter("dirAllowed", "false"); // Create servlet context handler for main servlet. ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); servletContextHandler.setContextPath("/"); servletContextHandler.addServlet(new ServletHolder(new HelloServlet()), "/*"); // Create a handler list to store our static, jsp and servlet context handlers. HandlerList handlers = new HandlerList(); handlers.setHandlers(new Handler[] { staticContextHandler, webAppContext, servletContextHandler }); // Add the handlers to the server and start jetty. server.setHandler(handlers); server.start(); server.join(); } }
我认为您缺少一些关键内容,这些内容告诉Jetty将提供的文件解析为JSP内容,而不是简单的静态文件。在无法调试代码的情况下,我无法确切看到丢失的内容,但是我建议您检查一下有关嵌入Jetty的参考:
http://docs.codehaus.org/display/JETTY/Embedding+Jetty
我特别认为这段代码可能与您的问题有关:
// assumes that this directory contains .html and .jsp files // This is just a directory within your source tree, and can be exported as part of your normal .jar final String WEBAPPDIR = "com/xxx/yyy/webapp"; final Server server = new Server(httpServerPort); final String CONTEXTPATH = "/admin"; // for localhost:port/admin/index.html and whatever else is in the webapp directory final URL warUrl = this.class.getClassLoader().getResource(WEBAPPDIR); final String warUrlString = warUrl.toExternalForm(); server.setHandler(new WebAppContext(warUrlString, CONTEXTPATH));