我需要执行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!"
谢谢!
答案 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)