是否可以使用 VirtualFile 作为 HTML 模板提供程序?如何?
Posted
技术标签:
【中文标题】是否可以使用 VirtualFile 作为 HTML 模板提供程序?如何?【英文标题】:Is it possible to use VirtualFile as HTML Template provider? And How? 【发布时间】:2012-08-14 00:32:18 【问题描述】:需要你的帮助!
我希望标题是描述性的,但这里是详细信息
假设我们有 5 个 Web 应用程序,并且假设它们是由 5 个不同的框架完成的。其中之一是使用 playframework。现在,由于重新命名所有五个网站将花费大量时间,我们想到了将一个布局模板托管为 html 页面,其中将包含 播放标签。
我们需要使用这种布局,因为它是播放应用程序源代码的一部分。现在我阅读了 API 文档并找到了 VirtualFile 类 (VirtualFile API Docs)。由于文档非常简短,我无法从文档中判断此类的目的是什么,但我看到它包含可能对我的案例有用的功能...
下面是同一个类,但在 .NET 中。我之前做过这样的集成,但现在我在 playframework 中也需要它。另请注意,下面链接上的示例是从 zip 存档提供的,但使用 VirtualPathProviders,您可以从任何地方提供模板 Virtualizing Access to Content
感谢任何帮助,不过,解决方案不需要包含 VirtualFile,但它必须是即插即用的。
注意:我们使用的是 playframework 1.2.1
谢谢
【问题讨论】:
【参考方案1】:我找到了解决问题的方法,但没有找到虚拟文件类。如果我在游戏中创建自定义标签,它将在我的视图中替换 extend
标签,这可能会很糟糕。
如果您查看 play 源代码,您会发现现有的工作方式 FastTags class, line 319
public static void _extends(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)
try
if (!args.containsKey("arg") || args.get("arg") == null)
throw new TemplateExecutionException(template.template, fromLine, "Specify a template name", new TagInternalException("Specify a template name"));
String name = args.get("arg").toString();
if (name.startsWith("./"))
String ct = BaseTemplate.currentTemplate.get().name;
if (ct.matches("^/lib/[^/]+/app/views/.*"))
ct = ct.substring(ct.indexOf("/", 5));
ct = ct.substring(0, ct.lastIndexOf("/"));
name = ct + name.substring(1);
BaseTemplate.layout.set((BaseTemplate) TemplateLoader.load(name));
catch (TemplateNotFoundException e)
throw new TemplateNotFoundException(e.getPath(), template.template, fromLine);
我只需要使用重载方法TemplateLoader.load(String, String)
,它接受模板作为字符串(与原始实现中的文件名相比),然后将其设置为
BaseTemplate.layout.set(...)
方法。当然,首先我需要通过 HTTP 请求从远程服务器获取模板。
【讨论】:
以上是关于是否可以使用 VirtualFile 作为 HTML 模板提供程序?如何?的主要内容,如果未能解决你的问题,请参考以下文章
IDEA 开发插件,插件依赖|文件路径转VirtualFile 遇坑随笔
IDEA 开发插件,插件依赖|文件路径转VirtualFile 遇坑随笔
使用自定义 VirtualPathProvider 加载嵌入式资源部分视图