我正在尝试使用 TinyMCE 和 JSF 2.x 实现一个解决方案。但是,我不确定如何继续(不同的方法)。
我想做什么...
创建具有特定可编辑区域/部分的用户模板(小面文件)有人可以在登录后通过TinyMCE进行编辑。
我不想使用 DB 来存储"可编辑"部分或将它们动态插入 Facelet 模板中。
我这样想着。
- 将可编辑的内容加载到TinyMCE中。
- 用户更新内容。
- 提交时,使用 Java API 验证内容以进行 XML 处理或其他一些 XML/XHTML 解析器。
- 阅读 Facelet 模板并将可编辑内容替换为提交的内容。
- 将旧的 Facelet 文件替换为新文件并保存。
在进行更改之前,我是否应该使用中间步骤将提交的内容预先保存到 Facelets 文件中?关于如何继续这样做的任何其他想法将不胜感激!
我不想使用 DB 来存储"可编辑"部分或将它们动态插入 Facelet 模板中。
然后,您唯一可行的选择是将它们保存在本地磁盘文件系统中。请注意,您可以也不应该将它们保存在 WAR 的部署文件夹中,而是保存在 WAR 之外。否则,在重新部署甚至简单的服务器重新启动期间,所有更改都会丢失。更重要的是,当服务器配置为在内存中而不是磁盘上扩展 WAR 时,您将无法向其写入文件。
在 WAR 之外保存文件很容易。只需写入此文件上的FileOutputStream
:
new File("/some/base/path", filename);
让 Facelet 解析来自 WAR 外部的资源需要一个自定义ResourceResolver
:
public class MyResourceResolver extends ResourceResolver {
private ResourceResolver parent;
public MyResourceResolver(ResourceResolver parent) {
this.parent = parent;
}
@Override
public URL resolveUrl(String path) {
URL url = parent.resolveUrl(path); // Resolves from WAR.
if (url == null) {
url = new File("/some/base/path", path).toURI().toURL();
}
return url;
}
}
这需要在web.xml
中注册如下。
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.example.MyResourceResolver</param-value>
</context-param>
Xhtml 文件默认位于 WAR 中。您可以部署分解的 WAR 并将它们就地保存。但是,重新部署后,您将丢失所有更改。
您可以"破解"JSF以在WAR存档之外查找模板,但这可能很棘手。
你需要坚持使用JSF吗?基于组件的服务器端技术不是最佳选择。对于此类解决方案,我最好使用一些基于模板的控制器优先技术,如Spring MVC或Grails。请注意,在 JSF 中,控制流的是 XHTML 页面。这不仅仅是模板技术。
另请注意,这就是发明CMS系统的原因。
我在一个项目中使用了 richfaces html 编辑器,但我们遇到了几个问题,所以我们决定创建自己的 facelet 标签来加载 apache 提供的 tinymce 文件。像魅力一样工作