标签: freemarker

将布尔变量展开为字符串"true"或"false"

在freemarker模板中,我想将布尔变量扩展为类似的字符串:

<#assign booleanVar = "test".isEmpty() />
state: ${booleanVar} <#-- this throws an exception! -->
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出:

state: false
Run Code Online (Sandbox Code Playgroud)

我现在发现达到这个目标的唯一方法是:

state: <#if booleanVar>true<#else>false</#if>
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?

freemarker

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

freemarker函数与宏

你好自由职业者大师

我知道freemarker函数和宏之间的区别在于宏可以打印到输出,但不能返回值,而函数可以返回值但不能打印到输出.

好吧,我遇到了问题,因为我需要打印并返回值:

我正在使用freemarker进行递归树探索,因此我有一个宏被称为recurvively.在正在探索树时,我需要将节点信息打印到输出,还要计算并返回有关所探索节点的统计信息(例如,探索的节点的特定属性的总和)

如果我使用recurvively调用宏,我可以打印节点信息但不能将统计信息返回给调用实体.

如果我使用递归调用的函数,我可以返回统计信息,但不能在输出上打印节点信息.

一种解决方案可能是两次探索树,一次打印节点信息,另一种收集统计数据,但我不愿意使用这种不太优雅的解决方案.

有人能提出更好的解决方案吗?

谢谢

freemarker

9
推荐指数
1
解决办法
8422
查看次数

在Freemarker中添加Spring库以使用JSP Taglibs以确保安全性

我使用带有freemarker的spring作为模板引擎.Freemarker允许使用Jsp Taglibs,例如,通过添加安全性

    <#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
Run Code Online (Sandbox Code Playgroud)

到模板,允许我使用的例子

    <@security.authorize ifNotGranted="ROLE_ADMIN">
        whatever
    </@security.authorize>
Run Code Online (Sandbox Code Playgroud)

但是,Spring/Freemarker找不到taglib,除非它们被添加到类路径中,所以我补充说

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>${spring.version}</version>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

到我项目中的pom.xml.

但无论如何,无法找到标签!我必须将spring-security-taglibs.jar添加到WEB-INF/lib文件夹中,以便找到标签.

有人知道为什么必须将jar显式添加到lib文件夹中吗?在我看来,tomcat为什么不找到它们?

编辑@ddekany

谢谢.如果未将spring-security-taglibs.jar复制到WEB-INF/lib目录中,则堆栈跟踪如下所示

    No mapping defined for http://www.springframework.org/security/tags 
    The problematic instruction: ---------- ==> assignment: 
            security=JspTaglibs["http://www.springframework.org/security/tags"] 
            [on line 12, column 1 in home.ftl] in user-directive content.main 
            [on line 8, column 9 in home.ftl] in user-directive layout.global 
            [on line 2, column 1 in home.ftl] 
    ---------- Java backtrace for programmers: ----------      
    freemarker.template.TemplateModelException: 
            No mapping defined for http://www.springframework.org/security/tags at         
    freemarker.ext.jsp.TaglibFactory.get(TaglibFactory.java:180) at 
    ...
Run Code Online (Sandbox Code Playgroud)

security spring jsp freemarker taglib

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

替换freemarker中的换行符

有没有办法替换自由标记上的新行字符?我在尝试这个:

<#assign str = str?replace("(\r\n)+", "</p><p>")>
Run Code Online (Sandbox Code Playgroud)

在java上工作过,但在freemarker中没有.我怎样才能做到这一点?

提前致谢.

html freemarker

9
推荐指数
1
解决办法
8662
查看次数

如何在freemarker中将null设置为变量

在任何问题上我找不到与此相关的任何内容,这是非常基本的,但我无法弄清楚.

所以我的问题是我不知道如何将null设置为freemarker中的变量.例:

${hi!"bye"}          <#-- Prints "bye" because hi is undefined -->
<#assign hi="hi">    <#-- Sets a value to the var hi -->
${hi!"bye"}          <#-- Prints "hi" because hi has a value -->
<#assign hi=null>    <#-- This does not work but is what I am looking for -->
${hi!"bye"}          <#-- I want it to print "bye" because hi should be undefined -->
Run Code Online (Sandbox Code Playgroud)

我有这个问题,因为我迭代一个列表并设置一个var,如果特定项的某些逻辑验证,然后检查var是否存在,但如果第一个项创建var,那么我将为其余的设置var列表中的项目.

freemarker

9
推荐指数
2
解决办法
6075
查看次数

Thymeleaf可以像Freemarker一样进行本地化的模板查找吗?

Freemarker(默认情况下)使用区域设置来构建它在加载和包含模板时查找的文件名.例如,tos.ftl使用en_US区域设置加载(模板)将查找:

  1. tos_en_US.ftl
  2. tos_en.ftl
  3. tos.ftl

当页面在不同语言之间完全不同时,这对于翻译整个页面非常有用.例如,"服务条款"页面可能主要是静态的,因此不同的语言将具有完全不同的内容.在这种情况下,将整个内容外部化到从消息包加载的消息是一件麻烦事.

我现在正在学习Thymeleaf,无法找到有关类似功能的任何信息.我知道Thymeleaf使用本地化的消息包来填充th:text元素,但是它可以加载模板文件的本地化版本吗?

注意:我正在使用Spring Boot

spring freemarker spring-mvc thymeleaf spring-boot

9
推荐指数
1
解决办法
786
查看次数

在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
查看次数

在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万
查看次数

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
查看次数