【问题标题】:Interact with JSP compiler与 JSP 编译器交互
【发布时间】:2015-01-26 08:48:12
【问题描述】:

我有一些文本模板存储在数据库中。我们需要使用模板引擎来处理这些文本。我们首先想到了 Velocity / Freemaker / Thymeleaf 来处理这些文本。但是,我认为(但可能是错误的)可以与应用服务器 JSP 编译器进行交互。我更喜欢使用 JSP 编译器,而不是导入一堆新的 jar。

谢谢

【问题讨论】:

标签: java jsp jakarta-ee application-server


【解决方案1】:

AFAIK 它们是不同的概念并且工作方式不同,因此它们不会直接交互:

  • JSP 由 JSP 编译器处理,为在 .class 文件中编译(在运行时)的 servlet 生成 java 代码。它稍后被 servlet 容器用作任何其他 servlet。您可以在带有 scriptlet 的 JSP 中包含任何 Java 代码(即使现在被认为是不好的做法)

  • 模板引擎(Velocity / Freemaker / Thymeleaf)采用 模板 并且只允许在运行时用值替换变量占位符以生成文本。当然,它们也允许测试和循环,但不会生成 java 源代码和类对象。在 Web 应用程序中,他们使用一个 servlet,该 servlet 接受模板和替换值并生成将在响应中发送的文本。

当然,由于 JSP 可以包含任意 java 代码,你可以从 JSP 调用模板引擎,但我真的无法想象一个合适的用例。

根据评论编辑:

您可以尝试使用 JSP 作为模板引擎,但我的建议是:不要这样做!你需要:

  • 创建一个实现ServletResponse 的存根,其中getOutputStream()getWriter() 方法以字符串结尾。
  • 强制 ServletContainer 生成 java 源代码和类文件 - 或者在编译时设法做到这一点(我不知道具体如何做到这一点,但我很确定可以做到)李>
  • 在运行时将生成的 servlet 包含在响应存根中以生成输出字符串。

但请注意,即使您成功了,也会导致难以维护的代码严重耦合到 servlet 容器或在构建时使用特殊步骤(JSP -> java)。如前所述:不要那样做。

我刚来JSP compilation to string or in memory bytearray with Tomcat/Websphere,看来您的问题与那个问题重复...

【讨论】:

  • 我不愿意使用来自 JSP 的模板引擎,而是直接使用 JSP 模板引擎。我希望这是有道理的。就像可以从 java 代码中使用系统 java 编译器一样,我希望 JSP 也能做到这一点。
  • @benjamin.d JSP 不是模板引擎,它以一个 servlet 结尾,将其输出写入ServletResponse 对象。但见上面的编辑
猜你喜欢
  • 2012-04-25
  • 2012-01-16
  • 2013-06-22
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2010-11-05
相关资源
最近更新 更多