4

我正在使用 Java 和 Spring MVC 开发应用程序。像往常一样,将一个 JSP 文件存储在 /WEB-INF/view/ 文件夹中,该文件用作所有请求的视图。

通常我们有这个 JSP 硬编码,它也有一些代码来处理模型(标签和 EL)。到目前为止一切正常。

现在,我不想对 JSP 进行硬编码,而是想从数据库中动态填充这个 JSP 文件。因此用户可以上传和选择不同的模板/主题/布局来显示他的页面。

这是解释我要做什么的代码(我知道这不是方法,仅用于说明目的)。

/WEB-INF/views/index.jsp

<%@ page import="com.example.domain.Template" %>
<%@ page import="com.example.dao.TemplateStore" %>

<!-- Following code is supposed to return complete JSP template from the database as uploaded by the user. -->

<%= TemplateStore.getUserTemplate("userTemplate") %>

我在网上搜索了这个主题,但找不到任何东西。

任何有关如何实现这一点的帮助将不胜感激。

提前致谢。

重要提示:我几天前问过这个问题,但被一些成员标记为“离题”。我还没有理解这个问题是如何脱离主题的 - https://stackoverflow.com/questions/18026092/creating-content-of-jsp-views-in-web-inf-views-dynamically-from-the -数据库

4

2 回答 2

3

如果要从数据库中动态获取视图模板,则不应考虑 JSP。JSP 被编译成 servlet 类,除了标准方式(webapp 根目录下的静态文件)之外,几乎没有支持这样做。

因此,只需考虑将视图技术(至少对于动态部分)切换到一些通用模板库,如VelocityFreemarker。这带来了一个安全奖励,因为从这样的模板中破坏的可能性比从 JSP 代码中破坏的要少。

您甚至可以支持多种视图技术(可能是 Spring MVC 开箱即用支持的任何技术,JSP 除外)并允许您的用户在上传时选择模板类型。

然后,您可以编写一个自定义视图解析器,该解析器将使用用户选择的模板委托给适当的标准解析器(Velocity、Freemarker、XSLT 等)。

但是,如果 JSP 是一项硬性要求,我猜想 JSP 的一个丑陋的解决方法(它应该在任何 servlet 容器中工作)可能是从数据库中获取内容并WEB-INF/templates/${primarky-key}.jsp在您分解的 webapp 根目录下创建一个实际文件(如 ),然后RequestDispatcher.forward()到它.

于 2013-08-09T07:27:53.653 回答
0

您可能会也可能不会使用 JSP 执行此操作,但您当然可以在内存中编译 Java 代码然后调用它。

http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm

当然,从 JSP 到 Servlet 只是另一个步骤。

于 2013-08-09T07:56:21.173 回答