我正在使用freemarker生成一个freemarker模板.但我需要一些方法来逃避freemarker标签.
我怎么逃避<#list>标签或${expression}?
这是我的freemarker模板的一部分:
${order.needByDate?if_exists?date}
我希望它的工作方式如下:
needByDate为null,则不写入任何内容以上仅适用于第二种情况.实现这一目标的正确方法是什么?
我想创建一个每个其他视图页面都将继承的主模板.
所以主模板将具有:
HEADER
--CONTENT--
FOOTER
Run Code Online (Sandbox Code Playgroud)
标题将可选地显示(如果用户已登录),用户名和其他用户对象属性.
--CONTENT--是占位符,其他"继承"视图页面将注入其内容.
所以我的问题是,这可能与freemarker有关吗?如果有,任何指导?
如何将用户对象从控制器操作传递到标头?理想情况下,对象将在每个视图页面以外的其他位置传递(以避免必须在每个视图页面上维护此代码).
我正在使用Sping MVC和freemarker视图.我设置了一个FreeMarkerViewResolver来解析视图,它到目前为止工作但现在我有编码问题.我的所有视图都是UTF-8编码的HTML 5页面,我还在<meta charset="UTF-8" />HTML页面中添加了一个,但字符仍然以错误的编码打印.我用curl检查了HTTP标头,发现了这个:
k@jules:~$ curl -I http://localhost:8080/testweb/test.view
HTTP/1.1 200 OK
Content-Type: */*;charset=ISO-8859-1
Run Code Online (Sandbox Code Playgroud)
但是,当我请求一些不存在的资源(生成Tomcat错误)时,我得到了这个:
k@jules:~$ curl -I http://localhost:8080/testweb/nothere.html
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Run Code Online (Sandbox Code Playgroud)
因此Tomcat本身返回正确的内容类型,但Spring MVC Freemarker视图不会.
对于JSP,我可以在JSP标头中设置Content-Type,但是在哪里可以为freemarker模板设置它?我想我必须在Spring bean配置中的某个地方做这个,但我找不到合适的地方.
假设我们有一个简单的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打印重音字符,但在重音字符的位置,我只得到问号.我已经证实,以下声明成立:
"UTF-8" == Environment.getCurrentEnvironment().getConfiguration().getDefaultEncoding()
Run Code Online (Sandbox Code Playgroud)
我可以很容易地看到,在将变量字符赋予模板之前,它们已正确保存在变量中.
我的freemarker上下文可以在这里找到:https://gist.github.com/1975239
例如,而不是:
Jedine?ný živý koncert, kde nejen, že uslyšíte, ale i uvidíte splynutí metalové kapely s padesáti?lenným orchestrem v?etn?.
Run Code Online (Sandbox Code Playgroud)
我一直在:
Jedine?ný ?ivý koncert, kde nejen, ?e usly?íte, ale i uvidíte splynutí metalové kapely s padesáti?lenným orchestrem v?etn?.
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在调查使用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,是否可以指示它默认将所有数字视为"计算机"?
我试着申请
cfg.setSetting(Configurable.NUMBER_FORMAT_KEY, "computer");
Run Code Online (Sandbox Code Playgroud)
要么
cfg.setNumberFormat("computer");
Run Code Online (Sandbox Code Playgroud)
配置对象,但结果不是理想的.相信这是文档的方法,有什么不对吗?
我想比较两个字符串来判断第一个字符串是否比第二个字符串"更小".
<#if name1 <= name2>
....
</#if>
Run Code Online (Sandbox Code Playgroud)
错误:
Can't use operator "<=" on string values.
Run Code Online (Sandbox Code Playgroud)
这可以在FreeMarker中完成吗?是否可以String.compareTo在模板中调用该方法?
我必须做一个树结构来显示来自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)