可能重复:
Freemarker迭代hashmap键
我有一个哈希映射,其中包含项ID作为键,Item对象作为值.以下是伪代码 -
allItems : {
12: itemObj1 (id:12, name:myitem1)
13: itemObj2 (id:13, name:myitem2)
14: itemObj3 (id:14, name:myitem3)
}
Run Code Online (Sandbox Code Playgroud)
在result.ftl上,我需要迭代这个map并获取Item Object的值.我尝试过这种方法但无法从Item对象获取值 -
<#list item?keys as it>
${it} = ${item.get(it)[name]}
</#list>
Run Code Online (Sandbox Code Playgroud) 我开始穿着球衣并尝试使用TDD让freemarker使用它.我想ViewProcessor为我的模板创建一个,但是无法在类中注入servlet上下文.
这是类代码:
@Provider
public class myProcessor implements ViewProcessor<Template> {
[...]
@Context
public ServletContext myContext;
[...]
freemarkerConfiguration.setTemplateLoader(
new WebappTemplateLoader(myContext,
myContext.getInitParameter("freemarker.template.path")));
[...]
}
Run Code Online (Sandbox Code Playgroud)
这是测试代码:
public class myProcessorTest extends JerseyTest {
public static myProcessor mp;
public myProcessorTest() throws Exception{
super(new WebAppDescriptor.Builder("com.domain").build());
}
@Test
public void firstTest(){
mp = new myProcessor();
String path = new String("test.ftl");
Template template = mp.resolve(path);
assertNotNull(template);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用maven与依赖关系如下:
<dependency>
<groupId>com.sun.jersey.jersey-test-framework</groupId>
<artifactId>jersey-test-framework-grizzly</artifactId>
<version>1.5-SNAPSHOT</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
当我部署到我的本地jetty服务器时,我的代码运行正常.但是,如果我想测试我的IDE代码,它没有注入servlet上下文(@Context):myContext是null,当我运行测试:/
我想我错过了一些东西,但我是servlet世界的初学者.
是的,我知道,这 已 被 要求 之前.但大多数问题是两年前的问题,今天必须有一个更好的答案.
我需要一种用于呈现HTML的模板语言.要求:
必须可以从Java调用.
不能是Freemarker,Velocity或StringTemplate.我们已经使用Freemarker一年了,而且速度太慢了.它在负载下消耗了50%的CPU周期.速度比Freemarker差,而StringTemplate也有自己的问题.
它必须使用JSON或其Java等价物,即地图,列表和基元.
我开始让Node.js羡慕.在过去的一年里,Javascript已经有了大量的模板活动,但对Java来说却很少(我知道).
理想的语言看起来像Liquid,它只存在于Rails中.
Jade存在于Java中,但我不希望它附带的所有HTML重新格式化.
更新
我最终选择了Handlebars,它也可用于Java.两者都很棒.
需要访问模板中列表的第一个和第二个元素.
我的Java代码:
myMap.put("key", Arrays.asList("val1", "val2");
Run Code Online (Sandbox Code Playgroud)
我的FTL模板:
<#list myMap?keys as key>
${myMap[key][0]}, ${myMap[key][1]}
Run Code Online (Sandbox Code Playgroud)
< - 上面的行在myMap [key] [0]上以未定义的表达式失败.我查了一下,myMap [key]是一个SimpleSequence.另外,试过$ {myMap [key]?first}并且失败并出现同样的错误.有任何想法吗?
我有以下代码,我将Java方法的结果分配给freemarker变量.
<#assign singleBenchmark = solverBenchmark.findSingleBenchmark(problemBenchmark)>
Run Code Online (Sandbox Code Playgroud)
问题是该Java方法的返回值可能null.即使我检查该变量是否不是null:
<#if !singleBenchmark??>
<td></td>
<#else>
<td>${singleBenchmark.score}</td>
</#if>
Run Code Online (Sandbox Code Playgroud)
<#assign ...>如果Java方法返回null,它仍会在行上崩溃,但有以下异常:
freemarker.core.InvalidReferenceException: Error on line 109, column 45 in index.html.ftl
solverBenchmark.findSingleBenchmark(problemBenchmark) is undefined.
It cannot be assigned to singleBenchmark
at freemarker.core.Assignment.accept(Assignment.java:111)
Run Code Online (Sandbox Code Playgroud)
如何在不必findSingleBenchmark在我的ftl中多次调用该方法的情况下避免此异常?
我正在使用FreeMarker模板引擎从Web服务的抽象描述中生成一些php类.我的问题是,当我在FreeMarker模板中调用一个宏时,宏在宏调用之前插入没有左手空格的文本.
exampleTemplate.ftl:
<?php
class ${class.name} {
<@docAsComment class.doc/>
<#list class.fields as field>
$${field.name};
</#list>
<#-- ... -->
}
?>
<#macro docAsComment doc>
/*
<#if doc.title != "">
* ${doc.title}
</#if>
<#list doc.content as content>
<#if content != ""> * ${content}</#if>
</#list>
*/
</#macro>
Run Code Online (Sandbox Code Playgroud)
这将生成如下内容:
<?php
class foo {
/*
* foo
* bar foo, bla
*/
$a;
$b;
}
?>
Run Code Online (Sandbox Code Playgroud)
一种解决方案是,将前导空格作为参数提交给宏,但这使得模板更难以理解.有更好的解决方案吗?
我在freemarker中迭代一个java列表,但我想在这些单词之间使用逗号.这是我的代码
<#list key_list[key] as value >${value?js_string}, </#list>
Run Code Online (Sandbox Code Playgroud)
这给了我输出
a,b,c,d,
Run Code Online (Sandbox Code Playgroud)
我想要这种格式的输出:(最后没有逗号)
a,b,c,d
Run Code Online (Sandbox Code Playgroud)
我怎么能得到它
我们最近开始在接口中使用java 8默认方法,看起来像Freemarker看不到它们:
${myRatings.notEmpty()}
The following has evaluated to null or missing:
==> myRatings.notEmpty
Run Code Online (Sandbox Code Playgroud)
这很遗憾,因为我们在模板中调用了一堆方法.这个问题有方法解决吗?也许一些补丁?
互联网主要讲的是getFoo()默认方法,这确实没什么意义,但我说的是常规方法调用,而不是getter.
根据FreeMarker include语句文档,您可以像这样制作页眉和页脚感知模板:
<#include "/header.ftl">
<!-- Content of my this page -->
<#include "/footer.ftl">
Run Code Online (Sandbox Code Playgroud)
但如果我的网络应用程序有数百个页面/视图,这是一个冗余的复制意大利面.如果在FreeMarker中有一个" 布局 "概念,那就太棒了,我可以说" 嘿,这是一个布局: "
<#include "/header.ftl">
<@import_FTL_Somehow>
<#include "/footer.ftl">
Run Code Online (Sandbox Code Playgroud)
然后为每个视图创建/页(单独的模板index.ftl,contactUs.ftl等等),然后告诉FreeMarkers其中FTL文件"使用"的布局.这样我就不必在每个模板文件中继续指定页眉/页脚包含.
FreeMarker是否支持这种概念?