在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函数和宏之间的区别在于宏可以打印到输出,但不能返回值,而函数可以返回值但不能打印到输出.
好吧,我遇到了问题,因为我需要打印并返回值:
我正在使用freemarker进行递归树探索,因此我有一个宏被称为recurvively.在正在探索树时,我需要将节点信息打印到输出,还要计算并返回有关所探索节点的统计信息(例如,探索的节点的特定属性的总和)
如果我使用recurvively调用宏,我可以打印节点信息但不能将统计信息返回给调用实体.
如果我使用递归调用的函数,我可以返回统计信息,但不能在输出上打印节点信息.
一种解决方案可能是两次探索树,一次打印节点信息,另一种收集统计数据,但我不愿意使用这种不太优雅的解决方案.
有人能提出更好的解决方案吗?
谢谢
我使用带有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) 有没有办法替换自由标记上的新行字符?我在尝试这个:
<#assign str = str?replace("(\r\n)+", "</p><p>")>
Run Code Online (Sandbox Code Playgroud)
在java上工作过,但在freemarker中没有.我怎样才能做到这一点?
提前致谢.
在任何问题上我找不到与此相关的任何内容,这是非常基本的,但我无法弄清楚.
所以我的问题是我不知道如何将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(默认情况下)使用区域设置来构建它在加载和包含模板时查找的文件名.例如,tos.ftl使用en_US区域设置加载(模板)将查找:
当页面在不同语言之间完全不同时,这对于翻译整个页面非常有用.例如,"服务条款"页面可能主要是静态的,因此不同的语言将具有完全不同的内容.在这种情况下,将整个内容外部化到从消息包加载的消息是一件麻烦事.
我现在正在学习Thymeleaf,无法找到有关类似功能的任何信息.我知道Thymeleaf使用本地化的消息包来填充th:text元素,但是它可以加载模板文件的本地化版本吗?
注意:我正在使用Spring Boot
可能重复:
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世界的初学者.
需要访问模板中列表的第一个和第二个元素.
我的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 8默认方法,看起来像Freemarker看不到它们:
${myRatings.notEmpty()}
The following has evaluated to null or missing:
==> myRatings.notEmpty
Run Code Online (Sandbox Code Playgroud)
这很遗憾,因为我们在模板中调用了一堆方法.这个问题有方法解决吗?也许一些补丁?
互联网主要讲的是getFoo()默认方法,这确实没什么意义,但我说的是常规方法调用,而不是getter.
freemarker ×10
java ×2
spring ×2
html ×1
java-8 ×1
jersey ×1
jsp ×1
security ×1
servlets ×1
spring-boot ×1
spring-mvc ×1
struts2 ×1
taglib ×1
testing ×1
thymeleaf ×1