是否可以在 Web 应用程序之外执行 JSP 页面并捕获其输出?具体来说,在我的情况下,仍然存在一个普通的 Web 应用程序,但它不是从其类路径加载 JSP 页面,而是从任意源加载。似乎我不能简单地获取 RequestDispatcher 并将其指向磁盘上的 JSP 文件。
2 回答
我认为你最好使用像速度这样的模板引擎。这为动态内容提供了一个干净的基础架构,这明显不同于您所要求的 jsp/servlet 内容。
也就是说,我已经看到应用程序将 jsps 复制到其部署的目录中,以便容器获取并翻译它们。如果您这样做,请注意这会限制您未来的选择:
- 你依赖于你的应用程序被“爆炸”——例如它不能直接从 WAR 存档中运行(这可能会限制你的部署选项)
- 如果您不禁用 scriptlet(如果您确实禁用了,但它会有点困难......),让 jsps 在运行时可编辑可能会打开安全漏洞。禁用 scriptlet 会禁止在 jsps 中使用真正的 Java 代码,那么您将仅限于标记库。
- 您将需要一个运行时可用的 Java 编译器,而您可能不希望在生产系统中拥有它——例如,您不能在部署之前预编译您的 jsps。您还需要在生产系统的运行时支付通常的 jsp-translation-penalty。
用于禁用脚本的 web.xml 配置:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
我希望这个 web.xml 片段能够通过,预览没有正确显示它......
更新:试图使 xml-snippet 正确显示。
如果我错了,请纠正我,但我认为你的意思是你想要捕获 HTML ......而不是 JSP。JSP 在 servlet 引擎(Web 应用服务器)上处理(到 JAVA 文件),在 HTML 被格式化并通过 Web 服务器(与 Web APP 服务器不同)提供给请求者之后。您无法让 RequestDispatcher 从磁盘直接处理 JSP,因为它尚未被 Web 应用服务器处理。现在,应该可以捕获 JSP 的输出(在 HTML 中),但我以前从未这样做过。可能有一些精巧的 API 比我能解决的知识更丰富,但 HTTP 通常在端口 80 上完成,所以我猜一个人可以读/写 TCPIP 套接字上的端口 80。在此之上可能还有一些事情要做,但至少这是开始研究的一些点。
抱歉,我无法提供更多细节,但见鬼……在这一点上,这对我来说都是理论。