2011-08-23 37 views
11

Estoy incrustando embarcadero, sirviendo un solo servlet y un poco de contenido estático. Descargué el muelle de http://download.eclipse.org/jetty/7.4.5.v20110725/dist/ y agregué todos los frascos de JETTY_HOME/lib/* y JETTY_HOME/lib/jsp/* a las bibliotecas de los usuarios en eclipe; estas bibliotecas de usuario se han agregado a mi proyecto. Si pongo un archivo JSP en mi carpeta de contenido estático (./webapps/static/) y lo veo en http://localhost:8080/static/test.jsp, la expresión java no se evalúa y se me muestra el contenido completo del archivo.¿Cómo servir archivos JSP usando Jetty?

¿Qué me estoy perdiendo?

Mi principal clase 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(); 
    }   

} 

Mi archivo JSP Quiero servir:

<html> 
<body> 
Time: <%= new java.util.Date() %> 
</body> 
</html> 

Lista de frascos en 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 

Lista de frascos en 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 

Actualización: La sugerencia de @JJ ayudó a resolver cómo servir correctamente el archivo JSP con embarcadero. Mi único problema ahora es cómo evitar que jetty liste los contenidos del directorio de ./webapps/jsp/. La solución más básica que tengo por el momento es poner index.html o index.jsp en ./webapps/jsp/, pero preferiría poder configurar embarcadero para devolver un error prohibido.

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

} 

Respuesta

6

creo que se echa en falta alguna pieza clave que le dice embarcadero para analizar los archivos sirvió como contenido JSP en lugar de simplemente un archivo estático. No puedo ver exactamente lo que se pierde sin ser capaz de depurar el código sin embargo yo recomiendo que echa esta referencia acerca de incrustar embarcadero:

http://docs.codehaus.org/display/JETTY/Embedding+Jetty

En particular, creo que esta pieza de código puede ser relevante para su problema:

// 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)); 
Cuestiones relacionadas