直接从Java执行JSP

时间:2009-07-02 18:01:56

标签: java jsp

我需要执行JSP。但我需要直接从Java,而不使用Tomcat或任何其他servlet容器。编译JSP也是一件好事,但不是必需的。我想也许org.apache.jasper包可以做到这一点,但我找不到任何好的示例或在线教程。

我需要一些东西:

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

html --> "Hello World, John!"

谢谢!

4 个答案:

答案 0 :(得分:19)

如果你需要将JSP的输出捕获为字符串,那么从中的 Servlet容器中,它是相当简单的(尽管从设计的角度来看远非理想): 1.扩展javax.servlet.HttpServletResponseWrapper并覆盖getWriter()/ getOutputStream()方法以提供自己的缓冲版本(例如StringWriter)
2.调用RequestDisparcher的“include()”方法,将原始响应包装在您自己的中 3.抓取缓冲区的内容。

现在如果你需要做同样的事情外面 Servlet容器,你真的需要问自己“为什么?”。也许您应该使用模板引擎(FreeMarker / Velocity / StringTemplate / etc ...)而不是JSP?如果您的JSP是格式良好的XML文件并且没有使用任何Java代码插入,那么将它们转换为FreeMarker模板(FreeMarker支持自定义JSP标记库)可能是相当简单的,这将极大地简化您的任务。

然而,如果这是一个绝对的硬性要求,你最直接的选择是:
 1.运行外部Servlet容器,让它处理JSP解释。您的程序将向其提交HTTP请求并捕获输出  2.与上面相同,但您可以运行嵌入式Servlet容器(例如Jetty)。

如果您的JSP在构建时可用,您可以按照其他答案中的建议通过Jasper预编译它们。

我强烈反对尝试实现自己的servlet容器的建议 - 你将走进一个受伤的世界。

答案 1 :(得分:4)

你需要一个容器。 JSP是Servlet的抽象。 Servlet依赖于容器提供的生命周期。您需要一个容器来提供生命周期。

答案 2 :(得分:0)

没有servlet容器,这是可能的。它有两个步骤。

首先是生成源代码。如果查看jspc ant任务的源代码,可以直接在代码中完成。或者你可以调用ant任务。

生成的代码只是一个Servlet,可以在容器外部的servlet上调用方法:

只需实例化它,然后调用doGet(请求,响应)。我不确定你需要什么,但是使用spring模拟对象为http请求和响应你的生活会变得更容易。

这将填充Response对象。然后,您可以通过以下方式获得输出:

res.getContentAsString();

请参阅此处的示例:

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

答案 3 :(得分:0)

尝试MockRunner执行它。但是,您需要先编译JSP。我正在使用Maven 2(以及JSP Compiler plugin