freemarker中表达式 $(user.name)!""当user为空时,直接报错,咋回事?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了freemarker中表达式 $(user.name)!""当user为空时,直接报错,咋回事?相关的知识,希望对你有一定的参考价值。
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,用FreeMarker判断对象是否为空的方法。
一般数据在后端判断, 前端不管逻辑只管显示。
freemarker中显示某对象使用$name.
但如果name为null,freemarker就会报错。如果需要判断对象是否为空:<#if name??>……</#if>。当然也可以通过设置默认值$name!""来避免对象为空的错误。如果name为空,就以默认值(“!”后的字符)显示。
对象user,name为user的属性,这时user,name都有可能为空,可以写成$(user.name)!"",表示user或者name为null,都显示为空。
<#if user??>
$(user.name)!""
</#if>追问
也是报错,原因不是你们想的这个,我报错是因为user找到了,但是不是正确的对象.....
参考技术B user为空不报错才怪呢??user对象存在的时候,你才能访问它的属性 啊,否则有什么意义追问
看来你没有用过freemarker
追答$(user.name)!"": 你的意思,user.name 为null的时候赋值为空字符串“”;
但是前提 user为空(在freemarker中空 被解释称 不存在),你一个不存在的东西,你还访问了它的name属性。
如果你觉得我说的有问题,请粘上异常信息,一起分析一下
$(user.name)!"" 请注意,是打了()的 也就是它会先判断user是不是为null 在判断user.name 是不是为null 而 $user.name!""才是你说的这种情形..... 我报错是因为user找到了,但是不是正确的对象.....
追答哦,那就是 user变量在你应用中设置重复了
本回答被提问者采纳无法访问 freemarker 模板中的会话属性
【中文标题】无法访问 freemarker 模板中的会话属性【英文标题】:Not able to access session attributes in freemarker templates 【发布时间】:2014-07-31 12:28:52 【问题描述】:我有一个设置会话属性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;
【问题讨论】:
【参考方案1】:freemarker 中没有 session 对象,你应该这样做
<#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());
【讨论】:
让我检查一下再回来 它不工作,我知道会话中有值,在我调用freemarker模板之前,我调用jsp并输出会话值,在那里我可以看到值,$A;$B ;struts.xml
。你也可以试试$stack.findValue('#session.A')
。
我的结果类型不是 FTL,而是 jsp,我发送了电子邮件,并且该电子邮件模板是 FTL。我将会话值存储在值堆栈中,然后想在 FTL 模板中访问这些值。我有触发电子邮件类的操作类,在该电子邮件类中,我加载 FTL 模板并进行所需的处理,一旦发送电子邮件。一切正常,只是在 FTL 模板中我没有得到值。但是值在已配置 jsp 结果类型。
贴出你在做什么的代码,代码应该是一个独立的例子。你可以在那里访问一个值堆栈吗?【参考方案2】:
由于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']
【讨论】:
没有 Aleksandra,它不起作用。第 38 行未定义表达式会话 有问题的指令: ---------- ==> $session.getAttribute('A') [在第 38 行,第 32 列中【参考方案3】:Freemarker 中的变量名区分大小写,会话存储在Session
(大写)下。
所以,你的代码应该是:
<#if Session.A?exists>
$Session.A
</#if>
或者(因为不推荐使用内置的exists
)
<#if Session.A??>
$Session.A
</#if>
【讨论】:
--freemarker.core.InvalidReferenceException: Expression Session is undefined on line 39以上是关于freemarker中表达式 $(user.name)!""当user为空时,直接报错,咋回事?的主要内容,如果未能解决你的问题,请参考以下文章
freemarker中表达式 $(user.name)!""当user为空时,直接报错,咋回事?
将 java.lang.Iterable 视为 Freemarker 中的 #list 表达式