【问题标题】:Invoke Java method with parameters from Freemarker使用来自 Freemarker 的参数调用 Java 方法
【发布时间】:2012-05-16 05:29:25
【问题描述】:

以下 FTL 标记对我来说很好,并在我的服务器端 JiveActionSupport 对象中调用 getWidgets():

<#list widgets! as widget>
  -- do something with widget.sku
</#list>

但是,我确实需要一个依赖于小部件属性的内部列表,如下所示:

<#list widgets! as widget>
  <#list manufacturers(widget.sku)! as manufacturer>
  -- do something with manufacturer
  </#list>
</#list>

我尝试实现服务器端代码,如下:

public List<Manufacturer> getManufacturers(int sku);
public List<Manufacturer> getManufacturers(String sku);

但两者都导致“表达式制造商在第 123 行未定义”。

如何将参数传递给当前 JiveActionSupport 对象的方法?谢谢。

【问题讨论】:

  • 这听起来很复杂,您应该将其移出标记。确定控制器中的制造商列表(或任何调用模板的对象),并将该列表直接公开给模板。保持模板简单。
  • 是的,我当然可以让它变得更简单,但我仍然对如何在超出此范围的情况下调用带参数的方法感兴趣。 stackoverflow.com/questions/1362343 上的文章建议可以做到,但我无法获得最简单的带有 int 或 String 参数的示例。

标签: java freemarker


【解决方案1】:

这里可能让你感到困惑的是getFoo() 可以称为foo,但getFoo(param) 不能称为foo(param),只能称为getFoo(param)。但这正是 JavaBeans 的工作方式; getFoo() 定义了一个 JavaBean 属性,而 getFoo(params) 没有。

无论如何,如果getManufacturers 是数据模型(根)对象的方法,那么(假设正确的对象包装)您应该能够将其称为getManufacturers(param)。原则上不用action.开头。

【讨论】:

  • 谢谢,这很有帮助。我已经用 getManufacturers(string) 试过了,但这仍然会导致未定义的表达式错误。至少在我的情况下,它只有在我使用 action.getManufacturers(string) 时才有效。数据模型对象可能还有其他问题。此外,如果我对我的 Jive 安装进行 grep,我会在其 FTL 文件中发现很多对“action.getXYZ()”的引用,这表明它需要以 action 为前缀。至少在某些情况下也是如此。
  • 我们必须知道数据模型是如何构建的,或者它到底是什么。根据您所说,它可能与 action 对象不是同一个对象。
【解决方案2】:

一般来说,您似乎需要按如下方式执行此操作:

<#list action.getManufacturers("123")! as manufacturer>
  -- do something with manufacturer
</#list>

特别是,虽然您可以在 FTL 中使用 things 来调用服务器端方法 getThings(),但您需要使用 action.getThing(" 123") 调用服务器端方法getThing(String)

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 2023-03-12
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2023-03-23
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多