是否可以使用 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 加载嵌入式资源部分视图

在 Play Framework 中使用 WHERE 子句返回 List<Type>

在freemarker中使用三元运算符?

js 如何判断一个已打开的页面是不是存在??