有时候想在sitemesh中访问session的值,而sitemesh又是用freemarker引擎的,所以问题就是如何在Freemarker里面访问session的复杂类型值。如果是自己写的类,基本上在freemarker里面不能类型转换的。还好Freemarker对HashMap的支持还比较好。最后这样处理:
把hashMap保存到session:
Map<String, Boolean> values = new HashMap<String, Boolean>();
values.put("mykey11", true);
//..... handle values.........
session.setAttribute("mykey", values.size() == 0 ? null : values);
values.put("mykey11", true);
//..... handle values.........
session.setAttribute("mykey", values.size() == 0 ? null : values);
在Freemarker使用session:
<#assign v = Session["mykey"]?if_exists >
<#if v?? >
<#if v["mykey11"]?if_exists >
<ul>
<li>
xxx
</li>
</ul>
</#if>
</#if>
<#if v?? >
<#if v["mykey11"]?if_exists >
<ul>
<li>
xxx
</li>
</ul>
</#if>
</#if>
另外,在freemarker的ViewResolver里面要设置exposeSessionAttributes=true:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
</bean>
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="suffix" value=".ftl" />
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
</bean>