我有一个操作类,用于设置会话属性A
和B
。我知道价值观存在而且不是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;
答案 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());