脚本视图

TODAY Framework 内置了 Web MVC 与任何可以在 JSR-223 Java 脚本引擎之上运行的模板库的集成。我们已经在不同的脚本引擎上测试了以下模板库:

脚本库 脚本引擎

Handlebars

Nashorn

Mustache

Nashorn

React

Nashorn

EJS

Nashorn

ERB

JRuby

String templates

Jython

集成任何其他脚本引擎的基本规则是它必须实现 ScriptEngineInvocable 接口。

要求

您的类路径上需要有脚本引擎,其详细信息因脚本引擎而异:

  • Nashorn JavaScript 引擎随 Java 8+ 提供。强烈建议使用可用的最新更新版本。

  • JRuby 应添加为依赖项以支持 Ruby。

  • Jython 应添加为依赖项以支持 Python。

  • 应添加 org.jetbrains.kotlin:kotlin-script-util 依赖项和包含 org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory 行的 META-INF/services/javax.script.ScriptEngineFactory 文件以支持 Kotlin 脚本。有关更多详细信息,请参阅 此示例

您需要有脚本模板库。对于 JavaScript,一种方法是通过 WebJars

脚本模板

您可以声明一个 ScriptTemplateConfigurer bean 来指定要使用的脚本引擎、要加载的脚本文件、要调用以渲染模板的函数等。 以下示例使用 Mustache 模板和 Nashorn JavaScript 引擎:

  • Java

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.scriptTemplate();
  }

  @Bean
  public ScriptTemplateConfigurer configurer() {
    ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
    configurer.setEngineName("nashorn");
    configurer.setScripts("mustache.js");
    configurer.setRenderObject("Mustache");
    configurer.setRenderFunction("render");
    return configurer;
  }
}

对于 Java 和 XML 配置,控制器看起来没有什么不同,如下例所示:

  • Java

@Controller
public class SampleController {

  @GetMapping("/sample")
  public String test(Model model) {
    model.addAttribute("title", "Sample title");
    model.addAttribute("body", "Sample body");
    return "template";
  }
}

以下示例显示了 Mustache 模板:

<html>
  <head>
    <title>{{title}}</title>
  </head>
  <body>
    <p>{{body}}</p>
  </body>
</html>

使用以下参数调用渲染函数:

  • String template: 模板内容

  • Map model: 视图模型

  • RenderingContext renderingContext: RenderingContext,提供对应用程序上下文、区域设置、模板加载器和 URL(自 5.0 起)的访问

Mustache.render() 与此签名原生兼容,因此您可以直接调用它。

如果您的模板技术需要一些自定义,您可以提供一个实现自定义渲染函数的脚本。例如,https://handlebarsjs.com[Handlerbars] 需要在使用前编译模板,并且需要 polyfill 来模拟服务器端脚本引擎中不可用的某些浏览器功能。

以下示例展示了如何做到这一点:

  • Java

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.scriptTemplate();
  }

  @Bean
  public ScriptTemplateConfigurer configurer() {
    ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer();
    configurer.setEngineName("nashorn");
    configurer.setScripts("polyfill.js", "handlebars.js", "render.js");
    configurer.setRenderFunction("render");
    configurer.setSharedEngine(false);
    return configurer;
  }
}
当使用非线程安全脚本引擎和未针对并发设计的模板库(例如在 Nashorn 上运行的 Handlebars 或 React)时,需要将 sharedEngine 属性设置为 false。在这种情况下,由于 此错误,需要 Java SE 8 update 60,但通常建议使用最新的 Java SE 补丁版本。

polyfill.js 仅定义了 Handlebars 正常运行所需的 window 对象,如下所示:

var window = {};

这个基本的 render.js 实现会在使用前编译模板。生产就绪的实现还应存储任何重用的缓存模板或预编译模板。 您可以在脚本端执行此操作(并处理您需要的任何自定义 — 例如管理模板引擎配置)。以下示例展示了如何做到这一点:

function render(template, model) {
  var compiledTemplate = Handlebars.compile(template);
  return compiledTemplate(model);
}

查看 TODAY Framework 单元测试, Java资源, 了解更多配置示例。