天道酬勤,学无止境

Freemarker 模板错误:null 或缺失(Freemarker template error: null or missing)

问题
public static void main(String[] args) throws IOException {
    port(8080);

    Configuration config  = new Configuration(Configuration.VERSION_2_3_26);
    config.setDirectoryForTemplateLoading(new File("PATH_NAME"));



    get("/test", (req,res) ->{
        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("loginform.ftl");
        temp.process(null, writer);
        return writer;
    });


    post("/select", (req,res) -> {
        String city = req.queryParams("city");
        String state = req.queryParams("state");


        Map<String, Object> data = new HashMap<>();

        data.put("Hello", "Your not null!");

        StringWriter writer = new StringWriter();
        Template temp = config.getTemplate("result.ftl");

        temp.process(data, writer);

        return writer;

        });

}
FreeMarker template error: The following has evaluated to null or missing: ==> data [in template "result.ftl" at line 2, column 8] FTL stack trace ("~" means nesting-related): - Failed at: #list data as key, value [in template "result.ftl" at line 2, column 1] ---- <form action= "/select" method= "POST" accept-charset="utf-8"> City Name: <input type= "text" name = "city"> State(2 letter format):<input type= "text" name = "state"> <input type= "submit" id = "submitButton"> </form> <html> <#list data as key, value> ${key} = ${value}; </#list> </html>
回答1
Map<String, object> root = new HashMap<>(); root.put("data", data); temp.process(root, writer);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • FreeMarker 模板错误:以下已评估为空或缺失 | 但不是真的(FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE)
    问题 我面临的错误太奇怪了。 一切看起来都很好,但是当浏览器向服务器发送 GET 请求时出现此错误。 我想要做的实际上是捕获 HTTP 参数,将它们保存在保存在 ArrayList 中的对象中,然后发送到 Freemarker 模板。 请你帮助我好吗? 非常感谢。 错误: freemarker.log._JULLoggerFactory$JULLogger 错误 严重:执行 FreeMarker 模板时出错 FreeMarker 模板错误:以下内容已评估为 null 或缺失:==> item.lat1 [in template "view/result.ftl" at line 18, column 15] freemarker.core.InvalidReferenceException: [... 异常消息已打印; 见上面...] 在 freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:131) 在 freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:355) 在 freemarker.core.Expression.evalAndCoerceToString(Expression.java
  • Liferay 7 Freemarker 模板。 staticUtil 已评估为 NULL 或缺失 - 试图获取 JournalArticle 的类别(Liferay 7 Freemarker Template. staticUtil has evaluated to NULL or missing - Tried to get JournalArticle's Categories)
    问题 嗨,Liferay'ers, 我正在尝试使用 Freemarker 模板获取 journalArticle 的类别。 我试过这段代码: <#assign journalArticleId = .vars['reserved-article-id'].data> <#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil"]> <#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil"]> <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/> <#assign categoryList=assetCategoryLocalServiceUtil.getCategories("com.liferay
  • Freemarker 不分配 staticUtil(Freemarker does not assign staticUtil)
    问题 我在liferay 6.2上工作过应用程序显示模板,我使用freemarker帮助对liferay的动态数据列表进行分页。 当我升级到liferay 7时,这是一个问题。 Liferay 7 使​​用代码<#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)>来获取记录。 旧代码: <#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) > 它不起作用。 所以我尝试<#assign serviceLocator = staticUtil["com.liferay.portal.template.ServiceLocator"]
  • 如何检查FreeMarker模板中是否存在变量?(How to check if a variable exists in a FreeMarker template?)
    问题 我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值。 如果要提供userName变量,我想有条件地包括模板的一部分,例如: [#if_exists userName] Hi ${userName}, How are you? [/#if_exists] 但是,FreeMarker手册似乎表明if_exists已过时,但我找不到其他方法来实现这一目标。 当然,我可以简单地提供一个额外的布尔变量isUserName,并像这样使用它: [#if isUserName] Hi ${userName}, How are you? [/#if] 但是,如果有一种方法可以检查userName是否存在,那么我可以避免添加此额外变量。 回答1 要检查该值是否存在: [#if userName??] Hi ${userName}, How are you? [/#if] 或使用标准的freemarker语法: <#if userName??> Hi ${userName}, How are you? </#if> 要检查该值是否存在并且不为空: <#if userName?has_content> Hi ${userName}, How are you? </#if> 回答2 这似乎是一个更好的选择: <#if userName?has_content> ... do
  • Springboot整合FreeMarker生成静态html两种方法
    1、 FTL指令 1.1、assign指令 1.2、include指令 1.3、 if指令 1.4、 list指令 2、 内建函数 2.1、获取集合大小 2.2、转换JSON字符串为对象 2.3、日期格式化 2.4、数字转换为字符串 3、空值处理运算符 3.1、判断某变量是否存在:“??” 3.2、缺失变量默认值:“!” 4、运算符 4.1、算数运算符 4.2、逻辑运算符 4.3、比较运算符 5、 springboot整合FreeMarker生成html 5.1、依赖 5.2、配置模板(方案一) 5.3、字符模板(方案二) 模板的常用标签 在FreeMarker模板中可以包括下面几个特定部分: ${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代。 ${name}可以取得root中key为name的value。 ${person.name}可以取得成员变量为person的name属性 <#…>:FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分 <@>:宏,自定义标签 注释:包含在<#–和-->(而不是)之间 1、 FTL指令 1.1、assign指令 此指令用于在页面上定义一个变量 (1)定义简单类型: <#assign linkman=“周先生”> 联系人:${linkman} (2)定义对象类型:
  • SpringBoot模板引擎
    springboot模板引擎 测试是否springboot集成是否成功 thymeleaf模板thymeleaf中${}语法thymeleaf中list遍历thymeleaf解决html转译问题 Freemarker模板Freemarker中获取单个值写法htmlFreemarker中条件语法htmlFreemarker中 exists用在逻辑判断htmlFreemarker中 list 循环htmlFreemarker中 局部变量(assign)/全局变量(global)htmlpomapplication.yml文件的默认配置解决报错:缺失实体类get.set问题解决报错ftl文件没有在application.xml对应得位置下完整效果 测试是否springboot集成是否成功 相当与集成mybatis ThymeleafController package com.wxm.springboot.controller.springboot2; import com.wxm.springboot.entity.springboot2.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import
  • spring security 3.2.0 csrf 令牌在 freemarker 模板中不起作用(spring security 3.2.0 csrf token not working in freemarker template)
    问题 升级到 Spring Security 3.2.0 并配置 xml 后,_csrf 令牌不起作用。 基础知识: 春天 4.0.1 春季安全 3.2.0。 Freemarker 模板语言 第一步——spring security xml配置: <!-- enable csrf protection via csrf-element --> <sec:http> <!-- --> <sec:csrf token-repository-ref="csrfTokenRepository" /> </sec:http> <!-- rewrite headerName --> <bean id="csrfTokenRepository" class="org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository"> <property name="headerName" value="X-SECURITY" /> </bean> 第 2 步 - freemarker 模板: <form accept-charset="UTF-8" action="/portal" method="POST" name="formAddItemToCart"> <!-- ... --> <!-- inlcude csrf
  • Struts 2 FreeMarker 模板错误 stack.findValue('top') 未定义(Struts 2 FreeMarker Template Error stack.findValue('top') is undefined)
    问题 我对 Struts2 有另一个问题。 我正在做一个图表和一个数据表。 发生的事情是在我的图表的第一次加载(并单击图表数据以链接到数据表)时,它工作正常。 但是当我更改图表中的参数并想要重新填充数据表时,它给了我这个错误: Error on line 69, column 13 in template/simple/select.ftl stack.findValue('top') is undefined. 不能分配给 itemKey 有问题的指令: ==> assignment: itemKey=stack.findValue('top') [on line 69, column 13 in template/simple/select.ftl] in user-directive s.iterator [on line 59, column 1 in template/simple/select.ftl] 堆栈跟踪 freemarker.core.InvalidReferenceException: Error on line 69, column 13 in template/simple/select.ftl stack.findValue('top') is undefined. It cannot be assigned to itemKey at
  • FreeMarker模板中处理错误的不同方法有哪些?(What are different ways to handle error in FreeMarker template?)
    问题 如何抑制FreeMarker模板错误? 我在这里寻找:http://freemarker.sourceforge.net/docs/pgui_config_errorhandling.html但我不知道如何“ TemplateExceptionHandler.IGNORE_HANDLER”。 我正在使用Struts2,还如何显示另一个ftl页面而不是显示堆栈跟踪? class MyTemplateExceptionHandler implements TemplateExceptionHandler { public void handleTemplateException(TemplateException te, Environment env, java.io.Writer out) throws TemplateException { try { out.write("[ERROR: " + te.getMessage() + "]"); } catch (IOException e) { throw new TemplateException("Failed to print error message. Cause: " + e, env); } } } ... cfg.setTemplateExceptionHandler(new
  • day56-57,13-14,网页静态化解决方案Freemarker,入门案例,FTL指令,Freemarker应用到品优购上架中,消息中间件解决方案JMS简介,和Linux安装搭建
    什么是freemarker: freemarker是apache的一个开源的模板引擎. 作用: freemaker模板引擎可以通过模板和数据生成静态化页面. 优点: 1. 提前根据模板和数据生成静态化页面通过io流将页面写入到硬盘上, 访问的时候直接访问. 就不用访问数据库了, 可以大大提高数据库的高并发读取性能. 使数据库访问量降低. 2. 由于页面是提前生成好的, 所以访问速度快, 客户体验好 3. 由于html不需要tomcat解析浏览器可以直接访问, 所以给tomcat降低高并发访问压力. 使用场景: a. 新闻网站新闻页面通过freemarker提前生成好 b. 电商网站商品详情页面通过freemarker提前生成好 原则: 页面有固定的样式, 并且一次生成多次读取, 尽量少的改动数据 和freemarker同类型的数据: velocity也是一个模板引擎框架, 但是现在被freemarker替代了. freemarker生成静态化页面: 页面 = 模板 + 数据 模板: 模板在freemarker中是以.ftl为后缀名的文件, 在模板中可以使用html标签, css, js,图片等静态资源 模板中可以使用el表达式获取数据, 但是无法使用jstl标签来判断和循环, 所以模板引擎会有自己的一套 标签库供我们使用. 数据
  • 从数据库加载 FreeMarker 模板(Load FreeMarker templates from database)
    问题 我想将我的 FreeMarker 模板存储在一个类似于以下内容的数据库表中: template_name | template_content --------------------------------- hello |Hello ${user} goodbye |So long ${user} 当收到对具有特定名称的模板的请求时,这将导致执行查询,该查询加载相关的模板内容。 这个模板内容,连同数据模型(上面例子中'user'变量的值),应该被传递给FreeMarker。 但是,FreeMarker API 似乎假定每个模板名称都对应于文件系统特定目录中的同名文件。 有什么方法可以轻松地从数据库而不是文件系统加载我的模板? 编辑:我应该提到我希望能够在应用程序运行时将模板添加到数据库中,所以我不能简单地在启动时将所有模板加载到新的 StringTemplateLoader 中(如下所示)。 回答1 我们使用 StringTemplateLoader 加载我们从数据库中获取的模板(如 Dan Vinton 建议的那样) 下面是一个例子: StringTemplateLoader stringLoader = new StringTemplateLoader(); String firstTemplate = "firstTemplate"; stringLoader
  • 在freemarker中是否可以在包含文件之前检查文件是否存在?(In freemarker is it possible to check to see if a file exists before including it?)
    问题 我们正在尝试在 freemarker 中构建一个系统,其中可以选择性地添加扩展文件来替换标准模板的块。 我们已经到了这一步 <#attempt> <#include "extension.ftl"> <#recover> Standard output </#attempt> 所以 - 如果 extension.ftl 文件存在,它将被使用,否则会输出恢复块内部的部分。 这样做的问题是 freemarker 总是记录导致恢复块触发的错误。 所以我们需要两件事之一: 如果文件不存在,则不要调用包含 - 因此需要检查文件是否存在。 -或者- 一种在不更改日志记录的情况下防止在恢复块内记录错误的方法,以防止出现所有 freemarker 错误。 回答1 更简单的解决方案是: <#attempt> <#import xyz.ftl> your_code_here <#recover> </#attempt> 回答2 我们已经编写了一个自定义宏来为我们解决这个问题。 在早期测试中,它运行良好。 要包含它,请添加如下内容(其中 mm 是 Spring ModelMap): mm.addAttribute(IncludeIfExistsMacro.MACRO_NAME, new IncludeIfExistsMacro()); import java.io.IOException
  • 如何通过FreeMarker模板在对象上调用Java方法?(How do I call java methods on an object from a FreeMarker template?)
    问题 是否可以调用从Freemarker模板获取参数的方法? 我有一个对象模型,试图用Freemarker渲染到网页中。 其中一个对象具有一种获取其内容的子列表的方法-采用用于过滤列表的参数: public List getunits(final String type); 我知道在JSP中您不能直接执行此操作,但是您可以编写自定义函数来实现所需的结果。 您如何在Freemarker中解决此问题? 编写自定义函数是否一样? 还是有某种实际调用这种功能的方法? 回答1 FreeMarker允许从表达式中调用通过模型可用的方法。 假设您的对象已公开为myBean ,则可以按以下方式调用该方法: <#list myBean.getunits("myType") as unit> do stuff with ${unit} </#list> 当然,您不必使用<list> ,因为您的方法返回了一个列表,所以仅作为示例。 回答2 正如ChssPly76所说,只要在模型中公开对象,就可以在Freemarker模板中执行方法调用。 但是请务必记住,如果您的方法返回NULL(无论出于何种原因),您将感到困惑 Expression myBean.getunits() is undefined on line .... 为了避免这种情况,您最好使用myBean.getunits(...)!
  • 模板引擎
    模板引擎 模板引擎一、模板引擎分类置换型模板引擎解释型模板引擎编译型模板引擎 二、常见模板引擎 JSP一、简介二、结构三、写法四、相关概念三大指令page指令include指令Taglib指令 九大对象七大动作JSTL 介绍概念分类使用 EL介绍概念语法隐含对象运算符算数运算符关系运算符逻辑运算符条件运算符 演示 五、JSP的运行过程六、Springboot下JSP的使用依赖目录配置代码 FreeMarker一、概念描述与JSP的区别工作机制特点 二、语法数据类型算数运算符逻辑、比较运算符 三、页面静态化静态网页动态网页页面静态化适用场景示例依赖文件结构书写加载ftl并且转换其他文件的类 四、List指令语法 五、内建函数概念 六、在Web项目中的使用配置 Thymeleaf一、简介二、特点三、基本语法th属性文本属性条件属性循环属性 表达式语法``${...}``变量表达式``@{...}``链接表达式``#{...}``消息表达式``~{...}``代码块表达式``*{...}``选择表达式 表达式支持的语法字面文字操作算术操作布尔运算比较和相等条件运算符 基础对象(内置对象)常用工具类内联标签body内的内联js里的内联css里的内联 四、快速入门依赖与配置了解默认配置规则在HTML中添加Thymeleaf的支持示例 模板引擎 为什么而产生 模板引擎(用于Web开发
  • FreeMarker template error: The following has evaluated to null or missing | BUT NOT TRUE
    The error I'm facing is so weird. Everything looks fine, but I get this error when the browser sends the GET request to the server. What I'm trying to do is actually catching the HTTP parameters, save them in an object saved in an ArrayList sending to a Freemarker template. Could you please help me? Thanks a lot. The error: freemarker.log._JULLoggerFactory$JULLogger error SEVERE: Error executing FreeMarker template FreeMarker template error: The following has evaluated to null or missing: ==> item.lat1 [in template "view/result.ftl" at line 18, column 15] freemarker.core
  • Freemarker URL 模板加载器(Freemarker URL Template Loader)
    问题 我想从一个或多个 URL 加载 Freemarker 模板,因此我继承了 URLTemplate 加载器类并覆盖了 getURL(..) 方法以返回目标 URL(见下文)。 然后,我将这个类的几个实例添加到多模板加载器中,并将其添加到 Freemarker 配置中。 当第一个 URL 返回一个模板但没有调用其他模板加载器时,这可以正常工作。 我做错了什么? 我通过 Restlet 框架使用 Freemarker v2.3。 : : : : : : : : : : TemplateLoader[] loaders = new TemplateLoader[] { new MyTemplateLoader(new URL(request.getRootRef() + app.getRoot())), new MyTemplateLoader(new URL(request.getRootRef() + "/")) }; freemarkerConfig.setTemplateLoader(new MultiTemplateLoader(loaders)); : : : : : : : : : : public class MyTemplateLoader extends URLTemplateLoader { private URL root; public
  • freemarker代码生成器
    freemarker数据模型 数据模型可以被看成是树形结构。 标量用于存储单一的值。这种类型的值可以是字符串,数字,日期/时间或者是布尔值。 哈希表是一种存储变量及其相关且有唯一标识名称的容器。 序列是存储有序变量的容器。存储的变量可以通过数字索引来检索,索引通常从0开始。C](这里写自定义目录标题) if 指令 使用 if 指令可以有条件地跳过模板的一些片段。 比如,假设在 最初的示例 中, 想向你的老板Big Joe特别地问好,可其他人不同 通常来讲,如果 condition 是false(布尔值),那么介于 <#if condition> 和 </#if> 标签中的内容会被略过。 condition 的使用: == 是用来判断它两侧的值是否相等的操作符, 比较的结果是布尔值,也就是true或者false。在 == 的左侧,是 被引用的变量, 我们很熟悉这样的语法结构;最终它会被变量的值所替代。通常来说, 在指令或插值中没有被引号标注的内容都被视为变量的引用。右侧则是指定的字符串, 在模板中的字符串 只能 放在引号内。 当价格为0时,就会打印出 “Pythons are free today!”: <#if animals.python.price == 0> Pythons are free today! </#if> 创建 Configuration 实例 ,应该使用 单
  • 如何内省 freemarker 模板以找出它使用的变量?(How can I introspect a freemarker template to find out what variables it uses?)
    问题 我完全不确定这是否是一个可以解决的问题,但假设我有一个 freemarker 模板,我希望能够询问模板它使用哪些变量。 出于我的目的,我们可以假设 freemarker 模板非常简单——只是“根级别”条目(这种模板的模型可以是一个简单的 Map)。 换句话说,我不需要处理调用嵌套结构等的模板。 回答1 这可能为时已晚,但万一其他人遇到此问题:您可以使用“data_model”和“globals”来检查模型 - data_model 将仅包含模型提供的值,而 globals 还将包含模板中定义的任何变量。 您需要在特殊变量前面加上一个点 - 所以要访问全局变量,请使用 ${.globals} 对于其他特殊变量,请参阅 http://freemarker.sourceforge.net/docs/ref_specvar.html 回答2 从java获取变量的另一种方法。 这只是尝试处理模板并捕获InvalidReferenceException以查找 freemarker-template 中的所有变量 /** * Find all the variables used in the Freemarker Template * @param templateName * @return */ public Set<String> getTemplateVariables
  • Liferay 7 Freemarker Template. staticUtil has evaluated to NULL or missing - Tried to get JournalArticle's Categories
    Hi fellow Liferay'ers, I'm trying to get the categories of a journalArticle with a Freemarker template. I tried this code: <#assign journalArticleId = .vars['reserved-article-id'].data> <#assign journalArticleResourceLocalServiceUtil = staticUtil["com.liferay.portlet.journal.service.JournalArticleResourceLocalServiceUtil"]> <#assign assetCategoryLocalServiceUtil = staticUtil["com.liferay.portlet.asset.service.AssetCategoryLocalServiceUtil"]> <#assign articleResourcePK = journalArticleResourceLocalServiceUtil.getArticleResourcePrimKey(groupId, journalArticleId)/> <#assign categoryList
  • Freemarker template error: null or missing
    public static void main(String[] args) throws IOException { port(8080); Configuration config = new Configuration(Configuration.VERSION_2_3_26); config.setDirectoryForTemplateLoading(new File("PATH_NAME")); get("/test", (req,res) ->{ StringWriter writer = new StringWriter(); Template temp = config.getTemplate("loginform.ftl"); temp.process(null, writer); return writer; }); post("/select", (req,res) -> { String city = req.queryParams("city"); String state = req.queryParams("state"); Map<String, Object> data = new HashMap<>(); data.put("Hello", "Your not null!"); StringWriter writer = new