直接从Java执行JSP

19 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!"
Run Code Online (Sandbox Code Playgroud)

谢谢!

Chs*_*y76 19

如果您需要捕获JSP的输出字符串是相当简单(虽然远从设计上来看理想的)从 Servlet容器:
1.扩展javax.servlet.HttpServletResponseWrapper并重写的getWriter()/的getOutputStream()方法,以提供您的自己的缓冲版本(例如StringWriter)
2.调用RequestDisparcher的"include()"方法,将原始响应包装在您自己的中.
3.抓取缓冲区的内容.

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

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

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

强烈建议不要试图实现自己的servlet容器 - 你将走进一个受伤的世界.


Bri*_*ian 4

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