标签: freemarker

在Freemarker中迭代地图

可能重复:
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)

freemarker

8
推荐指数
1
解决办法
2万
查看次数

使用jersey测试框架时,Servlet上下文注入失败

我开始穿着球衣并尝试使用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):myContextnull,当我运行测试:/

我想我错过了一些东西,但我是servlet世界的初学者.

java testing servlets freemarker jersey

8
推荐指数
1
解决办法
3148
查看次数

需要更好的模板语言

是的,我知道, 要求 之前.但大多数问题是两年前的问题,今天必须有一个更好的答案.

我需要一种用于呈现HTML的模板语言.要求:

  1. 必须可以从Java调用.

  2. 不能是Freemarker,Velocity或StringTemplate.我们已经使用Freemarker一年了,而且速度太慢了.它在负载下消耗了50%的CPU周期.速度比Freemarker差,而StringTemplate也有自己的问题.

  3. 它必须使用JSON或其Java等价物,即地图,列表和基元.

我开始让Node.js羡慕.在过去的一年里,Javascript已经有了大量的模板活动,但对Java来说却很少(我知道).

理想的语言看起来像Liquid,它只存在于Rails中.

Jade存在于Java中,但我不希望它附带的所有HTML重新格式化.

更新

我最终选择了Handlebars,它也可用于Java.两者都很棒.

java templates velocity freemarker stringtemplate

8
推荐指数
1
解决办法
3671
查看次数

在FTL模板中按索引访问元素

需要访问模板中列表的第一个和第二个元素.

我的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}并且失败并出现同样的错误.有任何想法吗?

freemarker

8
推荐指数
1
解决办法
2万
查看次数

如何从可能返回null的方法中分配变量?

我有以下代码,我将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中多次调用该方法的情况下避免此异常?

java freemarker

8
推荐指数
1
解决办法
5971
查看次数

具有少量嵌套元素的Freemarker宏

我怎么能在宏中有几个不同的#nested元素?

macros freemarker

8
推荐指数
1
解决办法
4127
查看次数

FreeMarker:使用宏时保持标识

我正在使用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)

一种解决方案是,将前导空格作为参数提交给宏,但这使得模板更难以理解.有更好的解决方案吗?

java code-generation freemarker

8
推荐指数
1
解决办法
2373
查看次数

如何在Freemarker列表之间获取逗号

我在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 freemarker

8
推荐指数
2
解决办法
3377
查看次数

Freemarker和java8默认方法?

我们最近开始在接口中使用java 8默认方法,看起来像Freemarker看不到它们:

${myRatings.notEmpty()}

The following has evaluated to null or missing:
==> myRatings.notEmpty
Run Code Online (Sandbox Code Playgroud)

这很遗憾,因为我们在模板中调用了一堆方法.这个问题有方法解决吗?也许一些补丁?

互联网主要讲的是getFoo()默认方法,这确实没什么意义,但我说的是常规方法调用,而不是getter.

java freemarker struts2 java-8

8
推荐指数
1
解决办法
550
查看次数

FreeMarker布局可以减少模板冗余吗?

根据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是否支持这种概念?

layout freemarker templating

8
推荐指数
1
解决办法
3004
查看次数