当前位置: 首页 > 知识库问答 >
问题:

如何处理Freemarker字符串模板?

夏祺然
2023-03-14

我正在使用与Freemarker启动的Spring Boot。

给定以下字符串:

${fragment.title}

我试图对这个字符串执行一些验证,以确保它包含正确的Freemarker语法。

@Autowired
private Configuration configuration;

private void validateTemplate(Fragment fragment) {

    try {

        ModelAndView model = new ModelAndView();
        model.addObject("fragment", fragment);

        StringTemplateLoader stringLoader = new StringTemplateLoader();
        stringLoader.putTemplate("template", fragment.getDesign());

        configuration.setTemplateLoader(stringLoader);
        configuration.setDefaultEncoding("UTF-8");

        Template template = configuration.getTemplate("template");
        template.process(model, new OutputStreamWriter(System.out));


    } catch (Exception e) {
        // failed validation...
    }

}

----提示:如果已知失败的表达式在法律上引用了有时为null或缺少的内容,可以指定默认值,如myoptionalvar!mydefault,或者使用<#If myoptionalvar??>when-present<#else>when-missing。(这些仅覆盖表达式的最后一步;要覆盖整个表达式,

----FTL堆栈跟踪(“~”表示与嵌套相关的):---在:${fragment.title}[在模板“template”第1行,第5列]---在freeMarker.core.invalidreferenceexception.getinstance(invalidreferenceexception.java:134)~[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.expection.newDesciptionBuilder(ker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.nonhashException.nonhashException.java:49)~[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.dot._eval(dot.java:48)~[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.expression.eval(expression.java:81)~[freeMarker-2.3.25-incubating.jar:2.3.25]在[freemarker-2.3.25-incubating.jar:2.3.25]在freemarker.core.dollarvariable.accept(美元)variable.java:59)~[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.environment.visit(environment.java:327)[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.environment.visit(environment.java:333)[freeMarker-2.3.25-incubating.jar:2.3.25]在freeMarker.core.environment.visit罐子:2.3.25]

我的设置中缺少什么导致Freemarker不能“查看”片段

共有1个答案

花稳
2023-03-14

获取模板对象本身就足以进行语法验证。根据应用程序的不同,验证模板是否会在运行时失败可能相当棘手,因为您需要一个与实际情况类似的数据模型。

但是让我们假设您可以在您的情况下提供这样的数据模型。那么问题是modelandview不是您的模型。顾名思义,它是你的模型和视图。里面只有你的模型。(FreeMarker不依赖于Spring,因此只需将该对象用作泛型JavaBean,因此您的变量将是ModeandView对象本身的JavaBean属性。)尝试将modelandview.getmodel()传递给template.process。(我不是100%确定它是否总是显示所有的模型变量,但我想是的。无论如何,它扩展了java.util.map,FreeMarker识别的,并将使用map.get(varName)解析变量。)

 类似资料:
  • StringBuffer 是一个字符串拼接工具,和java中的StringBuilder类似。对于那些需要大量的字符串连接的时候,用 StringBuffer 更高效一些。它实现了以下API: class StringBuffer { public function __construct($str); public function isEmpty(); publi

  • 字符串在我们平常的Web开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,本小节将通过Go标准库中的strings和strconv两个包中的函数来讲解如何进行有效快速的操作。 字符串操作 下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。 func Contains(s, substr string)

  • 函数 说明 Series.str.capitalize() 将 Series / 索引中的字符串转换为大写。 Series.str.cat([others, sep, na_rep, join]) 使用给定的分隔符连接 Series / 索引中的字符串。 Series.str.center(width[, fillchar]) 用附加字符填充 Series / 索引中字符串的左侧和右侧。 Seri

  • 我想有一个字符串的freemarker模板输出。我有一个freemarker模板文件commonTemplate。ftl。 Java代码填充模型并将输出打印到控制台App.java. 它适用于控制台输出。

  • 在 Bash 脚本中可以调用字符串处理工具 awk 来替换内置的字符串处理操作。 样例 10-6. 使用另一种方式来截取和定位子字符串 #!/bin/bash # substring-extraction.sh String=23skidoo1 # 012345678 Bash # 123456789 awk # 注意不同字符串索引系统: # Bash 中第一个字符