我正在使用freemarker生成一个freemarker模板.但我需要一些方法来逃避freemarker标签.
我怎么逃避<#list>标签或${expression}?
注意提升Freemarker大师:
我想使用单个freemarker模板来输出任意pojos的表,其中要显示的列与数据分开定义.问题是我无法弄清楚如何在运行时获取pojo函数的句柄,然后让freemarker调用该函数(lambda样式).从浏览文档看,Freemarker似乎支持函数式编程,但我似乎无法论证正确的咒语.
我掀起了一个简单的具体例子.假设我有两个列表:具有firstName和lastName的人员列表,以及带有品牌和型号的汽车列表.想输出这两个表:
<table>
<tr>
<th>firstName</th>
<th>lastName</th>
</tr>
<tr>
<td>Joe</td>
<td>Blow</d>
</tr>
<tr>
<td>Mary</td>
<td>Jane</d>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
和
<table>
<tr>
<th>make</th>
<th>model</th>
</tr>
<tr>
<td>Toyota</td>
<td>Tundra</d>
</tr>
<tr>
<td>Honda</td>
<td>Odyssey</d>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
但我想使用相同的模板,因为这是一个必须处理几十种不同的pojo类型的框架的一部分.
给出以下代码:
public class FreemarkerTest {
public static class Table {
private final List<Column> columns = new ArrayList<Column>();
public Table(Column[] columns) {
this.columns.addAll(Arrays.asList(columns));
}
public List<Column> getColumns() {
return columns;
}
}
public static class Column {
private final String name;
public Column(String name) {
this.name = name; …Run Code Online (Sandbox Code Playgroud) 我想在freemarker模板中使用一些自定义标签,这很容易,因为我可以在我的web.xml文件中包含JspSupportServlet并在模板中包含以下行.
<#assign my=JspTaglibs["/WEB-INF/mytaglib.tld"] />
Run Code Online (Sandbox Code Playgroud)
但是,如果.tld捆绑在META-INF目录中的JAR文件中,我该怎么做呢?我试过这两个都没有运气.
<#assign my=JspTaglibs["/META-INF/mytaglib.tld"] />
<#assign my=JspTaglibs["/mynamespace"] />
Run Code Online (Sandbox Code Playgroud) 假设我们有一个简单的Freemarker宏:
<#macro myMacro expr>
<#local x=1>
${expr}
</#local>
<#local x=2>
${expr}
</#local>
</macro>
Run Code Online (Sandbox Code Playgroud)
<@myMacro“ A” />给出:
A A
我需要类似<@myMacro“ A $ {x}” />之类的东西:
A1 A2
但是在传递给宏之前,无法对$ {x}进行插值。即使我使用原始字符串r“ A $ {x}”作为参数,这也不起作用。
我试图玩?eval,但还没有结果(((
有可能做我所需要的吗?
我正在调查使用FreeMarker编写EDI文件.这些基本上是格式化(和验证)的电子发票.我决定开始编写一个简单的例子,并且很难让它模板化'嵌套的pojo'.我的意思是一个包含POJO的POJO,其中两个都有我想要输出的数据.我写了一个单元测试(自包含),由于未知原因而失败.当我运行测试时,我得到以下异常:
Expression user.getSub is undefined on line 1, column 24 in simple.
The problematic instruction:
----------
==> ${user.getSub().user} [on line 1, column 22 in simple]
----------
Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression user.getSub is undefined on line 1, column 24 in simple.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:124)
at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:134)
<snip>
example.TestFreeMarkerTemplating.testSimpleTemplate(TestFreeMarkerTemplating.java:23)
<snip>
Run Code Online (Sandbox Code Playgroud)
我在模板上尝试了很多变化,并没有取得成功.这是测试:
package example;
import java.io.*;
import org.junit.Test;
import freemarker.cache.StringTemplateLoader;
import freemarker.ext.beans.BeansWrapper;
import freemarker.template.*;
import static org.junit.Assert.*;
public class TestFreeMarkerTemplating {
Configuration cfg = new Configuration();
StringTemplateLoader stringLoader = new StringTemplateLoader(); …Run Code Online (Sandbox Code Playgroud) 我的应用程序中的视图层的FreeMarker模板文件中有很多编码.
我想知道我是否可以使用Eclipse设置调试点.有没有可用于调试FreeMarker模板文件的好插件?
从json,我得到的价值
"createdOn": "Jan 08 2015 20:40:56 GMT+0530 (IST)",
Run Code Online (Sandbox Code Playgroud)
我正在访问FTL
<#list variables as variable>
<div class="reply">
${variable.createdOn}
</div>
</#list>
Run Code Online (Sandbox Code Playgroud)
我得到的结果是
Jan 09 2015 12:36:18 GMT+0530 (IST)
Run Code Online (Sandbox Code Playgroud)
我更喜欢的格式是
09-01-2015
我需要删除剩余的时间GMT,IST等.
如何在Freemarker模板或javascript中转换它.
更新
我试着像这样传递下面
${variable.createdOn?datetime?string("dd-MM-yyyy")}
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
Exception: java.text.ParseException - Unparseable date: "Jan 09 2015 12:36:18 GMT+0530 (IST)"
Run Code Online (Sandbox Code Playgroud)
任何帮助都是赞赏的.
谢谢
如何转换iso日期格式的字符串,如
"2015-06-28T03:39:43.176Z"
Run Code Online (Sandbox Code Playgroud)
看起来像
"2015-06-28 03:39:43 PDT" using Freemarker?
Run Code Online (Sandbox Code Playgroud)
我试过一些像:
${x.Start?datetime(iso)?datetime}
${x.Start?datetime.iso?datetime}
Run Code Online (Sandbox Code Playgroud)
但那没用.
我必须做一个树结构来显示来自Java的数据.我正在使用jQuery的treetable插件,我无法获得我想要的输出.这是我的代码.
Freemarker:
<table id="dt_basic" class="table table table-bordered table-hover" width="100%">
<thead>
<tr>
<#list rows.getCols() as col>
<th>${col.getColumnName()}</th>
</#list>
</tr>
</thead>
<tbody>
<#list rows.getRows() as row>
<#if !parent??>
<#assign parent = row />
<tr data-tt-id="${parent[rows.getCols()[0].getColumnName()]}" data-tt-branch="true">
<td>${parent[rows.getCols()[0].getColumnName()]}</td>
<td colspan="${rows.getCols()?size-1}"></td>
</tr>
<#elseif row[rows.getCols()[0].getColumnName()] != parent[rows.getCols()[0].getColumnName()]>
<#assign parent = row />
<tr data-tt-id="${parent[rows.getCols()[0].getColumnName()]}">
<td>${row[col.getColumnName()]}</td>
<td colspan="${rows.getCols()?size-1}"></td>
</tr>
</#if>
<tr data-tt-id="1.1" data-tt-parent-id="${row[rows.getCols()[0].getColumnName()]}">
<#list rows.getCols() as col>
<#if col?is_first>
<td>${row[col.getColumnName()]}</td>
<#else>
<#if col.isRightAligned()>
<td name="${col.getColumnName()}" align='RIGHT'>${row[col.getColumnName()]}</td>
<#else>
<td name="${col.getColumnName()}">${row[col.getColumnName()]}</td>
</#if>
</#if>
</#list>
</tr>
</#list>
</tbody> …Run Code Online (Sandbox Code Playgroud)