2011-08-23 65 views
11

我在嵌入码头,提供单个servlet和一些静态内容。我已经从http://download.eclipse.org/jetty/7.4.5.v20110725/dist/下载了码头,并将所有来自JETTY_HOME/lib/*和JETTY_HOME/lib/jsp/*的jar添加到eclipe的用户库中;这些用户库已添加到我的项目中。如果我将JSP文件放在我的静态内容文件夹(./webapps/static/)中,并在http://localhost:8080/static/test.jsp上查看它,则不会评估java表达式,并且会显示文件的全部内容。如何使用Jetty提供JSP文件?

我错过了什么?

我主要的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中/:罐子

$ 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 /中:

$ 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的建议帮助解决了如何使用jetty正确提供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(); 
    } 

} 

回答

6

我认为你错过了一些关键的部分,它告诉Jetty将服务文件解析为JSP内容而不是简单的静态文件。我不能清楚地看到你错过了什么,而不能调试代码,但是我建议你检查有关嵌入这个参考码头:

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));