如何使用自定义指令访问freemarker模板中的数据?

时间:2013-11-20 05:51:48

标签: java freemarker directive

我要求我要与freemaker一起实施,我已经知道freemarker是如何工作的,就像这样

template.process(dataMap,out);
dataMap包含我们用来填充模板的数据,当然所有数据都实现了TamplateModel接口,如果我们使用用户定义的指令没有区别,因为用户定义的指令实现了TemplateDirectiveModel,这个接口实现了TemplateModel,我需要做的是访问存储在会话中的数据,然后在我的指令中使用这些数据。就像这个<@authCheck> </@authCheck>一样,我的auth数据存储在会话中,所以我需要在我的指令中从会话中获取这些数据

ps:我使用springMVC和freemarker

2 个答案:

答案 0 :(得分:1)

模板的运行时环境由Environment对象表示,您也可以将其作为TemplateDirectiveModel - s的参数获取,或者可以使用静态方法Environment.getCurrentEnvironment()从TLS获取。您可以使用setCustomAttribute(String name, Object value)将其他对象(例如会话)附加到环境中,这样您的指令就可以通过env.getCustomAttribute(name)获取它。

每次Template.process调用都会在内部生成自己的Environment对象。要在调用主模板之前访问它,您必须执行此操作,而不是简单地调用Tempalte.process

Environment env = myTemplate.createProcessingEnvironment(root, out);
env.setCustoomAttribute("session", sesssion);
// You can addjust other environment settings here too.
env.process();  // template is called here to render the output

另一种可能性是将会话置于数据模型中。 TemplateDirective - s可以通过env.getDataModel()访问数据模型。

答案 1 :(得分:1)

注意:我的回答没有直接回答这个问题。

正如你所提到的,你使用Freemarker和Spring-MVC,我猜你也使用Spring-Security,如果没有,建议你这样做。

以下是我在Freemarker模板中使用Spring-Security taglib的方法。

<#macro auth expr>
 <#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
 <@security.authorize access=expr>
  <#nested>
 </@security.authorize>
</#macro>

以上的宏可以像:

一样使用
<#import "/mywebsitename/foomacro.ftl" as foo>
<@foo.auth "isAnonymous()">
 <a href="/signup">Signup</a>
</@foo.auth>

<@foo.auth "hasRole('ROLE_USER')">
 <a href="/profile">Profile</a>
</@foo.auth>

我也很高兴知道我方法的弱点,例如我们可以通过使用其他方法获得更好的性能吗?

例如,这个虚构的代码可能表现得更好吗?

<@foo.authCheck AUTH_OBJ_IN_SESSION "ROLE_USER">
 <a href = '/profile'>Profile</a>
</@foo.authCheck>

<#macro authCheck authObj role>
 <#if authObj.hasRole(role)>
  <#nested>
 </#if>
</#macro>

我自己的猜测是,它们没有太大区别,因为它们都使用来自用户会话的身份验证对象。那么为什么不使用Spring-Security的测试(即用型)taglib?

P.S。我通常在模板中访问SESSION变量,就像模型或请求变量一样,例如${VAR_IN_SESSION}。也许那是因为我在我的春季配置中设置了<property name="exposeSpringMacroHelpers" value="true"/>。我也有<property name="exposeSessionAttributes" value="false"/>,它似乎对不提供会话变量没有影响!