2009-07-02 27 views
18

Necesito ejecutar un JSP. Pero necesito hacerlo directamente desde Java, sin usar Tomcat ni ningún otro contenedor de servlets. La compilación de JSP también sería una buena idea, pero no necesaria. Creo que tal vez el paquete org.apache.jasper sea bueno para hacer esto, pero no puedo encontrar ningún buen ejemplo o tutorial en línea.Ejecutar JSP directamente desde Java

necesito algo como:

Class compiledJSP = compileJSP(new File("helloWorld.jsp")); 
String html = executeJSP(compiledJSP, httpServletRequest, httpServletResponse, ...); 

html --> "Hello World, John!" 

Gracias!

+0

¿Pero por qué quieres hacer esto? ¿Desea generar HTML mediante programación? – Raedwald

+0

Esto se marcó previamente como un engaño para http://stackoverflow.com/questions/956112/programmatic-htmldocument-generation-using-java?lq=1 o http://stackoverflow.com/questions/8141813/execute-jsp -with-jetty-7-3-without-javac? lq = 1. No es. –

Respuesta

4

Necesitará un contenedor. Un JSP es una abstracción en Servlet. Los servlets dependen de un ciclo de vida proporcionado por un contenedor. Necesitas un contenedor para proporcionar el ciclo de vida.

18

Si necesita capturar la salida de JSP como cadena que es razonablemente sencillo (aunque lejos de ser ideal desde el punto de vista del diseño) de dentro contenedor servlet:
1. Extender javax.servlet.HttpServletResponseWrapper y anular getWriter()/getOutputStream() métodos para proporcionar sus propias versiones en búfer (por ejemplo, StringWriter)
2. Invoque el método "include()" de RequestDisparcher, ajustando la respuesta original por su cuenta.
3. Captura el contenido del búfer.

Ahora, si necesita hacer lo mismo fuera de Servlet Container, realmente necesita preguntarse "¿por qué?". Tal vez debería utilizar un motor de plantillas (FreeMarker/Velocity/StringTemplate/etc ...) en lugar de JSPs. Si sus JSP son archivos XML bien formados y no están usando ningún inserto de código Java, puede ser razonablemente trivial convertirlos a plantillas FreeMarker (FreeMarker admite bibliotecas de etiquetas JSP personalizadas) que simplificaría su tarea en gran medida.

Sin embargo, si se trata de un requisito duro absoluta de sus opciones más sencillas son:
1. Ejecutar un contenedor de servlets externa y se deja manejar interpretación JSP. Su programa le enviará solicitudes HTTP y capturará el resultado.
2. Lo mismo que arriba, pero puede ejecutar Contenedor de Servlets incrustado (por ejemplo, Jetty).

Si sus JSP están disponibles durante el tiempo de compilación, puede precompilarlos a través de Jasper como se sugiere en otras respuestas.

Deseo fuertemente consejos contra intentar implementar su propio contenedor de servlets: se encontrará caminando en un mundo de dolor.

+0

Gracias por su consejo. De hecho, no quiero implementar mi propio contenedor de servlets. No quiero compilar y procesar JSP también, pero no veo ninguna alternativa para lo que busco. que quieren crear respuestas del servidor como JSON como esto: { HTML1: "

1
", HTML2: ""} Cada html tiene que ser hecho con JSP, pero el JSON no puede estar allí . Usé FreeMarker y no veo cómo puede ayudar. Si conoce alguna forma de hacer lo que estoy buscando, lo agradecería. Gracias. –

+0

No estoy del todo claro sobre lo que estás tratando de lograr. ¿Devuelve esa respuesta JSON desde una aplicación que ejecuta _outside_ un contenedor de servlets? ¿Por qué? Me es más difícil imaginar el uso de JSON para la comunicación entre aplicaciones. Si pudieras aclarar lo que tratas de hacer un poco más, estaría encantado de ayudarte. La diferencia que haría FreeMarker es que puede ejecutarlo completamente desde su aplicación sin tener que falsificar el entorno de servlets. P.ej. cada fragmento 'html' en su respuesta sería producido por una plantilla FTL separada y usted simplemente llamaría a Template.process (modelo, escritor) en cada uno. – ChssPly76

+0

Tenga en cuenta que esto (actualmente) no funcionará en Jetty, debido a http://jira.codehaus.org/browse/JETTY-1485. Funciona bien en Tomcat. Hay una descripción más detallada de este enfoque aquí: http://technologicaloddity.com/2011/10/04/render-and-capture-the-output-of-a-jsp-as-a-string/ – Rich

0

Esto es posible sin un contenedor de servlet. Hay dos pasos para eso.

El primero es generar el código fuente. Si observa el código fuente de la tarea jspc ant, es posible hacerlo directamente en el código. O simplemente podría invocar la tarea de hormiga.

El código que se genera es sólo un Servlet y es posible invocar los métodos en un servlet exterior de un recipiente:

Sólo instanciarlo y luego llamar doGet (solicitud, respuesta). No estoy seguro de qué es exactamente lo que necesita, pero su vida será más fácil utilizando objetos simulados de primavera para la solicitud y respuesta http.

Esto completará el objeto Response.a continuación, puede obtener la salida con:

res.getContentAsString(); 

ver un ejemplo aquí:

http://ytreyvus.blogspot.com/2007/03/private-void-cloneplaneffectrelationshi.html

Cuestiones relacionadas