有时候想在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 >