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,都显示为空。

参考技术A 同意楼上的解释,代码这样改就可以了:
<#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 【问题描述】:

我有一个设置会话属性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;

【问题讨论】:

【参考方案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 ;,但相同 你是怎么使用ftl的,你返回的是什么结果类型。发布struts.xml。你也可以试试$stack.findValue('#session.A') 我的结果类型不是 FTL,而是 jsp,我发送了电子邮件,并且该电子邮件模板是 FTL。我将会话值存储在值堆栈中,然后想在 FTL 模板中访问这些值。我有触发电子邮件类的操作类,在该电子邮件类中,我加载 FTL 模板并进行所需的处理,一旦发送电子邮件。一切正常,只是在 FTL 模板中我没有得到值。但是值在已配置 jsp 结果类型。 贴出你在做什么的代码,代码应该是一个独立的例子。你可以在那里访问一个值堆栈吗?【参考方案2】:

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

$session.getAttribute('A')

如果您在 Struts2 中使用 FreeMarker 模板,上述方法将起作用。

在您的情况下,您没有将会话映射设置为模型。将您的 rootMap 声明更改为 Map&lt;String, Object&gt; 并将会话映射放入其中。

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 表达式判空

freemarker中表达式 $(user.name)!""当user为空时,直接报错,咋回事?

freemarker 表达式为空报错 遍历list 判空

将 java.lang.Iterable 视为 Freemarker 中的 #list 表达式

如何在 Freemarker 中输出 $expression 而不会被解释?

你如何在 Freemarker 中转义正则表达式字符串