我有一个Freemarker模板,其中包含一堆占位符,在处理模板时会为其提供值.如果提供了userName变量,我想有条件地包含模板的一部分,如:
[#if_exists userName]
Hi ${userName}, How are you?
[/#if_exists]
Run Code Online (Sandbox Code Playgroud)
但是,FreeMarker手册似乎表明if_exists已被弃用,但我找不到另一种方法来实现这一点.当然,我可以简单地提供一个额外的布尔变量isUserName并使用如下:
[#if isUserName]
Hi ${userName}, How are you?
[/#if]
Run Code Online (Sandbox Code Playgroud)
但是如果有一种检查userName是否存在的方法,那么我可以避免添加这个额外的变量.
我的IntelliJ项目中有一个freemarker文件(ftl)被错误地识别为文本文件.有许多相同的类型是正确的.我知道"标记为文本"选项.这可能是此文件被标记为文本的原始原因,但我没有提供"标记为ftl文件"选项将其关闭,如果确实这是问题.如果我将其他ftl文件标记为txt,我可以按预期将它们重新转换为ftl文件.
我即将选择组织我的观点(使用spring-mvc,但这不应该太重要)
据我所知,有6个选项(尽管它们并不相互排斥):
<jsp:include><%@ include file="..">Tiles和Sitemesh可以分组; 所以可以的Freemarker和速度.每个小组中使用哪一个不是这个讨论的问题,有足够的问题和讨论.
这是一个有趣的读物,但不能说服我使用瓷砖.
我的问题是 - 这些框架提供的内容 <@ include file="..">与JSTL 无法正常完成.要点(一些来自文章):
包括部分页面,如页眉和页脚 - 之间没有区别:
<%@ include file="header.jsp" %>
Run Code Online (Sandbox Code Playgroud)
和
<tiles:insert page="header.jsp" />
Run Code Online (Sandbox Code Playgroud)在标题中定义参数 - 如标题,元标记等.这非常重要,尤其是从SEO的角度来看.使用模板选项,您只需定义每个页面应定义的占位符.但是你可以在jsp中使用JSTL,使用<c:set>(在包含页面中)和<c:out>(在包含的页面中)
布局重组 - 如果要在菜单上方移动面包屑,或在另一个侧面板上方移动登录框.如果页面包含(使用jsp)组织不当,则可能需要在这种情况下更改每个页面.但是如果你的布局不是太复杂,并且你把常见的东西放在页眉/页脚中,就没有什么可担心的了.
公共组件和特定内容之间的耦合 - 我没有发现这个问题.如果要重用某些片段,请将其移动到不包含任何页眉/页脚的页面,并在需要的地方包含它.
效率 - <%@ include file="file.jsp" %>比其他任何东西都更有效,因为它被编译一次.所有其他选项都被解析/执行多次.
复杂性 - 所有非jsp解决方案都需要额外的xml文件,其他包括,预处理器配置等.这既是学习曲线又是引入更多潜在的失败点.此外,它使支持和更改变得更加乏味 - 您必须检查许多文件/配置以了解正在发生的事情.
占位符 - 速度/自由标记比JSTL更多吗?在JSTL中,您放置占位符,并使用模型(放置在请求或会话范围内,由控制器)来填充这些占位符.
所以,说服我除了普通的JSP之外我应该使用上面的任何框架而不是/.
我是一个项目的新手,必须从内到外学习.我看到很多带有扩展名的文件.ftl.我不确定它们是什么.我知道它们可以被修改,用户可以看到前端的变化.
Freemarker有两种集合数据类型,列表和hashmaps有没有办法迭代hashmap键,就像我们对列表一样?
所以,如果我有一个带数据的var,那就说:
user : {
name : "user"
email : "looser@everything.com"
homepage : "http://nosuchpage.org"
}
Run Code Online (Sandbox Code Playgroud)
我想用它们的值打印所有用户的属性.这是无效的,但目标很明确:
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
Run Code Online (Sandbox Code Playgroud) Velocity还是FreeMarker?
他们看起来几乎一样,甚至是语法?
用什么?还是什么时候用?
freemarker中的以下内容有什么区别?
!
has_content
??
if_exists
Run Code Online (Sandbox Code Playgroud)
我用了 ??而不是has_content&它导致如此巨大的问题.搞砸了我的一天.我真的需要弄清楚这件事.
我用的时候
!(xyz.abc!)?? -- it dint work
Run Code Online (Sandbox Code Playgroud)
我用的时候
!(xyz.abc!)?has_content ... it did work
Run Code Online (Sandbox Code Playgroud)
不?或has_content或if_exists检查相同的事情?
是否可以调用从Freemarker模板获取参数的方法?
我有一个对象模型,我试图用Freemarker渲染到一个网页.其中一个对象有一个获取其内容子列表的方法 - 获取用于过滤列表的参数:
public List getunits(final String type);
我知道在JSP中你不能直接这样做,但是你可以编写自定义函数来实现你想要的结果.你如何在Freemarker中解决这个问题?编写自定义函数是一样的吗?或者有没有办法实际调用这种功能?