无法访问freemarker模板中的会话属性

时间:2014-06-10 16:24:12

标签: java email struts2 freemarker

我有一个操作类,用于设置会话属性AB。我知道价值观存在而且不是null

在Freemarker模板中,我试图通过使用以下表达式来获取这些值

<#if session.A?exists>
  ${session.A}
</#if>

<@s.property value="%{#session.A}" />

在获得以下错误时,

<#if session.A?exists> Expression session is undefined on line 39

据我所知,Freemarker Struts2,我们不需要做任何额外的设置,因为Freemarker的jar与Struts2捆绑在一起,我觉得Freemarker可以访问价值堆栈,但似乎我在这里弄错了。有人可以看看,看看我错过了什么?我在S2 2.15.3

下面是附加代码,在动作类中,我将值添加到会话对象

sessionMap.put("A", A);
        sessionMap.put("B", B);
        System.out.println("Inside loop test 2!");           
        String[] args = null;
        SendEmail.main(args);           
        return "success";

现在sendEmail类包含freemarker配置,

Configuration cfg = new Configuration();
            cfg.setClassForTemplateLoading(SendEmail.class, "");
            Template template = cfg.getTemplate("SendEmail.ftl");              
            Map<String,String> rootMap = new HashMap<>();
            Writer out = new StringWriter();
            try {
                template.process(rootMap, out);
            } catch (TemplateException | IOException templateException) {
                logger.error("Freemarker Template processing exception", templateException);
            }
            body.setContent(out.toString(), "text/html");
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(body);
            message.setContent(multipart, "text/html");
            Transport.send(message);

会话地图声明为

 private Map<String, Object> sessionMap;

3 个答案:

答案 0 :(得分:3)

变量名称在Freemarker中区分大小写,会话存储在Session(大写)下。 所以,你的代码应该是:

<#if Session.A?exists>
    ${Session.A}
</#if>

或(不推荐使用exists内置内容)

<#if Session.A??>
    ${Session.A}
</#if>

答案 1 :(得分:1)

由于HttpSession没有get方法,因此您需要使用其中提供的方法之一来操作会话。使用getAttribute方法获取会话值。

${session.getAttribute('A')}

如果您在Struts2中使用FreeMarker模板,则上述功能将起作用。

在您的情况下,您没有将会话映射设置为模型。将您的rootMap声明更改为Map<String, Object>并将会话地图添加到其中。

Map<String, Object> rootMap = new HashMap<String, Object>();
rootMap.put("session", sessionMap);

然后在模板中你可以这样称呼它:

${session['A']}

答案 2 :(得分:0)

freemarker中没有会话对象,您应该执行类似

的操作
<#assign session = stack.findValue('#session')/>

要执行的操作代码是

FreemarkerResult fr = new FreemarkerResult("SendEmail.ftl");
ActionContext.getContext().getContainer().inject(fr);
Writer out = new StringWriter();
fr.setWriter(out);
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("A", A);
session.put("B", B);
fr.execute(ActionContext.getContext().getActionInvocation());