直接从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!" 

谢谢!

如果您需要将JSP的输出作为string捕获,那么从Servlet容器中可以看出,它相当简单明了(尽pipe从devise的angular度来看并不理想)
1.扩展javax.servlet.HttpServletResponseWrapper并覆盖getWriter()/ getOutputStream()方法来提供您自己的缓冲版本(例如StringWriter)
2.调用RequestDisparcher的“include()”方法,将自己的原始响应封装起来。
抓取缓冲区的内容。

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

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

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

强烈build议不要试图实现自己的servlet容器 – 你将步入一个受到伤害的世界。

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

这可能没有一个servlet容器。 有两个步骤。

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

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

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

这将填充Response对象。 然后你可以得到输出:

 res.getContentAsString(); 

在这里看一个例子:

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

尝试MockRunner来执行它。 不过,您需要先编译JSP。 我正在使用Maven 2(和JSP编译器插件 )