【问题标题】:Execute JSP directly from Java直接从Java执行JSP
【发布时间】:2010-11-07 17:32:06
【问题描述】:

我需要执行一个 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!"

谢谢!

【问题讨论】:

标签: java jsp


【解决方案1】:

尝试MockRunner 执行它。不过,您需要先编译 JSP。我为此使用 Maven 2(以及 JSP Compiler plugin)

【讨论】:

    【解决方案2】:

    这在没有 servlet 容器的情况下是可能的。有两个步骤。

    首先是生成源代码。如果您查看 jspc ant 任务的源代码,则可以直接在代码中执行此操作。或者你可以只调用 ant 任务。

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

    只需实例化它,然后调用 doGet(request, response)。我不确定你到底需要这个做什么,但是使用 spring 模拟对象进行 http 请求和响应会让你的生活变得更轻松。

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

    res.getContentAsString();
    

    在此处查看示例:

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

    【讨论】:

      【解决方案3】:

      如果您需要将 JSP 的输出捕获为字符串,那么从 在 Servlet Container 中可以相当简单(尽管从设计的角度来看远非理想):
      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 Container,让它处理JSP解释。您的程序将向其提交 HTTP 请求并捕获输出。
      2. 同上,但可以运行嵌入式 Servlet Container(例如 Jetty)。

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

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

      【讨论】:

      • 感谢您的建议。我实际上不想实现自己的 servlet 容器。我也不想编译和处理 JSP,但我没有看到任何替代我寻找的东西。我想将服务器响应创建为这样的 JSON: {html1: "
        1
        ", html2: ""} 每个 html 都必须使用 JSP 制作,但 JSON 不能在那里。我使用了 FreeMarker,但我不知道它是否有帮助。如果您知道某种方式来做我正在寻找的事情,我将不胜感激。谢谢。
      • 我不太清楚您要达到的目标。您是否从在 servlet 容器外部运行的应用程序返回该 JSON 响应?为什么?我很难想象使用 JSON 进行应用间通信。如果你能澄清你想要做的更多,我很乐意提供帮助。 FreeMarker 的不同之处在于您可以完全在您的应用程序中运行它,而无需伪造 servlet 环境。例如。您响应中的每个“html”片段都将由单独的 FTL 模板生成,您只需在每个模板上调用 Template.process(model, writer)。
      • 请注意,由于jira.codehaus.org/browse/JETTY-1485,这(当前)不适用于 Jetty。它在 Tomcat 上运行良好。这里有关于这种方法的更详细的描述:technologicaloddity.com/2011/10/04/…
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-16
        • 2011-08-17
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2012-11-21
        相关资源
        最近更新 更多